From cf812cbae7113684ff221581889679f51d4f4956 Mon Sep 17 00:00:00 2001 From: Matt Aber Date: Thu, 18 Jan 2024 18:09:34 -0500 Subject: [PATCH 1/2] Feature: Ctrl+Shift+LeftClickDrag panning for non-pan tools Requested feature. Enable Ctrl+Shift+LeftClick Dragging to pan the remote view when using interaction modes other than ViewInteraction. Should close #933 --- ui/remoteviewwidget.cpp | 197 ++++++++++++++++++++++++---------------- 1 file changed, 121 insertions(+), 76 deletions(-) diff --git a/ui/remoteviewwidget.cpp b/ui/remoteviewwidget.cpp index efbdbe1b6e..08fc22c57d 100644 --- a/ui/remoteviewwidget.cpp +++ b/ui/remoteviewwidget.cpp @@ -1004,43 +1004,56 @@ void RemoteViewWidget::mousePressEvent(QMouseEvent *event) { m_currentMousePosition = mapToSource(QPointF(event->pos())); - switch (m_interactionMode) { - case NoInteraction: - break; - case ViewInteraction: + auto pan = [this, event]() { m_mouseDownPosition = event->pos() - QPoint(m_x, m_y); - if ((m_supportedInteractionModes & ElementPicking)) { - if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { - m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestAll); - } else if ((event->modifiers() & Qt::ControlModifier)) { - m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestBest); - } - } if (event->buttons() & Qt::LeftButton) setCursor(Qt::ClosedHandCursor); - break; - case Measuring: - if (event->buttons() & Qt::LeftButton) { - m_hasMeasurement = true; - m_measurementStartPosition = mapToSource(event->pos()); - m_measurementEndPosition = mapToSource(event->pos()); - update(); - } - break; - case ElementPicking: - if (event->buttons() & Qt::LeftButton) { - if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { - m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestAll); - } else { - m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestBest); + }; + + if (m_interactionMode != NoInteraction + && m_interactionMode != ViewInteraction + && event->buttons() & Qt::LeftButton + && event->modifiers() & Qt::ControlModifier + && event->modifiers() & Qt::ShiftModifier) { + + pan(); + } else { + switch (m_interactionMode) { + case NoInteraction: + break; + case ViewInteraction: + if ((m_supportedInteractionModes & ElementPicking)) { + if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { + m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestAll); + } else if ((event->modifiers() & Qt::ControlModifier)) { + m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestBest); + } + } + pan(); + break; + case Measuring: + if (event->buttons() & Qt::LeftButton) { + m_hasMeasurement = true; + m_measurementStartPosition = mapToSource(event->pos()); + m_measurementEndPosition = mapToSource(event->pos()); + update(); + } + break; + case ElementPicking: + if (event->buttons() & Qt::LeftButton) { + if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { + m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestAll); + } else { + m_interface->requestElementsAt(mapToSource(event->pos()), RemoteViewInterface::RequestBest); + } } + break; + case InputRedirection: + sendMouseEvent(event); + break; + case ColorPicking: + break; } - break; - case InputRedirection: - sendMouseEvent(event); - break; - case ColorPicking: - break; } QWidget::mousePressEvent(event); @@ -1050,22 +1063,29 @@ void RemoteViewWidget::mouseReleaseEvent(QMouseEvent *event) { m_currentMousePosition = mapToSource(QPointF(event->pos())); - switch (m_interactionMode) { - case NoInteraction: - case ElementPicking: - break; - case ViewInteraction: + if (m_interactionMode != NoInteraction + && m_interactionMode != ViewInteraction + && cursor() == Qt::ClosedHandCursor) { + setCursor(Qt::OpenHandCursor); - break; - case Measuring: - if (event->buttons() & Qt::LeftButton) - m_measurementEndPosition = mapToSource(event->pos()); - break; - case InputRedirection: - sendMouseEvent(event); - break; - case ColorPicking: - break; + } else { + switch (m_interactionMode) { + case NoInteraction: + case ElementPicking: + break; + case ViewInteraction: + setCursor(Qt::OpenHandCursor); + break; + case Measuring: + if (event->buttons() & Qt::LeftButton) + m_measurementEndPosition = mapToSource(event->pos()); + break; + case InputRedirection: + sendMouseEvent(event); + break; + case ColorPicking: + break; + } } QWidget::mouseReleaseEvent(event); @@ -1097,40 +1117,52 @@ void RemoteViewWidget::mouseMoveEvent(QMouseEvent *event) { m_currentMousePosition = mapToSource(QPointF(event->pos())); - switch (m_interactionMode) { - case NoInteraction: - case ElementPicking: - break; - case ViewInteraction: - if (event->buttons() != Qt::LeftButton) { - break; - } + auto pan = [this, event]() { m_x = event->x() - m_mouseDownPosition.x(); m_y = event->y() - m_mouseDownPosition.y(); clampPanPosition(); updateUserViewport(); - break; - case Measuring: - if (event->buttons() & Qt::LeftButton) { - m_measurementEndPosition = mapToSource(event->pos()); + }; + + if (m_interactionMode != NoInteraction + && event->buttons() & Qt::LeftButton + && event->modifiers() & Qt::ControlModifier + && event->modifiers() & Qt::ShiftModifier) { + + pan(); + } else { + switch (m_interactionMode) { + case NoInteraction: + case ElementPicking: + break; + case ViewInteraction: + if (event->buttons() != Qt::LeftButton) { + break; + } + pan(); + break; + case Measuring: + if (event->buttons() & Qt::LeftButton) { + m_measurementEndPosition = mapToSource(event->pos()); + } + break; + case InputRedirection: + sendMouseEvent(event); + break; + case ColorPicking: + // label should be always fully inside the remoteviewwidget + auto labelPosition = event->pos() + QPoint(4, 4); + // flip to top if it would stick out bottom end of remoteviewwidget + if ((labelPosition.y() + m_trailingColorLabel->height()) > this->height()) + labelPosition = labelPosition - QPoint(0, 8) - QPoint(0, m_trailingColorLabel->height()); + // flip to left if it would stick out right side of remoteviewwidget + if ((labelPosition.x() + m_trailingColorLabel->width()) > this->width()) + labelPosition = labelPosition - QPoint(8, 0) - QPoint(m_trailingColorLabel->width(), 0); + m_trailingColorLabel->move(labelPosition); + updatePickerVisibility(); + pickColor(); + break; } - break; - case InputRedirection: - sendMouseEvent(event); - break; - case ColorPicking: - // label should be always fully inside the remoteviewwidget - auto labelPosition = event->pos() + QPoint(4, 4); - // flip to top if it would stick out bottom end of remoteviewwidget - if ((labelPosition.y() + m_trailingColorLabel->height()) > this->height()) - labelPosition = labelPosition - QPoint(0, 8) - QPoint(0, m_trailingColorLabel->height()); - // flip to left if it would stick out right side of remoteviewwidget - if ((labelPosition.x() + m_trailingColorLabel->width()) > this->width()) - labelPosition = labelPosition - QPoint(8, 0) - QPoint(m_trailingColorLabel->width(), 0); - m_trailingColorLabel->move(labelPosition); - updatePickerVisibility(); - pickColor(); - break; } update(); } @@ -1178,6 +1210,12 @@ void RemoteViewWidget::wheelEvent(QWheelEvent *event) void RemoteViewWidget::keyPressEvent(QKeyEvent *event) { + if (m_interactionMode != NoInteraction + && m_interactionMode != ViewInteraction + && ((event->key() == Qt::Key_Control && event->modifiers() & Qt::ShiftModifier) + || (event->key() == Qt::Key_Shift && event->modifiers() & Qt::ControlModifier))) { + setCursor(Qt::OpenHandCursor); + } switch (m_interactionMode) { case NoInteraction: case ViewInteraction: @@ -1200,6 +1238,13 @@ void RemoteViewWidget::keyPressEvent(QKeyEvent *event) void RemoteViewWidget::keyReleaseEvent(QKeyEvent *event) { + if (m_interactionMode != NoInteraction + && m_interactionMode != ViewInteraction + && cursor() == Qt::OpenHandCursor + && ((event->key() == Qt::Key_Control && event->modifiers() & Qt::ShiftModifier) + || (event->key() == Qt::Key_Shift && event->modifiers() & Qt::ControlModifier))) { + setCursor(Qt::CrossCursor); + } switch (m_interactionMode) { case InputRedirection: sendKeyEvent(event); From 43c20dcdfcf67701f3ef521260e0385c0b9e5a82 Mon Sep 17 00:00:00 2001 From: Matt Aber Date: Mon, 22 Jan 2024 19:09:05 -0500 Subject: [PATCH 2/2] Switch from Ctrl+Shift for panning to just Ctrl --- ui/remoteviewwidget.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ui/remoteviewwidget.cpp b/ui/remoteviewwidget.cpp index 08fc22c57d..c60b433a93 100644 --- a/ui/remoteviewwidget.cpp +++ b/ui/remoteviewwidget.cpp @@ -1013,8 +1013,7 @@ void RemoteViewWidget::mousePressEvent(QMouseEvent *event) if (m_interactionMode != NoInteraction && m_interactionMode != ViewInteraction && event->buttons() & Qt::LeftButton - && event->modifiers() & Qt::ControlModifier - && event->modifiers() & Qt::ShiftModifier) { + && event->modifiers() & Qt::ControlModifier) { pan(); } else { @@ -1126,8 +1125,7 @@ void RemoteViewWidget::mouseMoveEvent(QMouseEvent *event) if (m_interactionMode != NoInteraction && event->buttons() & Qt::LeftButton - && event->modifiers() & Qt::ControlModifier - && event->modifiers() & Qt::ShiftModifier) { + && event->modifiers() & Qt::ControlModifier) { pan(); } else { @@ -1212,8 +1210,8 @@ void RemoteViewWidget::keyPressEvent(QKeyEvent *event) { if (m_interactionMode != NoInteraction && m_interactionMode != ViewInteraction - && ((event->key() == Qt::Key_Control && event->modifiers() & Qt::ShiftModifier) - || (event->key() == Qt::Key_Shift && event->modifiers() & Qt::ControlModifier))) { + && event->key() == Qt::Key_Control) { + setCursor(Qt::OpenHandCursor); } switch (m_interactionMode) { @@ -1241,8 +1239,8 @@ void RemoteViewWidget::keyReleaseEvent(QKeyEvent *event) if (m_interactionMode != NoInteraction && m_interactionMode != ViewInteraction && cursor() == Qt::OpenHandCursor - && ((event->key() == Qt::Key_Control && event->modifiers() & Qt::ShiftModifier) - || (event->key() == Qt::Key_Shift && event->modifiers() & Qt::ControlModifier))) { + && event->key() == Qt::Key_Control) { + setCursor(Qt::CrossCursor); } switch (m_interactionMode) {