void CGUIDialogKeyboardGeneric::UpdateLabel() // FIXME seems to be called twice for one USB SDL keyboard action/character { CGUILabelControl* pEdit = ((CGUILabelControl*)GetControl(CTL_LABEL_EDIT)); if (pEdit) { CStdStringW edit = m_strEdit; pEdit->SetHighlight(0, 0); pEdit->SetSelection(0, 0); if (m_hiddenInput) { // convert to *'s edit.Empty(); if (m_lastRemoteClickTime + REMOTE_SMS_DELAY > CTimeUtils::GetFrameTime() && m_iCursorPos > 0) { // using the remove to input, so display the last key input edit.append(m_iCursorPos - 1, L'*'); edit.append(1, m_strEdit[m_iCursorPos - 1]); } else edit.append(m_strEdit.size(), L'*'); } else if (!m_strEditing.IsEmpty()) { edit.Insert(m_iCursorPos, m_strEditing); pEdit->SetHighlight(m_iCursorPos, m_iCursorPos + m_strEditing.size()); if (m_iEditingLength > 0) pEdit->SetSelection(m_iCursorPos + m_iEditingOffset, m_iCursorPos + m_iEditingOffset + m_iEditingLength); } // convert back to utf8 CStdString utf8Edit; g_charsetConverter.wToUTF8(edit, utf8Edit); pEdit->SetLabel(utf8Edit); // Send off a search message unsigned int now = CTimeUtils::GetFrameTime(); // don't send until the REMOTE_SMS_DELAY has passed if (m_lastRemoteClickTime && m_lastRemoteClickTime + REMOTE_SMS_DELAY >= now) return; if (m_pCharCallback) { // do not send editing text comes from system input method if (!m_hiddenInput && !m_strEditing.IsEmpty()) g_charsetConverter.wToUTF8(m_strEdit, utf8Edit); m_pCharCallback(this, utf8Edit); } } }
void CGUIEditControl::ProcessText(unsigned int currentTime) { if (m_smsTimer.GetElapsedMilliseconds() > smsDelay) UpdateText(); if (m_bInvalidated) { m_label.SetMaxRect(m_posX, m_posY, m_width, m_height); m_label.SetText(m_info.GetLabel(GetParentID())); RecalcLabelPosition(); } bool changed = false; m_clipRect.x1 = m_label.GetRenderRect().x1; m_clipRect.x2 = m_clipRect.x1 + m_label.GetMaxWidth(); m_clipRect.y1 = m_posY; m_clipRect.y2 = m_posY + m_height; // start by rendering the normal text float leftTextWidth = m_label.GetRenderRect().Width(); if (leftTextWidth > 0) { // render the text on the left changed |= m_label.SetColor(GetTextColor()); changed |= m_label.Process(currentTime); m_clipRect.x1 += leftTextWidth + spaceWidth; } if (g_graphicsContext.SetClipRegion(m_clipRect.x1, m_clipRect.y1, m_clipRect.Width(), m_clipRect.Height())) { uint32_t align = m_label.GetLabelInfo().align & XBFONT_CENTER_Y; // start aligned left if (m_label2.GetTextWidth() < m_clipRect.Width()) { // align text as our text fits if (leftTextWidth > 0) { // right align as we have 2 labels align |= XBFONT_RIGHT; } else { // align by whatever the skinner requests align |= (m_label2.GetLabelInfo().align & 3); } } CStdStringW text = GetDisplayedText(); // add the cursor if we're focused if (HasFocus() && m_inputType != INPUT_TYPE_READONLY) { CStdStringW col; if ((m_focusCounter % 64) > 32) col = L"|"; else col = L"[COLOR 00FFFFFF]|[/COLOR]"; text.Insert(m_cursorPos, col); } changed |= m_label2.SetMaxRect(m_clipRect.x1 + m_textOffset, m_posY, m_clipRect.Width() - m_textOffset, m_height); if (text.IsEmpty()) changed |= m_label2.SetText(m_hintInfo.GetLabel(GetParentID())); else changed |= m_label2.SetTextW(text); changed |= m_label2.SetAlign(align); changed |= m_label2.SetColor(GetTextColor()); changed |= m_label2.SetOverflow(CGUILabel::OVER_FLOW_CLIP); changed |= m_label2.Process(currentTime); g_graphicsContext.RestoreClipRegion(); } if (changed) MarkDirtyRegion(); }
void CGUIEditControl::RenderText() { if (m_smsTimer.GetElapsedMilliseconds() > smsDelay) UpdateText(); if (m_bInvalidated) RecalcLabelPosition(); float leftTextWidth = m_textLayout.GetTextWidth(); float maxTextWidth = m_width - m_label.offsetX * 2; // start by rendering the normal text float posX = m_posX + m_label.offsetX; float posY = m_posY; uint32_t align = m_label.align & XBFONT_CENTER_Y; if (m_label.align & XBFONT_CENTER_Y) posY += m_height*0.5f; if (leftTextWidth > 0) { // render the text on the left if (IsDisabled()) m_textLayout.Render(posX, posY, m_label.angle, m_label.disabledColor, m_label.shadowColor, align, leftTextWidth, true); else if (HasFocus() && m_label.focusedColor) m_textLayout.Render(posX, posY, m_label.angle, m_label.focusedColor, m_label.shadowColor, align, leftTextWidth); else m_textLayout.Render(posX, posY, m_label.angle, m_label.textColor, m_label.shadowColor, align, leftTextWidth); posX += leftTextWidth + spaceWidth; maxTextWidth -= leftTextWidth + spaceWidth; } if (g_graphicsContext.SetClipRegion(posX, m_posY, maxTextWidth, m_height)) { if (m_textWidth < maxTextWidth) { // align text as our text fits if (leftTextWidth > 0) { // right align as we have 2 labels posX = m_posX + m_width - m_label.offsetX; align |= XBFONT_RIGHT; } else { // align by whatever the skinner requests if (m_label.align & XBFONT_CENTER_X) posX += 0.5f*maxTextWidth; if (m_label.align & XBFONT_RIGHT) posX += maxTextWidth; align |= (m_label.align & 3); } } CStdStringW text = GetDisplayedText(); // let's render it ourselves if (HasFocus() && !m_highlighted) { // cursor location assumes utf16 text, so deal with that (inefficient, but it's not as if it's a high-use area // virtual keyboard only) CStdStringW col; if ((SDL_GetTicks() % 800) <= 400) col.Format(L"|"); else col.Format(L" "); text.Insert(m_cursorPos, col); } m_textLayout2.SetText(text); if (m_highlighted && m_text2.size() > 0) { float highlightY = posY; if (m_label.align & XBFONT_CENTER_Y) highlightY -= m_textHeight * 0.5f; CRect rect(posX, highlightY, posX + m_textLayout2.GetTextWidth(), highlightY + m_textHeight); #if defined(HAS_GLES) CGUITextureGLES::DrawQuad(rect, (color_t) m_label.selectedBackColor); #elif defined(HAS_GL) CGUITextureGL::DrawQuad(rect, (color_t) m_label.selectedBackColor); #elif defined(HAS_DX) CGUITextureD3D::DrawQuad(rect, (color_t) m_label.selectedBackColor); #endif } if (IsDisabled()) m_textLayout2.Render(posX + m_textOffset, posY, m_label.angle, m_label.disabledColor, m_label.shadowColor, align, m_textWidth, true); else if (m_highlighted) m_textLayout2.Render(posX + m_textOffset, posY, m_label.angle, m_label.selectedColor, m_label.shadowColor, align, m_textWidth); else if (HasFocus() && m_label.focusedColor) m_textLayout2.Render(posX + m_textOffset, posY, m_label.angle, m_label.focusedColor, m_label.shadowColor, align, m_textWidth); else m_textLayout2.Render(posX + m_textOffset, posY, m_label.angle, m_label.textColor, m_label.shadowColor, align, m_textWidth); if (m_text2.size() == 0) { m_emptyLayout.Render(posX + 5, posY, m_emptyLabelInfo.angle, m_emptyLabelInfo.textColor, m_emptyLabelInfo.shadowColor, align, m_emptyLayout.GetTextWidth(), true); } g_graphicsContext.RestoreClipRegion(); } }