示例#1
0
HRESULT CUIEdit::Display(int OffsetX, int OffsetY) {
	if (!m_Visible) return S_OK;


	// hack!
	TTextEncoding OrigEncoding = Game->m_TextEncoding;
	Game->m_TextEncoding = TEXT_ANSI;

	if (m_Back) m_Back->Display(OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height);
	if (m_Image) m_Image->Draw(OffsetX + m_PosX, OffsetY + m_PosY, NULL);

	// prepare fonts
	CBFont *font;
	CBFont *sfont;

	if (m_Font) font = m_Font;
	else font = Game->m_SystemFont;

	if (m_FontSelected) sfont = m_FontSelected;
	else sfont = font;

	bool focused = IsFocused();

	m_SelStart = MAX(m_SelStart, 0);
	m_SelEnd   = MAX(m_SelEnd, 0);

	m_SelStart = MIN(m_SelStart, strlen(m_Text));
	m_SelEnd   = MIN(m_SelEnd,   strlen(m_Text));

	//int CursorWidth = font->GetCharWidth(m_CursorChar[0]);
	int CursorWidth = font->GetTextWidth((byte  *)m_CursorChar);

	int s1, s2;
	bool CurFirst;
	// modify scroll offset
	if (m_SelStart >= m_SelEnd) {
		while (font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, std::max(0, m_SelEnd - m_ScrollOffset)) > m_Width - CursorWidth - 2 * m_FrameWidth) {
			m_ScrollOffset++;
			if (m_ScrollOffset >= strlen(m_Text)) break;
		}

		m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd);

		s1 = m_SelEnd;
		s2 = m_SelStart;
		CurFirst = true;
	} else {
		while (font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, std::max(0, m_SelStart - m_ScrollOffset)) +
		        sfont->GetTextWidth((byte  *)(m_Text + std::max(m_ScrollOffset, m_SelStart)), m_SelEnd - std::max(m_ScrollOffset, m_SelStart))

		        > m_Width - CursorWidth - 2 * m_FrameWidth) {
			m_ScrollOffset++;
			if (m_ScrollOffset >= strlen(m_Text)) break;
		}

		m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd);

		s1 = m_SelStart;
		s2 = m_SelEnd;
		CurFirst = false;
	}


	int AlignOffset = 0;

	for (int Count = 0; Count < 2; Count++) {
		// draw text
		int xxx, yyy, width, height;

		xxx = m_PosX + m_FrameWidth + OffsetX;
		yyy = m_PosY + m_FrameWidth + OffsetY;

		width = m_PosX + m_Width + OffsetX - m_FrameWidth;
		height = std::max(font->GetLetterHeight(), sfont->GetLetterHeight());

		if (Game->m_TextRTL) xxx += AlignOffset;

		TTextAlign Align = TAL_LEFT;


		// unselected 1
		if (s1 > m_ScrollOffset) {
			if (Count) font->DrawText((byte  *)m_Text + m_ScrollOffset, xxx, yyy, width - xxx, Align, height, s1 - m_ScrollOffset);
			xxx += font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset);
			AlignOffset += font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset);
		}

		// cursor
		if (focused && CurFirst) {
			if (Count) {
				if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) {
					m_LastBlinkTime = CBPlatform::GetTime();
					m_CursorVisible = !m_CursorVisible;
				}
				if (m_CursorVisible)
					font->DrawText((byte  *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1);
			}
			xxx += CursorWidth;
			AlignOffset += CursorWidth;
		}

		// selected
		int s3 = std::max(s1, m_ScrollOffset);

		if (s2 - s3 > 0) {
			if (Count) sfont->DrawText((byte  *)m_Text + s3, xxx, yyy, width - xxx, Align, height, s2 - s3);
			xxx += sfont->GetTextWidth((byte  *)m_Text + s3, s2 - s3);
			AlignOffset += sfont->GetTextWidth((byte  *)m_Text + s3, s2 - s3);
		}

		// cursor
		if (focused && !CurFirst) {
			if (Count) {
				if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) {
					m_LastBlinkTime = CBPlatform::GetTime();
					m_CursorVisible = !m_CursorVisible;
				}
				if (m_CursorVisible)
					font->DrawText((byte  *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1);
			}
			xxx += CursorWidth;
			AlignOffset += CursorWidth;
		}

		// unselected 2
		if (Count) font->DrawText((byte  *)m_Text + s2, xxx, yyy, width - xxx, Align, height);
		AlignOffset += font->GetTextWidth((byte  *)m_Text + s2);

		AlignOffset = (m_Width - 2 * m_FrameWidth) - AlignOffset;
		if (AlignOffset < 0) AlignOffset = 0;
	}


	Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height, 100, 100, false));


	Game->m_TextEncoding = OrigEncoding;

	return S_OK;
}