summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Vuorela <pekka.ta.vuorela@nokia.com>2011-11-15 15:09:55 +0200
committerQt by Nokia <qt-info@nokia.com>2011-11-21 22:45:36 +0100
commit7a0c0602685ddf0c5f15a8f3bd6ae8336cf9c858 (patch)
tree1d6a109c94d18f3d2e252cf67ea6d61230efd090
parent9eba201a48874c93f398c7c1c053b5ddbeda7712 (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>
-rw-r--r--src/gui/text/qlinecontrol.cpp46
-rw-r--r--src/gui/text/qlinecontrol_p.h12
2 files changed, 49 insertions, 9 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
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;