diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index c7ee1c4514..3c5910b622 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -113,6 +113,7 @@ public: bool addView(const App::DocumentObject *obj); static MDIViewPage *getFromScene(const QGSPage *scene); + void contextMenuEvent(QContextMenuEvent *event); public Q_SLOTS: void viewAll(); @@ -133,7 +134,6 @@ protected: /// Attaches view of obj to m_scene. Returns true on success, false otherwise bool attachView(App::DocumentObject *obj); - void contextMenuEvent(QContextMenuEvent *event); void closeEvent(QCloseEvent*); void setDimensionGroups(void); diff --git a/src/Mod/TechDraw/Gui/QGVNavStyle.cpp b/src/Mod/TechDraw/Gui/QGVNavStyle.cpp index 7a3d4ca13a..de31576e05 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyle.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyle.cpp @@ -23,6 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ #include +#include #include #include #endif @@ -43,7 +44,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyle::QGVNavStyle() : m_viewer(nullptr) +QGVNavStyle::QGVNavStyle(QGVPage *qgvp) : + m_viewer(qgvp) { initialize(); } @@ -78,6 +80,7 @@ void QGVNavStyle::initialize() m_panPending = false; m_zoomPending = false; m_clickButton = Qt::NoButton; + m_saveCursor = getViewer()->cursor(); } void QGVNavStyle::setAnchor() @@ -214,7 +217,7 @@ void QGVNavStyle::handleLeaveEvent(QEvent *event) void QGVNavStyle::handleMousePressEvent(QMouseEvent *event) { // Base::Console().Message("QGVNS::handleMousePressEvent()\n"); - if (!panningActive && (event->button() == Qt::MiddleButton)) { + if (!panningActive && (event->button() == Qt::MiddleButton)) { startPan(event->pos()); event->accept(); } @@ -233,8 +236,11 @@ void QGVNavStyle::handleMouseMoveEvent(QMouseEvent *event) } } +//NOTE: QGraphicsView::contextMenuEvent consumes the mouse release event for the +//button that caused the event (typically RMB) void QGVNavStyle::handleMouseReleaseEvent(QMouseEvent *event) { +// Base::Console().Message("QGVNS::handleMouseReleaseEvent()\n"); if (getViewer()->isBalloonPlacing()) { placeBalloon(event->pos()); } @@ -245,6 +251,21 @@ void QGVNavStyle::handleMouseReleaseEvent(QMouseEvent *event) } } +bool QGVNavStyle::allowContextMenu(QContextMenuEvent *event) +{ + Q_UNUSED(event) +// Base::Console().Message("QGVNS::allowContextMenu()\n"); +// if (event->reason() == QContextMenuEvent::Mouse) { +// //must check for a button combination involving context menu button +// } + return true; +} + +void QGVNavStyle::pseudoContextEvent() +{ + getViewer()->pseudoContextEvent(); +} + void QGVNavStyle::handleWheelEvent(QWheelEvent *event) { //Delta is the distance that the wheel is rotated, in eighths of a degree. @@ -273,6 +294,7 @@ void QGVNavStyle::zoom(double factor) QPoint newCenter = getViewer()->viewport()->rect().center(); QPoint change = newCenter - center; getViewer()->translate(change.x(), change.y()); + m_zoomPending = false; } void QGVNavStyle::startZoom(QPoint p) @@ -280,11 +302,20 @@ void QGVNavStyle::startZoom(QPoint p) // Base::Console().Message("QGVNS::startZoom(%s)\n", TechDraw::DrawUtil::formatVector(p).c_str()); zoomOrigin = p; zoomingActive = true; + m_zoomPending = false; + getViewer()->setZoomCursor(); +} + +void QGVNavStyle::stopZoom() +{ +// Base::Console().Message("QGVNS::stopZoom()\n"); + zoomingActive = false; + m_zoomPending = false; + getViewer()->resetCursor(); } double QGVNavStyle::mouseZoomFactor(QPoint p) { - // Base::Console().Message("QGVNS::mouseZoomFactor(%s)\n", TechDraw::DrawUtil::formatVector(p).c_str()); QPoint movement = p - zoomOrigin; double sensitivity = 0.1; @@ -305,8 +336,8 @@ void QGVNavStyle::startPan(QPoint p) { panOrigin = p; panningActive = true; - QApplication::setOverrideCursor(Qt::SizeAllCursor); - + m_panPending = false; + getViewer()->setPanCursor(); } void QGVNavStyle::pan(QPoint p) @@ -323,8 +354,10 @@ void QGVNavStyle::pan(QPoint p) void QGVNavStyle::stopPan() { - QApplication::restoreOverrideCursor(); +// Base::Console().Message("QGVNS::stopPan()\n"); panningActive = false; + m_panPending = false; + getViewer()->resetCursor(); } void QGVNavStyle::startClick(Qt::MouseButton b) diff --git a/src/Mod/TechDraw/Gui/QGVNavStyle.h b/src/Mod/TechDraw/Gui/QGVNavStyle.h index 3623d5ccd9..a64c43e829 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyle.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyle.h @@ -26,13 +26,14 @@ #define TECHDRAW_NAVIGATIONSTYLE_H #include +#include class QEvent; class QFocusEvent; class QKeyEvent; class QMouseEvent; class QWheelEvent; - +class QContextMenuEvent; #include namespace TechDrawGui { @@ -60,7 +61,7 @@ private: class TechDrawGuiExport QGVNavStyle : public Base::BaseClass { public: - QGVNavStyle(); + QGVNavStyle(QGVPage* qgvp); virtual ~QGVNavStyle(); void setViewer(QGVPage* qgvp) { m_viewer = qgvp;} ; @@ -76,11 +77,13 @@ public: virtual void handleMouseReleaseEvent(QMouseEvent *event); virtual void handleWheelEvent(QWheelEvent *event); - virtual bool allowContextMenu() {return true;}; + virtual bool allowContextMenu(QContextMenuEvent *event); + virtual void pseudoContextEvent(); - virtual void zoom(double factor); - virtual double mouseZoomFactor(QPoint p); virtual void startZoom(QPoint p); + virtual void zoom(double factor); + virtual void stopZoom(); + virtual double mouseZoomFactor(QPoint p); virtual void startPan(QPoint p); virtual void pan(QPoint p); @@ -114,6 +117,7 @@ protected: Qt::MouseButton m_clickButton; KeyCombination m_keyCombo; + QCursor m_saveCursor; private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleBlender.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleBlender.cpp index 518e9de84e..24c14c0a34 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleBlender.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleBlender.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleBlender::QGVNavStyleBlender() +QGVNavStyleBlender::QGVNavStyleBlender(QGVPage* qgvp) : + QGVNavStyle(qgvp) { } @@ -52,39 +53,51 @@ void QGVNavStyleBlender::handleKeyReleaseEvent(QKeyEvent *event) void QGVNavStyleBlender::handleMousePressEvent(QMouseEvent *event) { - if (event->buttons() == (Qt::LeftButton | Qt::RightButton)) { - //pan mode 1 - LMB + RMB + mouse move - startPan(event->pos()); - event->accept(); - } else if ((event->button() == Qt::MiddleButton) && - QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) { - //pan mode 2 - Shift + MMB - startPan(event->pos()); - event->accept(); - } + Q_UNUSED(event) +// Base::Console().Message("QGVNSBlender::handleMousePressEvent() - button: %d buttons: %d\n", event->button(), event->buttons()); } void QGVNavStyleBlender::handleMouseMoveEvent(QMouseEvent *event) { +// Base::Console().Message("QGVNSBlender::handleMouseMoveEvent() - buttons: %d modifiers: %X\n", +// QGuiApplication::mouseButtons() & Qt::MiddleButton, +// QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)); + if (getViewer()->isBalloonPlacing()) { getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + if ((QGuiApplication::mouseButtons() & Qt::LeftButton) && + (QGuiApplication::mouseButtons() & Qt::RightButton)) { + //pan mode 1 - LMB + RMB + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } + event->accept(); + } else if ((QGuiApplication::mouseButtons() & Qt::MiddleButton) && + (QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) ) { + //pan mode 2 - Shift + MMB + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } } void QGVNavStyleBlender::handleMouseReleaseEvent(QMouseEvent *event) { +// Base::Console().Message("QGVNSBlender::handleMouseReleaseEvent() - button: %d buttons: %d\n", event->button(), event->buttons()); if (getViewer()->isBalloonPlacing()) { placeBalloon(event->pos()); } if (panningActive) { //pan mode 1 - LMB + RMB + mouse move - //stop panning if either button release + //stop panning if either button released if ( (event->button() == Qt::LeftButton) || (event->button() == Qt::RightButton)) { stopPan(); @@ -98,4 +111,18 @@ void QGVNavStyleBlender::handleMouseReleaseEvent(QMouseEvent *event) } } } + +bool QGVNavStyleBlender::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSBlender::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QGuiApplication::mouseButtons() & Qt::LeftButton) { + //LeftButton is down, so this is LMB + RMB - don't allow context menu + return false; + } + } + return true; +} + } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleBlender.h b/src/Mod/TechDraw/Gui/QGVNavStyleBlender.h index ac67a9a86e..8551166727 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleBlender.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleBlender.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleBlender : public QGVNavStyle { public: - QGVNavStyleBlender(); + QGVNavStyleBlender(QGVPage* qgvp); virtual ~QGVNavStyleBlender(); virtual void handleKeyReleaseEvent(QKeyEvent *event) override; @@ -44,7 +44,7 @@ public: virtual void handleMouseReleaseEvent(QMouseEvent *event) override; //context menu (RMB) prevents pan mode 2 (LMB + RMB) - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleCAD.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleCAD.cpp index 6664775977..d01c3771f9 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleCAD.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleCAD.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleCAD::QGVNavStyleCAD() +QGVNavStyleCAD::QGVNavStyleCAD(QGVPage* qgvp) : + QGVNavStyle(qgvp) { } @@ -47,7 +48,7 @@ void QGVNavStyleCAD::handleKeyReleaseEvent(QKeyEvent *event) //zoom mode 2 if ( ((event->key() == Qt::Key_Control) || (event->key() == Qt::Key_Shift)) && zoomingActive) { - zoomingActive = false; + stopZoom(); event->accept(); } @@ -60,25 +61,21 @@ void QGVNavStyleCAD::handleKeyReleaseEvent(QKeyEvent *event) void QGVNavStyleCAD::handleMousePressEvent(QMouseEvent *event) { - //pan mode 1 hold MMB + mouse movement +// Base::Console().Message("QGVNSCAD::handleMousePressEvent() - button: %d\n", event->button()); if (event->button() == Qt::MiddleButton) { startClick(Qt::MiddleButton); //for MMB center view - startPan(event->pos()); - event->accept(); } //zoom mode 2 Control + Shift + RMB click if ((event->button() == Qt::RightButton) && QApplication::keyboardModifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { startClick(Qt::RightButton); - event->accept(); } //pan mode 2 Control + RMB click if ((event->button() == Qt::RightButton) && QApplication::keyboardModifiers() == Qt::ControlModifier) { startClick(Qt::RightButton); - event->accept(); } } @@ -91,23 +88,48 @@ void QGVNavStyleCAD::handleMouseMoveEvent(QMouseEvent *event) //if the mouse moves between press and release, then it isn't a click if (m_clickPending) { stopClick(); - event->accept(); return; } - if (panningActive) { + //pan mode 1 - MMB + move + if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + if (panningActive) { + pan(event->pos()); + event->accept(); + } else { + startPan(event->pos()); + event->accept(); + } + } + + //pan mode 2 - CNTL + RMB click + move + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + panningActive) { pan(event->pos()); event->accept(); + } else if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + m_panPending) { + startPan(event->pos()); + event->accept(); } - if (zoomingActive) { + //zoom mode 2 - CNTL + SHIFT + RMB click + move + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) && + zoomingActive) { zoom(mouseZoomFactor(event->pos())); event->accept(); + } else if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) && + m_zoomPending) { + startZoom(event->pos()); + event->accept(); } } void QGVNavStyleCAD::handleMouseReleaseEvent(QMouseEvent *event) { +// Base::Console().Message("QGVNSCAD::handleMouseReleaseEvent() - button: %d\n", event->button()); if (getViewer()->isBalloonPlacing()) { placeBalloon(event->pos()); } @@ -127,24 +149,40 @@ void QGVNavStyleCAD::handleMouseReleaseEvent(QMouseEvent *event) //zoom mode 2 Control + Shift + RMB click if ((event->button() == Qt::RightButton) && - QApplication::keyboardModifiers() == (Qt::ControlModifier | Qt::ShiftModifier) && - m_clickPending) { + QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) && + m_clickPending && + (m_clickButton == Qt::RightButton)) { stopClick(); - startZoom(event->pos()); + m_zoomPending = true; event->accept(); return; } //pan mode 2 starts with Control + RMB click if ((event->button() == Qt::RightButton) && - QApplication::keyboardModifiers() == (Qt::ControlModifier) && - m_clickPending) { + QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + m_clickPending && + (m_clickButton == Qt::RightButton)) { stopClick(); - startPan(event->pos()); + m_panPending = true; event->accept(); } +} - +bool QGVNavStyleCAD::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSCAD::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) || + (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) ) { + //CNTL or CNTL+Shift down - don't allow context menu + return false; + } + } + return true; } } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleCAD.h b/src/Mod/TechDraw/Gui/QGVNavStyleCAD.h index d347697bdc..94bccfb2f9 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleCAD.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleCAD.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleCAD : public QGVNavStyle { public: - QGVNavStyleCAD(); + QGVNavStyleCAD(QGVPage* qgvp); virtual ~QGVNavStyleCAD(); virtual void handleKeyReleaseEvent(QKeyEvent *event) override; @@ -44,7 +44,7 @@ public: virtual void handleMouseReleaseEvent(QMouseEvent *event) override; //context menu (RMB) prevents pan mode 2 (LMB + RMB) - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleGesture.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleGesture.cpp index 8f8dde60a2..5d75960c5a 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleGesture.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleGesture.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleGesture::QGVNavStyleGesture() +QGVNavStyleGesture::QGVNavStyleGesture(QGVPage* qgvp) : + QGVNavStyle(qgvp) { } @@ -45,10 +46,8 @@ QGVNavStyleGesture::~QGVNavStyleGesture() void QGVNavStyleGesture::handleMousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { - startPan(event->pos()); - event->accept(); + startClick(Qt::RightButton); } - } void QGVNavStyleGesture::handleMouseMoveEvent(QMouseEvent *event) @@ -57,8 +56,19 @@ void QGVNavStyleGesture::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //if the mouse moves between press and release, then it isn't a click + if (m_clickPending) { + stopClick(); + return; + } + + if (QGuiApplication::mouseButtons() & Qt::RightButton) { + //pan mode 1 - RMB + move + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } } @@ -69,10 +79,28 @@ void QGVNavStyleGesture::handleMouseReleaseEvent(QMouseEvent *event) placeBalloon(event->pos()); } + if ((event->button() == Qt::RightButton) && + m_clickPending && + (m_clickButton == Qt::RightButton)) { + stopClick(); + pseudoContextEvent(); + event->accept(); + return; + } + if (event->button() == Qt::RightButton) { stopPan(); event->accept(); } } +//RMB for pan conflicts with RMB for context menu +bool QGVNavStyleGesture::allowContextMenu(QContextMenuEvent *event) +{ + if (event->reason() == QContextMenuEvent::Mouse) { + return false; + } + return true; +} + } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleGesture.h b/src/Mod/TechDraw/Gui/QGVNavStyleGesture.h index fa27b82765..cea5684aba 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleGesture.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleGesture.h @@ -35,14 +35,14 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleGesture : public QGVNavStyle { public: - QGVNavStyleGesture(); + QGVNavStyleGesture(QGVPage* qgvp); virtual ~QGVNavStyleGesture(); virtual void handleMousePressEvent(QMouseEvent *event) override; virtual void handleMouseMoveEvent(QMouseEvent *event) override; virtual void handleMouseReleaseEvent(QMouseEvent *event) override; - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleInventor.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleInventor.cpp index 7830c56312..5be8915bec 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleInventor.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleInventor.cpp @@ -41,7 +41,8 @@ namespace TechDrawGui { // QGraphicsView? //********** -QGVNavStyleInventor::QGVNavStyleInventor() +QGVNavStyleInventor::QGVNavStyleInventor(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -51,15 +52,7 @@ QGVNavStyleInventor::~QGVNavStyleInventor() void QGVNavStyleInventor::handleMousePressEvent(QMouseEvent *event) { - if (event->buttons() == (Qt::LeftButton | Qt::MiddleButton)) { - //zoom mode 2 LMB + MMB - startZoom(event->pos()); - event->accept(); - } else if (event->button() == Qt::MiddleButton) { - //pan mode MMB + mouse movement - startPan(event->pos()); - event->accept(); - } + Q_UNUSED(event) } void QGVNavStyleInventor::handleMouseMoveEvent(QMouseEvent *event) @@ -68,13 +61,22 @@ void QGVNavStyleInventor::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + if ((QGuiApplication::mouseButtons() & Qt::LeftButton) && + (QGuiApplication::mouseButtons() & Qt::MiddleButton)) { + //zoom mode 2 - LMB + MMB + if (zoomingActive) { + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } event->accept(); - } - - if (zoomingActive) { - zoom(mouseZoomFactor(event->pos())); + } else if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + //pan mode - MMB + move + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } } diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleInventor.h b/src/Mod/TechDraw/Gui/QGVNavStyleInventor.h index 0f2a74cc5f..e0219d006a 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleInventor.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleInventor.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleInventor : public QGVNavStyle { public: - QGVNavStyleInventor(); + QGVNavStyleInventor(QGVPage* qgvp); virtual ~QGVNavStyleInventor(); virtual void handleMousePressEvent(QMouseEvent *event) override; diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleMaya.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleMaya.cpp index 3287e30de3..880808baf9 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleMaya.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleMaya.cpp @@ -34,14 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -//****** -// Issue: on linux mint, ALT + mouse button doesn't get to the application. -// system eats the event for menus, accessibility magnifier, etc. -// only wheel zoom is known to work. -// need to test in different environment. -//****** - -QGVNavStyleMaya::QGVNavStyleMaya() +QGVNavStyleMaya::QGVNavStyleMaya(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -65,19 +59,7 @@ void QGVNavStyleMaya::handleKeyReleaseEvent(QKeyEvent *event) } void QGVNavStyleMaya::handleMousePressEvent(QMouseEvent *event) { - //pan mode alt + MMB + mouse movement - if ((event->button() == Qt::MiddleButton) && - (QApplication::keyboardModifiers() == Qt::AltModifier)) { - startPan(event->pos()); - event->accept(); - } - - //zoom mode 2 ALT + RMB - if ((event->button() == Qt::RightButton) && - (QApplication::keyboardModifiers() == Qt::AltModifier)) { - startZoom(event->pos()); - event->accept(); - } + Q_UNUSED(event) } void QGVNavStyleMaya::handleMouseMoveEvent(QMouseEvent *event) @@ -86,13 +68,25 @@ void QGVNavStyleMaya::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //pan mode alt + MMB + mouse movement + if (QGuiApplication::mouseButtons() & Qt::MiddleButton && + QApplication::keyboardModifiers().testFlag(Qt::AltModifier)) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } - if (zoomingActive) { - zoom(mouseZoomFactor(event->pos())); + //zoom mode 2 ALT + RMB + if (QGuiApplication::mouseButtons() & Qt::RightButton && + QApplication::keyboardModifiers().testFlag(Qt::AltModifier)) { + if (zoomingActive) { + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } event->accept(); } } @@ -120,4 +114,16 @@ void QGVNavStyleMaya::handleMouseReleaseEvent(QMouseEvent *event) } } +bool QGVNavStyleMaya::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSM::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QApplication::keyboardModifiers() == Qt::AltModifier) { + //Alt is down, so this is Alt + RMB - don't allow context menu + return false; + } + } + return true; +} } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleMaya.h b/src/Mod/TechDraw/Gui/QGVNavStyleMaya.h index 4e60c44650..58dddc72fe 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleMaya.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleMaya.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleMaya : public QGVNavStyle { public: - QGVNavStyleMaya(); + QGVNavStyleMaya(QGVPage* qgvp); virtual ~QGVNavStyleMaya(); virtual void handleKeyReleaseEvent(QKeyEvent *event) override; @@ -43,8 +43,7 @@ public: virtual void handleMouseMoveEvent(QMouseEvent *event) override; virtual void handleMouseReleaseEvent(QMouseEvent *event) override; - //context menu (RMB) prevents zoom mode 2 (ALT + RMB) - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleOCC.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleOCC.cpp index 4777b374cd..aa0dedbb30 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleOCC.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleOCC.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleOCC::QGVNavStyleOCC() +QGVNavStyleOCC::QGVNavStyleOCC(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -46,40 +47,58 @@ void QGVNavStyleOCC::handleKeyReleaseEvent(QKeyEvent *event) { //zoom mode 2 if ( (event->key() == Qt::Key_Control) && zoomingActive) { - zoomingActive = false; - event->accept(); - } -} -void QGVNavStyleOCC::handleMousePressEvent(QMouseEvent *event) -{ - //pan mode MMB + mouse movement - //also Control + MMB + mouse movement, but this is redundant for our purposes - if (event->button() == Qt::MiddleButton) { - startPan(event->pos()); + stopZoom(); event->accept(); } - //zoom mode 2 Control + LMB - if ((event->button() == Qt::LeftButton) && - (QApplication::keyboardModifiers() == Qt::ControlModifier)) { - startZoom(event->pos()); + //pan mode + if ( (event->key() == Qt::Key_Control) && panningActive) { + stopPan(); event->accept(); } } +void QGVNavStyleOCC::handleMousePressEvent(QMouseEvent *event) +{ + Q_UNUSED(event) +} + void QGVNavStyleOCC::handleMouseMoveEvent(QMouseEvent *event) { if (getViewer()->isBalloonPlacing()) { getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //pan mode 1 - MMB + mouse movement + if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } - if (zoomingActive) { - zoom(mouseZoomFactor(event->pos())); + //pan mode 2 - CNTL + MMB + mouse movement + if (QGuiApplication::mouseButtons() & Qt::MiddleButton && + QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) ) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } + event->accept(); + } + + //zoom mode 2 Control + LMB + if ((QGuiApplication::mouseButtons() & Qt::LeftButton) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) ) { + if (zoomingActive) { + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } + event->accept(); } } @@ -100,10 +119,24 @@ void QGVNavStyleOCC::handleMouseReleaseEvent(QMouseEvent *event) if (event->button() == Qt::LeftButton) { //zoom mode 2 Control + LMB if (zoomingActive) { - zoomingActive = false; + stopZoom(); event->accept(); } } } +bool QGVNavStyleOCC::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSOCC::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) ) { + //CNTL is down, so this is CNTL + RMB - don't allow context menu + return false; + } + } + return true; +} + + } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleOCC.h b/src/Mod/TechDraw/Gui/QGVNavStyleOCC.h index 936af821ea..8cc34b6dd9 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleOCC.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleOCC.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleOCC : public QGVNavStyle { public: - QGVNavStyleOCC(); + QGVNavStyleOCC(QGVPage* qgvp); virtual ~QGVNavStyleOCC(); virtual void handleKeyReleaseEvent(QKeyEvent *event) override; @@ -43,6 +43,9 @@ public: virtual void handleMouseMoveEvent(QMouseEvent *event) override; virtual void handleMouseReleaseEvent(QMouseEvent *event) override; + //context menu (RMB) prevents pan mode 2 (RMB or CNTL+RMB) + virtual bool allowContextMenu(QContextMenuEvent *event) override; + protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.cpp index 324388459d..b78e1a934a 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleOpenSCAD::QGVNavStyleOpenSCAD() +QGVNavStyleOpenSCAD::QGVNavStyleOpenSCAD(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -46,29 +47,15 @@ void QGVNavStyleOpenSCAD::handleKeyReleaseEvent(QKeyEvent *event) { //zoom mode 2 if ( (event->key() == Qt::Key_Shift) && zoomingActive) { - zoomingActive = false; + stopZoom(); event->accept(); } } -//eat the RMB event so it doesn't trigger MDIViewPage context void QGVNavStyleOpenSCAD::handleMousePressEvent(QMouseEvent *event) { - //zoom mode 2 Shift + RMB - if ((event->button() == Qt::RightButton) && - (QApplication::keyboardModifiers() == Qt::ShiftModifier)) { - startZoom(event->pos()); - event->accept(); - } else if (event->button() == Qt::RightButton) { - //pan mode - startPan(event->pos()); - event->accept(); - } - - //zoom mode 2 MMB - if (event->button() == Qt::MiddleButton) { - startZoom(event->pos()); - event->accept(); + if (event->button() == Qt::RightButton) { + startClick(Qt::RightButton); } } @@ -78,13 +65,41 @@ void QGVNavStyleOpenSCAD::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //if the mouse moves between press and release, then it isn't a click + if (m_clickPending) { + stopClick(); + return; + } + + if (QGuiApplication::mouseButtons() & Qt::RightButton && + !QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) { + //pan mode - RMB + move + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } - if (zoomingActive) { - zoom(mouseZoomFactor(event->pos())); + if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + //zoom mode 1 - MMB + move + if (zoomingActive) { + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } + event->accept(); + } + + if ((QGuiApplication::mouseButtons() & Qt::RightButton) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) { + //zoom mode 2 - SHIFT + RMB + move + if (zoomingActive) { + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } event->accept(); } } @@ -95,20 +110,46 @@ void QGVNavStyleOpenSCAD::handleMouseReleaseEvent(QMouseEvent *event) placeBalloon(event->pos()); } + if ((event->button() == Qt::RightButton) && + m_clickPending && + (m_clickButton == Qt::RightButton)) { + stopClick(); + pseudoContextEvent(); + event->accept(); + return; + } + if ((event->button() == Qt::RightButton) && panningActive) { stopPan(); event->accept(); } if ((event->button() == Qt::RightButton) && zoomingActive) { - zoomingActive = false; + stopZoom(); event->accept(); } if ((event->button() == Qt::MiddleButton) && zoomingActive) { - zoomingActive = false; + stopZoom(); event->accept(); } } +bool QGVNavStyleOpenSCAD::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSCAD::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) { + //Shift down - don't allow context menu + return false; + } else if (m_clickPending) { + //context menu request to be handled by button release + return false; + } + } + return true; +} + + } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.h b/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.h index a22d64cfd1..187fbce11b 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleOpenSCAD.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleOpenSCAD : public QGVNavStyle { public: - QGVNavStyleOpenSCAD(); + QGVNavStyleOpenSCAD(QGVPage* qgvp); virtual ~QGVNavStyleOpenSCAD(); virtual void handleKeyReleaseEvent(QKeyEvent *event) override; @@ -43,8 +43,7 @@ public: virtual void handleMousePressEvent(QMouseEvent *event) override; virtual void handleMouseReleaseEvent(QMouseEvent *event) override; - //context menu (RMB) prevents pan and zoom - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleRevit.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleRevit.cpp index fe07fa1a9c..3aa5a227c5 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleRevit.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleRevit.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleRevit::QGVNavStyleRevit() +QGVNavStyleRevit::QGVNavStyleRevit(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -44,16 +45,8 @@ QGVNavStyleRevit::~QGVNavStyleRevit() void QGVNavStyleRevit::handleMousePressEvent(QMouseEvent *event) { - //pan mode 1 - LMB + RMB - if (event->buttons() == (Qt::LeftButton & Qt::RightButton)) { - startPan(event->pos()); - event->accept(); - } - - //pan mode 2 - MMB - if (event->button() == Qt::MiddleButton) { - startPan(event->pos()); - event->accept(); + if (event->button() == Qt::RightButton) { + startClick(Qt::RightButton); } } @@ -63,8 +56,30 @@ void QGVNavStyleRevit::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //if the mouse moves between press and release, then it isn't a click + if (m_clickPending) { + stopClick(); + return; + } + + //pan mode 1 - MMB + move + if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } + event->accept(); + } + + //pan mode 2 - LMB + RMB + move + if (QGuiApplication::mouseButtons() & Qt::LeftButton && + QGuiApplication::mouseButtons() & Qt::RightButton) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } } @@ -75,15 +90,39 @@ void QGVNavStyleRevit::handleMouseReleaseEvent(QMouseEvent *event) placeBalloon(event->pos()); } - if (panningActive) { - //stop panning if any button release - if ( (event->button() == Qt::LeftButton) || - (event->button() == Qt::RightButton) || - (event->button() == Qt::MiddleButton) ){ + if ((event->button() == Qt::RightButton) && + m_clickPending && + (m_clickButton == Qt::RightButton)) { + stopClick(); + pseudoContextEvent(); + event->accept(); + return; + } + + //stop panning if any button released + if ( (event->button() == Qt::LeftButton) || + (event->button() == Qt::RightButton) || + (event->button() == Qt::MiddleButton) ){ + if (panningActive) { stopPan(); event->accept(); } } } +bool QGVNavStyleRevit::allowContextMenu(QContextMenuEvent *event) +{ +// Base::Console().Message("QGVNSRevit::allowContextMenu()\n"); + if (event->reason() == QContextMenuEvent::Mouse) { + //must check for a button combination involving context menu button + if (QGuiApplication::mouseButtons() & Qt::LeftButton) { + //LMB down - don't allow context menu + return false; + } else if (m_clickPending) { + //context menu request to be handled by button release + return false; + } + } + return true; +} } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleRevit.h b/src/Mod/TechDraw/Gui/QGVNavStyleRevit.h index d1762be0c7..8b0e896aa5 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleRevit.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleRevit.h @@ -35,15 +35,14 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleRevit : public QGVNavStyle { public: - QGVNavStyleRevit(); + QGVNavStyleRevit(QGVPage* qgvp); virtual ~QGVNavStyleRevit(); virtual void handleMousePressEvent(QMouseEvent *event) override; virtual void handleMouseMoveEvent(QMouseEvent *event) override; virtual void handleMouseReleaseEvent(QMouseEvent *event) override; - //context menu (RMB) prevents pan mode 2 (LMB + RMB) - virtual bool allowContextMenu() override {return false;}; + virtual bool allowContextMenu(QContextMenuEvent *event) override; protected: private: diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.cpp index c8ff743a6d..502b79b634 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.cpp @@ -38,7 +38,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleTinkerCAD::QGVNavStyleTinkerCAD() +QGVNavStyleTinkerCAD::QGVNavStyleTinkerCAD(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -48,10 +49,7 @@ QGVNavStyleTinkerCAD::~QGVNavStyleTinkerCAD() void QGVNavStyleTinkerCAD::handleMousePressEvent(QMouseEvent *event) { - if (event->button() == Qt::MiddleButton) { - startPan(event->pos()); - event->accept(); - } + Q_UNUSED(event) } void QGVNavStyleTinkerCAD::handleMouseMoveEvent(QMouseEvent *event) @@ -60,8 +58,13 @@ void QGVNavStyleTinkerCAD::handleMouseMoveEvent(QMouseEvent *event) getViewer()->setBalloonCursorPos(event->pos()); } - if (panningActive) { - pan(event->pos()); + //pan mode - MMB + move + if (QGuiApplication::mouseButtons() & Qt::MiddleButton) { + if (panningActive) { + pan(event->pos()); + } else { + startPan(event->pos()); + } event->accept(); } } @@ -72,8 +75,8 @@ void QGVNavStyleTinkerCAD::handleMouseReleaseEvent(QMouseEvent *event) placeBalloon(event->pos()); } - if (panningActive) { - if (event->button() == Qt::MiddleButton) { + if (event->button() == Qt::MiddleButton) { + if (panningActive) { stopPan(); event->accept(); } diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.h b/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.h index 3cf77ea5a6..499fd01258 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleTinkerCAD.h @@ -37,7 +37,7 @@ class TechDrawGuiExport QGVNavStyleTinkerCAD : public QGVNavStyle // TYPESYSTEM_HEADER(); public: - QGVNavStyleTinkerCAD(); + QGVNavStyleTinkerCAD(QGVPage* qgvp); virtual ~QGVNavStyleTinkerCAD(); virtual void handleMouseMoveEvent(QMouseEvent *event) override; diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp index 0090209fda..4967851d0a 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp @@ -34,7 +34,8 @@ using namespace TechDrawGui; namespace TechDrawGui { -QGVNavStyleTouchpad::QGVNavStyleTouchpad() +QGVNavStyleTouchpad::QGVNavStyleTouchpad(QGVPage *qgvp) : + QGVNavStyle(qgvp) { } @@ -64,14 +65,18 @@ void QGVNavStyleTouchpad::handleKeyReleaseEvent(QKeyEvent *event) { // Q_UNUSED(event) if (event->key() == Qt::Key_Shift) { - if (panningActive == true) { + if (panningActive) { stopPan(); } - zoomingActive = false; + if (zoomingActive) { + stopZoom(); + } + event->accept(); } if (event->key() == Qt::Key_Control) { - zoomingActive = false; + stopZoom(); + event->accept(); } } @@ -84,35 +89,23 @@ void QGVNavStyleTouchpad::handleMouseMoveEvent(QMouseEvent *event) if (QApplication::keyboardModifiers() == Qt::ShiftModifier) { //if shift is down then we are panning - if (!panningActive) { + if (panningActive) { + pan(event->pos()); + } else { startPan(event->pos()); } - zoomingActive = false; - } else if (QApplication::keyboardModifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { - // if control and shift are down then we are zooming - if (panningActive == true) { - stopPan(); - } - if (!zoomingActive) { - startZoom(event->pos()); - event->accept(); - return; //don't zoom on first movement - } - } else { - if (panningActive == true) { - stopPan(); - } - zoomingActive = false; - } - - if (panningActive) { - pan(event->pos()); event->accept(); } - if (zoomingActive) { -// setAnchor(); - zoom(mouseZoomFactor(event->pos())); + if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier) && + QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) ) { + //if control and shift are down, then we are zooming + if (zoomingActive) { + setAnchor(); + zoom(mouseZoomFactor(event->pos())); + } else { + startZoom(event->pos()); + } event->accept(); } } @@ -126,5 +119,4 @@ void QGVNavStyleTouchpad::setAnchor() } } - } //namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.h b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.h index ff73958caa..39cd10215a 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.h +++ b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.h @@ -35,7 +35,7 @@ class QGVPage; class TechDrawGuiExport QGVNavStyleTouchpad : public QGVNavStyle { public: - QGVNavStyleTouchpad(); + QGVNavStyleTouchpad(QGVPage* qgvp); virtual ~QGVNavStyleTouchpad(); virtual void handleKeyPressEvent(QKeyEvent *event) override; diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 63610025f2..b8b21abe99 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -24,6 +24,7 @@ #ifndef _PreComp_ # include # include +# include # include # include # include @@ -133,6 +134,50 @@ #define INKSCAPE_NS_URI "http://www.inkscape.org/namespaces/inkscape" #define SODIPODI_NS_URI "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" +/*** pan-style cursor *******/ + +#define PAN_WIDTH 16 +#define PAN_HEIGHT 16 +#define PAN_BYTES ((PAN_WIDTH + 7) / 8) * PAN_HEIGHT +#define PAN_HOT_X 7 +#define PAN_HOT_Y 7 + +static unsigned char pan_bitmap[PAN_BYTES] = +{ + 0xc0, 0x03, 0x60, 0x02, 0x20, 0x04, 0x10, 0x08, + 0x68, 0x16, 0x54, 0x2a, 0x73, 0xce, 0x01, 0x80, + 0x01, 0x80, 0x73, 0xce, 0x54, 0x2a, 0x68, 0x16, + 0x10, 0x08, 0x20, 0x04, 0x40, 0x02, 0xc0, 0x03 +}; + +static unsigned char pan_mask_bitmap[PAN_BYTES] = +{ + 0xc0,0x03,0xe0,0x03,0xe0,0x07,0xf0,0x0f,0xe8,0x17,0xdc,0x3b,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xdc,0x3b,0xe8,0x17,0xf0,0x0f,0xe0,0x07,0xc0,0x03, + 0xc0,0x03 +}; +/*** zoom-style cursor ******/ + +#define ZOOM_WIDTH 16 +#define ZOOM_HEIGHT 16 +#define ZOOM_BYTES ((ZOOM_WIDTH + 7) / 8) * ZOOM_HEIGHT +#define ZOOM_HOT_X 5 +#define ZOOM_HOT_Y 7 + +static unsigned char zoom_bitmap[ZOOM_BYTES] = +{ + 0x00, 0x0f, 0x80, 0x1c, 0x40, 0x38, 0x20, 0x70, + 0x90, 0xe4, 0xc0, 0xcc, 0xf0, 0xfc, 0x00, 0x0c, + 0x00, 0x0c, 0xf0, 0xfc, 0xc0, 0xcc, 0x90, 0xe4, + 0x20, 0x70, 0x40, 0x38, 0x80, 0x1c, 0x00, 0x0f +}; + +static unsigned char zoom_mask_bitmap[ZOOM_BYTES] = +{ + 0x00,0x0f,0x80,0x1f,0xc0,0x3f,0xe0,0x7f,0xf0,0xff,0xf0,0xff,0xf0,0xff,0x00, + 0x0f,0x00,0x0f,0xf0,0xff,0xf0,0xff,0xf0,0xff,0xe0,0x7f,0xc0,0x3f,0x80,0x1f, + 0x00,0x0f +}; using namespace Gui; using namespace TechDraw; using namespace TechDrawGui; @@ -202,7 +247,9 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGSPage* s, QWidget *parent) setMouseTracking(true); viewport()->setMouseTracking(true); -// setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); + m_parentMDI = static_cast(parent); + m_saveContextEvent = nullptr; + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); //this prevents crash when deleting dims. //scene(view?) indices of dirty regions gets //out of sync. missing prepareGeometryChange @@ -219,7 +266,8 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGSPage* s, QWidget *parent) } setAlignment(Qt::AlignCenter); - setDragMode(ScrollHandDrag); +// setDragMode(ScrollHandDrag); + setDragMode(QGraphicsView::NoDrag); resetCursor(); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); @@ -232,6 +280,8 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGSPage* s, QWidget *parent) resetCachedContent(); initNavigationStyle(); + + createStandardCursors(devicePixelRatio()); } QGVPage::~QGVPage() @@ -265,30 +315,28 @@ void QGVPage::setNavigationStyle(std::string navParm) std::size_t foundRevit = navParm.find("Revit"); if (foundBlender != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleBlender()); + m_navStyle = static_cast(new QGVNavStyleBlender(this)); } else if (foundCAD != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleCAD()); + m_navStyle = static_cast(new QGVNavStyleCAD(this)); } else if (foundTouchPad != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleTouchpad()); + m_navStyle = static_cast(new QGVNavStyleTouchpad(this)); } else if (foundInventor != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleInventor()); + m_navStyle = static_cast(new QGVNavStyleInventor(this)); } else if (foundTinker != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleTinkerCAD()); + m_navStyle = static_cast(new QGVNavStyleTinkerCAD(this)); } else if (foundGesture != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleGesture()); + m_navStyle = static_cast(new QGVNavStyleGesture(this)); } else if (foundMaya != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleMaya()); + m_navStyle = static_cast(new QGVNavStyleMaya(this)); } else if (foundOCC != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleOCC()); + m_navStyle = static_cast(new QGVNavStyleOCC(this)); } else if (foundOpenSCAD != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleOpenSCAD()); + m_navStyle = static_cast(new QGVNavStyleOpenSCAD(this)); } else if (foundRevit != std::string::npos) { - m_navStyle = static_cast(new QGVNavStyleRevit()); + m_navStyle = static_cast(new QGVNavStyleRevit(this)); } else { - m_navStyle = new QGVNavStyle(); + m_navStyle = new QGVNavStyle(this); } - - m_navStyle->setViewer(this); } void QGVPage::startBalloonPlacing(void) @@ -375,25 +423,6 @@ void QGVPage::setHighQualityAntialiasing(bool highQualityAntialiasing) #endif } -void QGVPage::contextMenuEvent(QContextMenuEvent *event) -{ - if (m_navStyle->allowContextMenu()) { - QGraphicsView::contextMenuEvent(event); - } - //TODO: allow RMB press and context menu - // by triggering pseudo-mousePressEvent, then calling QGV::contextMenuEvent - // QMouseEvent* mouseEvent(QEvent::MouseButtonPress, - // event->pos(), //local pos - // event->globalPos(), //window pos - // event->globalPos(), //screen pos - // Qt::RightButton, //button - // Qt::RightButton, //buttons, - // Qt::NoModifier, //KB modifiers - // Qt::MouseEventSynthesizedByApplication) //source - // m_navStyle->handleMousePressEvent(mouseEvent); - // QGraphicsView::contextMenuEvent(event); -} - void QGVPage::paintEvent(QPaintEvent *event) { if (m_renderer == Image) { @@ -413,6 +442,30 @@ void QGVPage::paintEvent(QPaintEvent *event) } } +void QGVPage::contextMenuEvent(QContextMenuEvent *event) +{ + if (m_navStyle->allowContextMenu(event)) { + QGraphicsView::contextMenuEvent(event); //this eats the event. mouseReleaseEvent will not be called. + return; + } + + //delete the old saved event before creating a new one to avoid memory leak + //NOTE: saving the actual event doesn't work as the event gets deleted somewhere in Qt + if (m_saveContextEvent != nullptr) { + delete m_saveContextEvent; + } + m_saveContextEvent = new QContextMenuEvent(QContextMenuEvent::Mouse, + event->pos(), + event->globalPos()); +} + +void QGVPage::pseudoContextEvent() +{ + if (m_saveContextEvent != nullptr) { + m_parentMDI->contextMenuEvent(m_saveContextEvent); + } +} + void QGVPage::wheelEvent(QWheelEvent *event) { m_navStyle->handleWheelEvent(event); @@ -553,6 +606,16 @@ void QGVPage::resetCursor() { viewport()->setCursor(Qt::ArrowCursor); } +void QGVPage::setPanCursor() +{ + activateCursor(panCursor); +} + +void QGVPage::setZoomCursor() +{ + activateCursor(zoomCursor); +} + void QGVPage::drawForeground(QPainter *painter, const QRectF &rect) { Q_UNUSED(rect); @@ -611,4 +674,24 @@ Base::Type QGVPage::getStyleType(std::string model) return type; } +void QGVPage::createStandardCursors(double dpr) +{ + (void) dpr; //avoid clang warning re unused parameter + QBitmap cursor = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_bitmap); + QBitmap mask = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_mask_bitmap); +#if defined(Q_OS_WIN32) + cursor.setDevicePixelRatio(dpr); + mask.setDevicePixelRatio(dpr); +#endif + panCursor = QCursor(cursor, mask, PAN_HOT_X, PAN_HOT_Y); + + cursor = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_bitmap); + mask = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_mask_bitmap); +#if defined(Q_OS_WIN32) + cursor.setDevicePixelRatio(dpr); + mask.setDevicePixelRatio(dpr); +#endif + zoomCursor = QCursor(cursor, mask, ZOOM_HOT_X, ZOOM_HOT_Y); +} + #include diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index 37411e67c2..bd96c3d12b 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -32,8 +32,6 @@ #include -class QTemporaryFile; - namespace App { class DocumentObject; } @@ -59,6 +57,7 @@ class DrawWeldSymbol; namespace TechDrawGui { +class MDIViewPage; class QGSPage; class QGIView; class QGIViewDimension; @@ -92,10 +91,6 @@ public: void setExporting(bool enable); - /// Renders the page to SVG with filename. -// void saveSvg(QString filename); -// void postProcessXml(QTemporaryFile& tempFile, QString filename, QString pagename); - void makeGrid(int width, int height, double step); void showGrid(bool state) {m_showGrid = state;} void updateViewport(void) {viewport()->repaint();} @@ -110,6 +105,13 @@ public: QPointF getBalloonCursorPos() {return balloonCursorPos;} void setBalloonCursorPos(QPoint p) { balloonCursorPos = p;} + void activateCursor(QCursor cursor); + void resetCursor(); + void setPanCursor(); + void setZoomCursor(); + + void pseudoContextEvent(); + public Q_SLOTS: void setHighQualityAntialiasing(bool highQualityAntialiasing); @@ -133,8 +135,6 @@ protected: double getDevicePixelRatio() const; QPixmap prepareCursorPixmap(const char *iconName, QPoint &hotspot); - void activateCursor(QCursor cursor); - void resetCursor(); void drawForeground(QPainter *painter, const QRectF &rect) override; std::string getNavStyleParameter(); @@ -143,6 +143,8 @@ protected: void initNavigationStyle(); void setNavigationStyle(std::string navParm); + void createStandardCursors(double dpr); + private: RendererType m_renderer; @@ -173,6 +175,12 @@ private: class Private; std::unique_ptr d; + + QCursor panCursor; + QCursor zoomCursor; + + MDIViewPage* m_parentMDI; + QContextMenuEvent* m_saveContextEvent; }; } // namespace