summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraxis <qt-info@nokia.com>2009-05-29 13:09:18 (GMT)
committeraxis <qt-info@nokia.com>2009-06-03 11:16:21 (GMT)
commit7b95b70bc307288bd8ba2b84108f91fdea315826 (patch)
treebdb08d1c1887c61ce69078c0a0f470fb9a642d56
parent6989d6438e4fbc78dfbda7ac3326826a2301adaa (diff)
downloadQt-7b95b70bc307288bd8ba2b84108f91fdea315826.zip
Qt-7b95b70bc307288bd8ba2b84108f91fdea315826.tar.gz
Qt-7b95b70bc307288bd8ba2b84108f91fdea315826.tar.bz2
Made QLineEdit respect the new QInputMethodEvent::Selection.
RevBy: Simon Hausmann AutoTest: Will add in later commit
-rw-r--r--src/gui/widgets/qlineedit.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/gui/widgets/qlineedit.cpp b/src/gui/widgets/qlineedit.cpp
index 61b8786..c031098 100644
--- a/src/gui/widgets/qlineedit.cpp
+++ b/src/gui/widgets/qlineedit.cpp
@@ -2274,8 +2274,15 @@ void QLineEdit::inputMethodEvent(QInputMethodEvent *e)
}
#endif
- int priorState = d->undoState;
- d->removeSelectedText();
+ int priorState = 0;
+ bool isGettingInput = !e->commitString().isEmpty() || !e->preeditString().isEmpty();
+ bool cursorPositionChanged = false;
+
+ if (isGettingInput) {
+ // If any text is being input, remove selected text.
+ priorState = d->undoState;
+ d->removeSelectedText();
+ }
int c = d->cursor; // cursor position after insertion of commit string
if (e->replacementStart() <= 0)
@@ -2289,11 +2296,30 @@ void QLineEdit::inputMethodEvent(QInputMethodEvent *e)
d->selend = d->selstart + e->replacementLength();
d->removeSelectedText();
}
- if (!e->commitString().isEmpty())
+ if (!e->commitString().isEmpty()) {
d->insert(e->commitString());
+ cursorPositionChanged = true;
+ }
d->cursor = qMin(c, d->text.length());
+ for (int i = 0; i < e->attributes().size(); ++i) {
+ const QInputMethodEvent::Attribute &a = e->attributes().at(i);
+ if (a.type == QInputMethodEvent::Selection) {
+ d->cursor = qBound(0, a.start + a.length, d->text.length());
+ if (a.length) {
+ d->selstart = qMax(0, qMin(a.start, d->text.length()));
+ d->selend = d->cursor;
+ if (d->selend < d->selstart) {
+ qSwap(d->selstart, d->selend);
+ }
+ } else {
+ d->selstart = d->selend = 0;
+ }
+ cursorPositionChanged = true;
+ }
+ }
+
d->textLayout.setPreeditArea(d->cursor, e->preeditString());
d->preeditCursor = e->preeditString().length();
d->hideCursor = false;
@@ -2317,9 +2343,12 @@ void QLineEdit::inputMethodEvent(QInputMethodEvent *e)
d->textLayout.setAdditionalFormats(formats);
d->updateTextLayout();
update();
- if (!e->commitString().isEmpty())
+ if (cursorPositionChanged)
d->emitCursorPositionChanged();
- d->finishChange(priorState);
+
+ if (isGettingInput)
+ d->finishChange(priorState);
+
#ifndef QT_NO_COMPLETER
if (!e->commitString().isEmpty())
d->complete(Qt::Key_unknown);