From ffd48e1ff75f03fb4d684eeb5a47a526cc1b0d47 Mon Sep 17 00:00:00 2001 From: Caroline Chao Date: Tue, 5 Mar 2013 11:04:26 +0100 Subject: [PATCH] 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 --- src/quick/items/qquicktextinput.cpp | 54 +++++++++++++++++--------------- src/quick/items/qquicktextinput_p.h | 2 +- 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 1c65c37..67664ad 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 602e9dc..e66d9b4 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 2b38097..57eff17 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 }; -- 1.7.2.5