diff options
author | Pekka Vuorela <pekka.ta.vuorela@nokia.com> | 2011-11-15 15:09:55 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-21 22:45:36 +0100 |
commit | 7a0c0602685ddf0c5f15a8f3bd6ae8336cf9c858 (patch) | |
tree | 1d6a109c94d18f3d2e252cf67ea6d61230efd090 /src/gui/text/qlinecontrol.cpp | |
parent | 9eba201a48874c93f398c7c1c053b5ddbeda7712 (diff) |
Support input method tentative commit string in QLineControl
Implements similar behavior as 8bd40fef0733a4796a308b3bc137a05296e142c4
did for QLineEdit.
Change-Id: I55de1f9a6703aca629f2e84398e481636c96eeca
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/gui/text/qlinecontrol.cpp')
-rw-r--r-- | src/gui/text/qlinecontrol.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
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 |