diff --git a/src/Gui/Navigation/GestureNavigationStyle.cpp b/src/Gui/Navigation/GestureNavigationStyle.cpp index a6e9d0352b..39ab6e91c4 100644 --- a/src/Gui/Navigation/GestureNavigationStyle.cpp +++ b/src/Gui/Navigation/GestureNavigationStyle.cpp @@ -959,25 +959,6 @@ SbBool GestureNavigationStyle::processSoEvent_bypass(const SoEvent* const ev) return superclass::processSoEvent(ev); } -bool GestureNavigationStyle::isDraggerUnderCursor(SbVec2s pos) -{ - SoRayPickAction rp(this->viewer->getSoRenderManager()->getViewportRegion()); - rp.setRadius(viewer->getPickRadius()); - rp.setPoint(pos); - rp.apply(this->viewer->getSoRenderManager()->getSceneGraph()); - SoPickedPoint* pick = rp.getPickedPoint(); - if (pick){ - const auto fullpath = static_cast(pick->getPath()); - for(int i = 0; i < fullpath->getLength(); ++i){ - if(fullpath->getNode(i)->isOfType(SoDragger::getClassTypeId())) - return true; - } - return false; - } else { - return false; - } -} - bool GestureNavigationStyle::is2DViewing() const { // #FIXME: detect sketch editing, ! any editing diff --git a/src/Gui/Navigation/GestureNavigationStyle.h b/src/Gui/Navigation/GestureNavigationStyle.h index a8fa4e6d0a..9f65ec8596 100644 --- a/src/Gui/Navigation/GestureNavigationStyle.h +++ b/src/Gui/Navigation/GestureNavigationStyle.h @@ -98,8 +98,6 @@ protected: // members variables int rollDir = 0; bool logging = false; -protected: //helper functions - bool isDraggerUnderCursor(SbVec2s pos); public: bool is2DViewing() const; diff --git a/src/Gui/Navigation/NavigationStyle.cpp b/src/Gui/Navigation/NavigationStyle.cpp index 1a920c140e..be3c413c28 100644 --- a/src/Gui/Navigation/NavigationStyle.cpp +++ b/src/Gui/Navigation/NavigationStyle.cpp @@ -24,6 +24,7 @@ # include # include # include +# include # include # include # include @@ -1542,6 +1543,25 @@ const std::vector& NavigationStyle::getPolygon(SelectionRole* role) con return pcPolygon; } +bool NavigationStyle::isDraggerUnderCursor(const SbVec2s pos) const +{ + SoRayPickAction rp(this->viewer->getSoRenderManager()->getViewportRegion()); + rp.setRadius(viewer->getPickRadius()); + rp.setPoint(pos); + rp.apply(this->viewer->getSoRenderManager()->getSceneGraph()); + SoPickedPoint* pick = rp.getPickedPoint(); + if (pick) { + const auto fullpath = static_cast(pick->getPath()); + for (int i = 0; i < fullpath->getLength(); ++i) { + if (fullpath->getNode(i)->isOfType(SoDragger::getClassTypeId())) { + return true; + } + } + return false; + } + return false; +} + // This method adds another point to the mouse location log, used for spin // animation calculations. void NavigationStyle::addToLog(const SbVec2s pos, const SbTime time) diff --git a/src/Gui/Navigation/NavigationStyle.h b/src/Gui/Navigation/NavigationStyle.h index 4faf708175..85a441598d 100644 --- a/src/Gui/Navigation/NavigationStyle.h +++ b/src/Gui/Navigation/NavigationStyle.h @@ -189,6 +189,8 @@ public: SbBool isSelecting() const; const std::vector& getPolygon(SelectionRole* role=nullptr) const; + bool isDraggerUnderCursor(const SbVec2s pos) const; + void setOrbitStyle(OrbitStyle style); OrbitStyle getOrbitStyle() const; diff --git a/src/Gui/Navigation/OpenSCADNavigationStyle.cpp b/src/Gui/Navigation/OpenSCADNavigationStyle.cpp index 9302b5d9b0..7de990c58d 100644 --- a/src/Gui/Navigation/OpenSCADNavigationStyle.cpp +++ b/src/Gui/Navigation/OpenSCADNavigationStyle.cpp @@ -187,9 +187,14 @@ SbBool OpenSCADNavigationStyle::processSoEvent(const SoEvent * const ev) this->lockrecenter = true; const auto event = (const SoLocation2Event *) ev; if (!viewer->isEditing() && curmode == NavigationStyle::SELECTION) { - newmode = NavigationStyle::DRAGGING; - saveCursorPosition(ev); - this->centerTime = ev->getTime(); + if (button1down && isDraggerUnderCursor(ev->getPosition())) { + newmode = NavigationStyle::INTERACT; + } + else { + newmode = NavigationStyle::DRAGGING; + saveCursorPosition(ev); + this->centerTime = ev->getTime(); + } } else if (curmode == NavigationStyle::ZOOMING) { // OpenSCAD uses vertical mouse position, not horizontal @@ -241,7 +246,7 @@ SbBool OpenSCADNavigationStyle::processSoEvent(const SoEvent * const ev) newmode = NavigationStyle::IDLE; break; case BUTTON1DOWN: - if (newmode != NavigationStyle::DRAGGING) + if (newmode != NavigationStyle::DRAGGING && newmode != NavigationStyle::INTERACT) newmode = NavigationStyle::SELECTION; break; case BUTTON2DOWN: