diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2023-02-05 20:42:08 +0200 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2023-03-24 19:39:45 +0200 |
commit | c1c9d37a4f01c51558299318f38a0fb0fec83aa3 (patch) | |
tree | 5841cfe2d74fdb9c9171990cc8900b36bca91099 /src | |
parent | 43140ac27358c9cc285e464a1c1c7df813d2f942 (diff) |
Fix DesktopInputSelectionControl
Previously, the desktop selection handles were not functioning
correctly. They were displayed at the wrong location and were not
always appearing when needed. This issue has been resolved, ensuring
the selection handles are now working as intended.
Pick-to: 6.5
Change-Id: Ic546361285a88c06bf3d28cd545c2bda17ddadac
Reviewed-by: Inho Lee <inho.lee@qt.io>
Diffstat (limited to 'src')
4 files changed, 19 insertions, 4 deletions
diff --git a/src/virtualkeyboard/desktopinputselectioncontrol.cpp b/src/virtualkeyboard/desktopinputselectioncontrol.cpp index 1c99b583..0fc5d646 100644 --- a/src/virtualkeyboard/desktopinputselectioncontrol.cpp +++ b/src/virtualkeyboard/desktopinputselectioncontrol.cpp @@ -180,6 +180,8 @@ void DesktopInputSelectionControl::setEnabled(bool enable) connect(m_inputContext, &QVirtualKeyboardInputContext::cursorRectangleChanged, this, &DesktopInputSelectionControl::updateCursorHandlePosition); connect(m_inputContext, &QVirtualKeyboardInputContext::anchorRectIntersectsClipRectChanged, this, &DesktopInputSelectionControl::updateVisibility); connect(m_inputContext, &QVirtualKeyboardInputContext::cursorRectIntersectsClipRectChanged, this, &DesktopInputSelectionControl::updateVisibility); + updateAnchorHandlePosition(); + updateCursorHandlePosition(); if (focusWindow) focusWindow->installEventFilter(this); } else { @@ -230,8 +232,8 @@ bool DesktopInputSelectionControl::eventFilter(QObject *object, QEvent *event) for (int i = 0; i <= CursorHandle; ++i) { SelectionHandleInfo &h = handles[i]; - QPoint curHandleCenter = focusWindow->mapToGlobal(h.rect.center()); // ### map to desktoppanel - const QPoint delta = mousePos - curHandleCenter; + QPoint curHandleTopCenter = focusWindow->mapToGlobal(QPoint(h.rect.x() + qRound((qreal)h.rect.width() / 2), h.rect.top())); // ### map to desktoppanel + const QPoint delta = mousePos - curHandleTopCenter; h.delta = delta; h.squaredDistance = QPoint::dotProduct(delta, delta); } @@ -243,7 +245,7 @@ bool DesktopInputSelectionControl::eventFilter(QObject *object, QEvent *event) const QPoint windowPos = focusWindow->mapFromGlobal(mousePos); if (m_anchorHandleVisible && handles[closestHandle].rect.contains(windowPos)) { m_currentDragHandle = closestHandle; - m_distanceBetweenMouseAndCursor = handles[closestHandle].delta - QPoint(0, m_handleWindowSize.height()/2 + 4); + m_distanceBetweenMouseAndCursor = handles[closestHandle].delta; m_handleState = HandleIsHeld; m_handleDragStartedPosition = mousePos; const QRect otherRect = handles[1 - closestHandle].rect; diff --git a/src/virtualkeyboard/platforminputcontext.cpp b/src/virtualkeyboard/platforminputcontext.cpp index 85f4f212..ab3f3887 100644 --- a/src/virtualkeyboard/platforminputcontext.cpp +++ b/src/virtualkeyboard/platforminputcontext.cpp @@ -274,8 +274,10 @@ void PlatformInputContext::updateInputPanelVisible() m_inputPanel->show(); else m_inputPanel->hide(); - if (m_selectionControl) + if (m_selectionControl) { m_selectionControl->setEnabled(visible); + m_inputContext->priv()->updateSelectionControlVisible(visible); + } emitInputPanelVisibleChanged(); } } diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index 5b13fd45..4f865e68 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -619,4 +619,14 @@ int QVirtualKeyboardInputContextPrivate::findAttribute(const QList<QInputMethodE return -1; } +void QVirtualKeyboardInputContextPrivate::updateSelectionControlVisible(bool inputPanelVisible) +{ + Q_Q(QVirtualKeyboardInputContext); + bool newSelectionControlVisible = inputPanelVisible && (cursorPosition != anchorPosition) && !inputMethodHints.testFlag(Qt::ImhNoTextHandles); + if (selectionControlVisible != newSelectionControlVisible) { + selectionControlVisible = newSelectionControlVisible; + emit q->selectionControlVisibleChanged(); + } +} + QT_END_NAMESPACE diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index fd945a4f..36a3870e 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -128,6 +128,7 @@ private: 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; } + void updateSelectionControlVisible(bool inputPanelVisible); private: QVirtualKeyboardInputContext *q_ptr; |