From 666a5968cb6738f454aceb29a2ee76141991c1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Tue, 15 Mar 2016 07:06:49 +0100 Subject: [PATCH] Override mode works with non-toplevel viewprovider And adopt the part design body to handle the override mode correctly --- src/Gui/View3DInventorViewer.cpp | 12 +++++-- src/Gui/View3DInventorViewer.h | 2 ++ src/Gui/ViewProvider.cpp | 13 ++++++-- src/Gui/ViewProvider.h | 2 ++ src/Mod/PartDesign/Gui/ViewProviderBody.cpp | 35 ++++++++++++++++++--- src/Mod/PartDesign/Gui/ViewProviderBody.h | 1 + 6 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index a6299168c..2634a936b 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -127,6 +127,7 @@ #include "SoTouchEvents.h" #include "WinNativeGestureRecognizers.h" +#include "Document.h" //#define FC_LOGGING_CB @@ -566,9 +567,15 @@ View3DInventorViewer::~View3DInventorViewer() void View3DInventorViewer::setDocument(Gui::Document* pcDocument) { // write the document the viewer belongs to to the selection node + guiDocument = pcDocument; selectionRoot->pcDocument = pcDocument; } +Document* View3DInventorViewer::getDocument() { + return guiDocument; +} + + void View3DInventorViewer::initialize() { navigation = new CADNavigationStyle(); @@ -683,8 +690,9 @@ void View3DInventorViewer::setOverrideMode(const std::string& mode) overrideMode = mode; - for (std::set::iterator it = _ViewProviderSet.begin(); it != _ViewProviderSet.end(); ++it) - (*it)->setOverrideMode(mode); + auto views = getDocument()->getViewProvidersOfType(Gui::ViewProvider::getClassTypeId()); + for (auto view : views) + view->setOverrideMode(mode); } /// update override mode. doesn't affect providers diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index b0fb28537..02b0e6add 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -341,6 +341,7 @@ public: NavigationStyle* navigationStyle() const; void setDocument(Gui::Document *pcDocument); + Gui::Document* getDocument(); virtual PyObject *getPyObject(void); @@ -420,6 +421,7 @@ private: SbBool allowredir; std::string overrideMode; + Gui::Document* guiDocument = nullptr; ViewerEventFilter* viewerEventFilter; diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index dc2976085..894800357 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -65,6 +65,7 @@ PROPERTY_SOURCE_ABSTRACT(Gui::ViewProvider, App::PropertyContainer) ViewProvider::ViewProvider() : pcAnnotation(0) , pyViewObject(0) + , overrideMode("As Is") , _iActualMode(-1) , _iEditMode(-1) , viewOverrideMode(-1) @@ -334,19 +335,27 @@ bool ViewProvider::isVisible() const } void ViewProvider::setOverrideMode(const std::string &mode) -{ - if (mode == "As Is") +{ + if (mode == "As Is") { viewOverrideMode = -1; + overrideMode = mode; + } else { std::map::const_iterator it = _sDisplayMaskModes.find(mode); if (it == _sDisplayMaskModes.end()) return; //view style not supported viewOverrideMode = (*it).second; + overrideMode = mode; } if (pcModeSwitch->whichChild.getValue() != -1) setModeSwitch(); } +const string ViewProvider::getOverrideMode() { + return overrideMode; +} + + void ViewProvider::setModeSwitch() { if (viewOverrideMode == -1) diff --git a/src/Gui/ViewProvider.h b/src/Gui/ViewProvider.h index d852221c5..2bab337eb 100644 --- a/src/Gui/ViewProvider.h +++ b/src/Gui/ViewProvider.h @@ -233,6 +233,7 @@ public: bool isVisible() const; /// Overrides the display mode with mode. virtual void setOverrideMode(const std::string &mode); + const std::string getOverrideMode(); //@} @@ -348,6 +349,7 @@ protected: /// The root separator for annotations SoSeparator *pcAnnotation; ViewProviderPy* pyViewObject; + std::string overrideMode; private: void setModeSwitch(); diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp index 1484ba1e7..775282dbe 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp @@ -105,13 +105,26 @@ void ViewProviderBody::attach(App::DocumentObject *pcFeat) void ViewProviderBody::setDisplayMode(const char* ModeName) { //if we show "Through" we must avoid to set the display mask modes, as this would result - //in going into tip mode. When through is chosen the child features are displayed, and all + //in going into "tip" mode. When through is chosen the child features are displayed, and all //we need to ensure is that the display mode change is propagated to them fro within the //onChanged() method. if(DisplayModeBody.getValue() == 1) PartGui::ViewProviderPartExt::setDisplayMode(ModeName); } +void ViewProviderBody::setOverrideMode(const std::__cxx11::string& mode) { + + //if we are in through mode, we need to ensure that the override mode is not set for the body + //(as this would result in "tip" mode), it is enough when the children are set to the correct + //override mode. + + if(DisplayModeBody.getValue() != 0) + Gui::ViewProvider::setOverrideMode(mode); + else + overrideMode = mode; +} + + bool ViewProviderBody::doubleClicked(void) { @@ -353,10 +366,24 @@ void ViewProviderBody::onChanged(const App::Property* prop) { if(prop == &DisplayModeBody) { - if ( DisplayModeBody.getValue() == 0 ) + if ( DisplayModeBody.getValue() == 0 ) { + //if we are in an override mode we need to make sure to come out, because + //otherwise the maskmode is blocked and won't go into "through" + if(getOverrideMode() != "As Is") { + auto mode = getOverrideMode(); + ViewProvider::setOverrideMode("As Is"); + overrideMode = mode; + } setDisplayMaskMode("Through"); - else - setDisplayMaskMode(DisplayMode.getValueAsString()); + } + else { + if(getOverrideMode() == "As Is") + setDisplayMaskMode(DisplayMode.getValueAsString()); + else { + Base::Console().Message("Set override mode: %s\n", getOverrideMode().c_str()); + setDisplayMaskMode(getOverrideMode().c_str()); + } + } } else unifyVisualProperty(prop); diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.h b/src/Mod/PartDesign/Gui/ViewProviderBody.h index 9ca3a7b00..8ea0c42d8 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.h +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.h @@ -59,6 +59,7 @@ public: virtual SoGroup* getChildRoot(void) const {return pcBodyChildren;} virtual std::vector claimChildren3D(void)const; virtual void setDisplayMode(const char* ModeName); + virtual void setOverrideMode(const std::__cxx11::string& mode); virtual bool onDelete(const std::vector &);