diff options
author | Caroline Chao <caroline.chao@digia.com> | 2013-03-05 11:04:26 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-07 11:58:50 +0100 |
commit | ffd48e1ff75f03fb4d684eeb5a47a526cc1b0d47 (patch) | |
tree | c2d17387ff5c87096e1e003c8d5723386fb66f53 | |
parent | bd6ae5e5931b98b781847fd67f7c5b570b2b61c0 (diff) |
TextInput: Handle focus event directly
Use focusInEvent and focusOutEvent instead of changeItem
to handle focus event. (One benefit is the focus events
have the focus reason and changeItem doesn't).
Change-Id: I164820f375f0ffddc529d59565a3e448b84c6042
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 54 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 2 |
3 files changed, 31 insertions, 27 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 1c65c37516..67664add78 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -2477,40 +2477,44 @@ void QQuickTextInput::moveCursorSelection(int pos, SelectionMode mode) void QQuickTextInput::focusInEvent(QFocusEvent *event) { - Q_D(const QQuickTextInput); -#ifndef QT_NO_IM - if (d->focusOnPress && !d->m_readOnly) - qGuiApp->inputMethod()->show(); -#endif + Q_D(QQuickTextInput); + d->handleFocusEvent(event); QQuickImplicitSizeItem::focusInEvent(event); } -void QQuickTextInput::itemChange(ItemChange change, const ItemChangeData &value) +void QQuickTextInputPrivate::handleFocusEvent(QFocusEvent *event) { - Q_D(QQuickTextInput); - if (change == ItemActiveFocusHasChanged) { - bool hasFocus = value.boolValue; - setCursorVisible(hasFocus); - if (!hasFocus && (d->m_passwordEchoEditing || d->m_passwordEchoTimer.isActive())) { - d->updatePasswordEchoEditing(false);//QQuickTextInputPrivate sets it on key events, but doesn't deal with focus events - } - - if (!hasFocus) { - if (!d->persistentSelection) - d->deselect(); + Q_Q(QQuickTextInput); + bool focus = event->gotFocus(); + q->setCursorVisible(focus); + if (focus) { + q->q_updateAlignment(); #ifndef QT_NO_IM - disconnect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), - this, SLOT(q_updateAlignment())); + if (focusOnPress && !m_readOnly) + qGuiApp->inputMethod()->show(); + q->connect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + q, SLOT(q_updateAlignment())); #endif - } else { - q_updateAlignment(); + } else { + if ((m_passwordEchoEditing || m_passwordEchoTimer.isActive())) { + updatePasswordEchoEditing(false);//QQuickTextInputPrivate sets it on key events, but doesn't deal with focus events + } + + if (!persistentSelection) + deselect(); + #ifndef QT_NO_IM - connect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), - this, SLOT(q_updateAlignment())); + q->disconnect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + q, SLOT(q_updateAlignment())); #endif - } } - QQuickItem::itemChange(change, value); +} + +void QQuickTextInput::focusOutEvent(QFocusEvent *event) +{ + Q_D(QQuickTextInput); + d->handleFocusEvent(event); + QQuickImplicitSizeItem::focusOutEvent(event); } #ifndef QT_NO_IM diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index 602e9dc87b..e66d9b4964 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -332,9 +332,9 @@ protected: #endif void mouseUngrabEvent(); bool event(QEvent *e); + void focusOutEvent(QFocusEvent *event); void focusInEvent(QFocusEvent *event); void timerEvent(QTimerEvent *event); - virtual void itemChange(ItemChange, const ItemChangeData &); QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data); public Q_SLOTS: diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 2b3809799b..57eff175a2 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -158,7 +158,7 @@ public: #endif void hideCursor(); void showCursor(); - + void handleFocusEvent(QFocusEvent *event); struct MaskInputData { enum Casemode { NoCaseMode, Upper, Lower }; |