diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2018-08-23 18:02:36 +0300 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2018-08-28 07:55:48 +0000 |
commit | b253a3f14af12588966687d66cfa8829e3b1758f (patch) | |
tree | 03a29c96d239ad8a8a0ea7fd48c51d3f0ae7ae7e | |
parent | 84f96372584c37149fe6df751f937b61e3b7abe5 (diff) |
Use enum class in the input context private state flags
Rename enum QVirtualKeyboardInputContextPrivate::StateFlag to ::State
and use strongly typed enum.
Simplify the state handling with new class QVirtualKeyboardScopedState.
Change-Id: I124d53e7094e3b8056b7697d5e6f88d5e8b71b78
Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp | 12 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp | 51 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h | 45 |
3 files changed, 67 insertions, 41 deletions
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp index 4161f909..6b1b7819 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp @@ -222,11 +222,11 @@ void QVirtualKeyboardInputContext::sendKeyClick(int key, const QString &text, in QKeyEvent releaseEvent(QEvent::KeyRelease, key, Qt::KeyboardModifiers(modifiers), text); VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputContext::sendKeyClick():" << key; - d->stateFlags |= QVirtualKeyboardInputContextPrivate::KeyEventState; + d->setState(QVirtualKeyboardInputContextPrivate::State::KeyEvent); d->platformInputContext->sendKeyEvent(&pressEvent); d->platformInputContext->sendKeyEvent(&releaseEvent); if (d->activeKeys.isEmpty()) - d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState; + d->clearState(QVirtualKeyboardInputContextPrivate::State::KeyEvent); } else { qWarning() << "QVirtualKeyboardInputContext::sendKeyClick(): no focus to send key click" << key << text << "- QGuiApplication::focusWindow() is:" << QGuiApplication::focusWindow(); @@ -279,9 +279,7 @@ void QVirtualKeyboardInputContext::commit(const QString &text, int replaceFrom, d->preeditTextAttributes.clear(); QInputMethodEvent inputEvent(QString(), attributes); inputEvent.setCommitString(text, replaceFrom, replaceLength); - d->stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState; - d->platformInputContext->sendEvent(&inputEvent); - d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState; + d->sendInputMethodEvent(&inputEvent); } else { d->preeditText.clear(); d->preeditTextAttributes.clear(); @@ -312,9 +310,7 @@ void QVirtualKeyboardInputContext::clear() QList<QInputMethodEvent::Attribute> attributes; d->addSelectionAttribute(attributes); QInputMethodEvent event(QString(), attributes); - d->stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState; - d->platformInputContext->sendEvent(&event); - d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState; + d->sendInputMethodEvent(&event); } if (preeditChanged) diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index 9e55d121..529545c1 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -219,9 +219,9 @@ void QVirtualKeyboardInputContextPrivate::forceCursorPosition(int anchorPosition return; if (!platformInputContext->m_visible) return; - if (stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::ReselectEventState)) + if (testState(State::Reselect)) return; - if (stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::SyncShadowInputState)) + if (testState(State::SyncShadowInput)) return; VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputContextPrivate::forceCursorPosition():" << cursorPosition << "anchorPosition:" << anchorPosition; @@ -238,10 +238,9 @@ void QVirtualKeyboardInputContextPrivate::forceCursorPosition(int anchorPosition q->setPreeditText(QString()); if (!inputMethodHints.testFlag(Qt::ImhNoPredictiveText) && cursorPosition > 0 && selectedText.isEmpty()) { - stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState; + QVirtualKeyboardScopedState reselectState(this, State::Reselect); if (inputEngine->reselect(cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordAtCursor)) - stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodClickState; - stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState; + setState(State::InputMethodClick); } } } @@ -251,9 +250,9 @@ void QVirtualKeyboardInputContextPrivate::onInputItemChanged() if (!inputItem() && !activeKeys.isEmpty()) { // After losing keyboard focus it is impossible to track pressed keys activeKeys.clear(); - stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState; + clearState(State::KeyEvent); } - stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState; + clearState(State::InputMethodClick); } void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const QList<QInputMethodEvent::Attribute> &attributes, int replaceFrom, int replaceLength) @@ -272,9 +271,8 @@ void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const const bool replace = replaceFrom != 0 || replaceLength > 0; if (replace) event.setCommitString(QString(), replaceFrom, replaceLength); - stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState; - platformInputContext->sendEvent(&event); - stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState; + + sendInputMethodEvent(&event); // Send also to shadow input if only attributes changed. // In this case the update() may not be called, so the shadow @@ -297,6 +295,12 @@ void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const preeditTextAttributes.clear(); } +void QVirtualKeyboardInputContextPrivate::sendInputMethodEvent(QInputMethodEvent *event) +{ + QVirtualKeyboardScopedState inputMethodEventState(this, State::InputMethodEvent); + platformInputContext->sendEvent(event); +} + void QVirtualKeyboardInputContextPrivate::reset() { inputEngine->reset(); @@ -369,7 +373,7 @@ void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries) // update input engine if ((newSurroundingText || newCursorPosition) && - !stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::InputMethodEventState)) { + !testState(State::InputMethodEvent)) { commit(); } if (newInputMethodHints) { @@ -410,20 +414,18 @@ void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries) // word reselection if (newInputMethodHints || newSurroundingText || newSelectedText) - stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState; - if ((newSurroundingText || newCursorPosition) && !newSelectedText && (int)stateFlags == 0 && + clearState(State::InputMethodClick); + if ((newSurroundingText || newCursorPosition) && !newSelectedText && isEmptyState() && !inputMethodHints.testFlag(Qt::ImhNoPredictiveText) && cursorPosition > 0 && this->selectedText.isEmpty()) { - stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState; + QVirtualKeyboardScopedState reselectState(this, State::Reselect); if (inputEngine->reselect(cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordAtCursor)) - stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodClickState; - stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState; + setState(State::InputMethodClick); } - if (!stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::SyncShadowInputState)) { - stateFlags |= QVirtualKeyboardInputContextPrivate::SyncShadowInputState; + if (!testState(State::SyncShadowInput)) { + QVirtualKeyboardScopedState syncShadowInputState(this, State::SyncShadowInput); _shadow.update(queries); - stateFlags &= ~QVirtualKeyboardInputContextPrivate::SyncShadowInputState; } } @@ -431,22 +433,21 @@ void QVirtualKeyboardInputContextPrivate::invokeAction(QInputMethod::Action acti { switch (action) { case QInputMethod::Click: - if ((int)stateFlags == 0) { + if (isEmptyState()) { if (inputEngine->clickPreeditText(cursorPosition)) break; bool reselect = !inputMethodHints.testFlag(Qt::ImhNoPredictiveText) && selectedText.isEmpty() && cursorPosition < preeditText.length(); if (reselect) { - stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState; + QVirtualKeyboardScopedState reselectState(this, State::Reselect); _forceCursorPosition = this->cursorPosition + cursorPosition; commit(); inputEngine->reselect(this->cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordBeforeCursor); - stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState; } else if (!preeditText.isEmpty() && cursorPosition == preeditText.length()) { commit(); } } - stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState; + clearState(State::InputMethodClick); break; case QInputMethod::ContextMenu: @@ -467,9 +468,9 @@ bool QVirtualKeyboardInputContextPrivate::filterEvent(const QEvent *event) activeKeys -= keyEvent->nativeScanCode(); if (activeKeys.isEmpty()) - stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState; + clearState(State::KeyEvent); else - stateFlags |= QVirtualKeyboardInputContextPrivate::KeyEventState; + setState(State::KeyEvent); #ifdef QT_VIRTUALKEYBOARD_ARROW_KEY_NAVIGATION int key = keyEvent->key(); diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index 0b1772dc..c836e6c5 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -73,15 +73,15 @@ class QVIRTUALKEYBOARD_EXPORT QVirtualKeyboardInputContextPrivate : public QObje void init(); public: - enum StateFlag { - ReselectEventState = 0x1, - InputMethodEventState = 0x2, - KeyEventState = 0x4, - InputMethodClickState = 0x8, - SyncShadowInputState = 0x10 + enum class State { + Reselect = 0x1, + InputMethodEvent = 0x2, + KeyEvent = 0x4, + InputMethodClick = 0x8, + SyncShadowInput = 0x10 }; - Q_FLAG(StateFlag) - Q_DECLARE_FLAGS(StateFlags, StateFlag) + Q_FLAG(State) + Q_DECLARE_FLAGS(StateFlags, QVirtualKeyboardInputContextPrivate::State) ~QVirtualKeyboardInputContextPrivate(); @@ -123,6 +123,7 @@ private Q_SLOTS: private: void sendPreedit(const QString &text, const QList<QInputMethodEvent::Attribute> &attributes, int replaceFrom, int replaceLength); + void sendInputMethodEvent(QInputMethodEvent *event); void reset(); void commit(); void update(Qt::InputMethodQueries queries); @@ -131,6 +132,10 @@ private: void addSelectionAttribute(QList<QInputMethodEvent::Attribute> &attributes); bool testAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const; int findAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const; + inline void setState(const State &state) { stateFlags.setFlag(state); } + inline void clearState(const State &state) { stateFlags &= ~StateFlags(state); } + inline bool testState(const State &state) const { return stateFlags.testFlag(state); } + inline bool isEmptyState() const { return !stateFlags; } private: QVirtualKeyboardInputContext *q_ptr; @@ -164,10 +169,34 @@ private: QtVirtualKeyboard::ShadowInputContext _shadow; friend class QtVirtualKeyboard::PlatformInputContext; + friend class QVirtualKeyboardScopedState; +}; + +class QVirtualKeyboardScopedState +{ + Q_DISABLE_COPY(QVirtualKeyboardScopedState) +public: + QVirtualKeyboardScopedState(QVirtualKeyboardInputContextPrivate *d, QVirtualKeyboardInputContextPrivate::State state) : + d(d), + state(state) + { + d->setState(state); + } + + ~QVirtualKeyboardScopedState() + { + d->clearState(state); + } + +private: + QVirtualKeyboardInputContextPrivate *d; + QVirtualKeyboardInputContextPrivate::State state; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QVirtualKeyboardInputContextPrivate::StateFlags) QT_END_NAMESPACE +Q_DECLARE_METATYPE(QVirtualKeyboardInputContextPrivate::State) + #endif // QVIRTUALKEYBOARDINPUTCONTEXT_P_H |