From 7a0c0602685ddf0c5f15a8f3bd6ae8336cf9c858 Mon Sep 17 00:00:00 2001 From: Pekka Vuorela Date: Tue, 15 Nov 2011 15:09:55 +0200 Subject: Support input method tentative commit string in QLineControl Implements similar behavior as 8bd40fef0733a4796a308b3bc137a05296e142c4 did for QLineEdit. Change-Id: I55de1f9a6703aca629f2e84398e481636c96eeca Reviewed-by: Joona Petrell Reviewed-by: Lars Knoll --- src/gui/text/qlinecontrol.cpp | 46 ++++++++++++++++++++++++++++++++++++++++--- src/gui/text/qlinecontrol_p.h | 12 +++++------ 2 files changed, 49 insertions(+), 9 deletions(-) (limited to 'src/gui') diff --git a/src/gui/text/qlinecontrol.cpp b/src/gui/text/qlinecontrol.cpp index 7b7b2ac132..91a07d926e 100644 --- a/src/gui/text/qlinecontrol.cpp +++ b/src/gui/text/qlinecontrol.cpp @@ -347,6 +347,30 @@ QRect QLineControl::cursorRect() const return QRect(cix-5, 0, w+9, ch); } +QString QLineControl::text() const +{ + QString content = m_text; + if (!m_tentativeCommit.isEmpty()) + content.insert(m_cursor, m_tentativeCommit); + QString res = m_maskData ? stripString(content) : content; + return (res.isNull() ? QString::fromLatin1("") : res); +} + +// like text() but doesn't include preedit +QString QLineControl::realText() const +{ + QString res = m_maskData ? stripString(m_text) : m_text; + return (res.isNull() ? QString::fromLatin1("") : res); +} + +void QLineControl::setText(const QString &txt) +{ + if (composeMode()) + qApp->inputPanel()->reset(); + m_tentativeCommit.clear(); + internalSetText(txt, -1, false); +} + /*! \internal @@ -414,7 +438,7 @@ void QLineControl::moveCursor(int pos, bool mark) */ void QLineControl::processInputMethodEvent(QInputMethodEvent *event) { - int priorState = 0; + int priorState = -1; bool isGettingInput = !event->commitString().isEmpty() || event->preeditString() != preeditAreaText() || event->replacementLength() > 0; @@ -499,7 +523,15 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event) emitCursorPositionChanged(); else if (m_preeditCursor != oldPreeditCursor) emit updateMicroFocus(); - if (isGettingInput) + + bool tentativeCommitChanged = (m_tentativeCommit != event->tentativeCommitString()); + + if (tentativeCommitChanged) { + m_textDirty = true; + m_tentativeCommit = event->tentativeCommitString(); + } + + if (isGettingInput || tentativeCommitChanged) finishChange(priorState); if (selectionChange) @@ -598,7 +630,6 @@ bool QLineControl::finishChange(int validateFromState, bool update, bool edited) m_validInput = true; #ifndef QT_NO_VALIDATOR if (m_validator) { - m_validInput = false; QString textCopy = m_text; int cursorCopy = m_cursor; m_validInput = (m_validator->validate(textCopy, cursorCopy) != QValidator::Invalid); @@ -608,6 +639,15 @@ bool QLineControl::finishChange(int validateFromState, bool update, bool edited) return true; } m_cursor = cursorCopy; + + if (!m_tentativeCommit.isEmpty()) { + textCopy.insert(m_cursor, m_tentativeCommit); + bool validInput = (m_validator->validate(textCopy, cursorCopy) != QValidator::Invalid); + if (!validInput) + m_tentativeCommit.clear(); + } + } else { + m_tentativeCommit.clear(); } } #endif diff --git a/src/gui/text/qlinecontrol_p.h b/src/gui/text/qlinecontrol_p.h index e5435c22f6..7f5244ee07 100644 --- a/src/gui/text/qlinecontrol_p.h +++ b/src/gui/text/qlinecontrol_p.h @@ -61,6 +61,7 @@ #include "QtGui/qvalidator.h" #include "QtGui/qpalette.h" #include "QtGui/qguiapplication.h" +#include "QtGui/qinputpanel.h" #include "QtCore/qpoint.h" QT_BEGIN_HEADER @@ -205,12 +206,10 @@ public: bool isReadOnly() const { return m_readOnly; } void setReadOnly(bool enable) { m_readOnly = enable; } - QString text() const - { - QString res = m_maskData ? stripString(m_text) : m_text; - return (res.isNull() ? QString::fromLatin1("") : res); - } - void setText(const QString &txt) { internalSetText(txt, -1, false); } + QString text() const; + QString realText() const; + void setText(const QString &txt); + QString displayText() const { return m_textLayout.text(); } void backspace(); @@ -347,6 +346,7 @@ private: int m_cursor; int m_preeditCursor; int m_cursorWidth; + QString m_tentativeCommit; Qt::LayoutDirection m_layoutDirection; uint m_hideCursor : 1; // used to hide the m_cursor inside preedit areas uint m_separator : 1; -- cgit v1.2.3