From 6e39a7872199b18a91b62f686172a68a9f450a3f Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Sat, 6 May 2017 03:29:13 +0300 Subject: [PATCH] Gui: GestureNav: disable rotation when over a dragger --- src/Gui/GestureNavigationStyle.cpp | 43 +++++++++++++++++++++++++++--- src/Gui/NavigationStyle.h | 1 + 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Gui/GestureNavigationStyle.cpp b/src/Gui/GestureNavigationStyle.cpp index acbae6a9929f..13ad7e7680c8 100644 --- a/src/Gui/GestureNavigationStyle.cpp +++ b/src/Gui/GestureNavigationStyle.cpp @@ -59,6 +59,10 @@ # include # include # include +# include +# include +# include +# include #endif #include @@ -314,8 +318,7 @@ SbBool GestureNavigationStyle::processSoEvent(const SoEvent * const ev) //all mode-dependent stuff is within this switch. switch(curmode){ case NavigationStyle::IDLE: - case NavigationStyle::SELECTION: - case NavigationStyle::INTERACT: { + case NavigationStyle::SELECTION: { //idle and interaction //keyboard @@ -363,7 +366,9 @@ SbBool GestureNavigationStyle::processSoEvent(const SoEvent * const ev) case SoMouseButtonEvent::BUTTON1: case SoMouseButtonEvent::BUTTON2: if(press){ - if(this->thisClickIsComplex && this->mouseMoveThresholdBroken){ + if (this->isDraggerUnderCursor(ev->getPosition())){ + setViewingMode(NavigationStyle::INTERACT); + } else if(this->thisClickIsComplex && this->mouseMoveThresholdBroken){ //this should prevent re-attempts to enter navigation when doing more clicks after a move. } else { //on LMB-down or RMB-down, we don't know yet if we should propagate it or process it. Save the event to be refired later, when it becomes clear. @@ -584,6 +589,25 @@ SbBool GestureNavigationStyle::processSoEvent(const SoEvent * const ev) setViewingMode(NavigationStyle::IDLE); } } break; //end of animation modes + case NavigationStyle::INTERACT:{ + // Mouse Button / Spaceball Button handling + if (evIsButton) { + const SoMouseButtonEvent * const event = (const SoMouseButtonEvent *) ev; + const int button = event->getButton(); + //const SbBool press //the button was pressed (if false -> released) + // = event->getState() == SoButtonEvent::DOWN ? true : false; + switch(button){ + case SoMouseButtonEvent::BUTTON1: + case SoMouseButtonEvent::BUTTON2: + if(!(comboAfter & BUTTON1DOWN || comboAfter & BUTTON2DOWN)) { + //all buttons are released - leave interact mode + setViewingMode(NavigationStyle::IDLE); + } + break; + } //switch(button) + } //if(evIsButton) + + } break; case NavigationStyle::BOXZOOM: default: //all the rest - will be pass on to inherited, later. @@ -600,3 +624,16 @@ SbBool GestureNavigationStyle::processSoEvent(const SoEvent * const ev) return processed; } + +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) + return pick->getPath()->getTail()->isOfType(SoDragger::getClassTypeId()); + else + return false; +} diff --git a/src/Gui/NavigationStyle.h b/src/Gui/NavigationStyle.h index 737972147143..038177145904 100644 --- a/src/Gui/NavigationStyle.h +++ b/src/Gui/NavigationStyle.h @@ -370,6 +370,7 @@ class GuiExport GestureNavigationStyle : public UserNavigationStyle { protected: SbBool processSoEvent(const SoEvent * const ev); + bool isDraggerUnderCursor(SbVec2s pos); SbVec2s mousedownPos;//the position where some mouse button was pressed (local pixel coordinates). short mouseMoveThreshold;//setting. Minimum move required to consider it a move (in pixels).