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; }