From 470b9ff7562db0e4a867c11b4e9cd9d438838ebb Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 15 Sep 2015 22:09:28 +0200 Subject: [PATCH] + add convenience method to get editing view of a view provider --- src/Gui/Document.cpp | 17 +++---- src/Gui/Document.h | 2 +- src/Gui/ViewProviderDocumentObject.cpp | 7 +++ src/Gui/ViewProviderDocumentObject.h | 2 + src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 52 +++++++++------------ 5 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index e0e5e4baf..aee32a7e2 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1272,17 +1272,18 @@ Gui::MDIView* Document::getViewOfViewProvider(Gui::ViewProvider* vp) const return 0; } -Gui::MDIView* Document::getFirstViewOfViewProvider(Gui::ViewProvider* vp) const +Gui::MDIView* Document::getEditingViewOfViewProvider(Gui::ViewProvider* vp) const { - // first try the active view - Gui::MDIView* view = getActiveView(); - if (view && view->isDerivedFrom(View3DInventor::getClassTypeId())) { - View3DInventor* view3d = static_cast(view); - if (view3d->getViewer()->hasViewProvider(vp)) - return view; + std::list mdis = getMDIViewsOfType(View3DInventor::getClassTypeId()); + for (std::list::const_iterator it = mdis.begin(); it != mdis.end(); ++it) { + View3DInventor* view = static_cast(*it); + View3DInventorViewer* viewer = view->getViewer(); + // there is only one 3d view which is in edit mode + if (viewer->hasViewProvider(vp) && viewer->isEditingViewProvider()) + return *it; } - return getViewOfViewProvider(vp); + return 0; } std::list Document::getViewsOfViewProvider(Gui::ViewProvider* vp) const diff --git a/src/Gui/Document.h b/src/Gui/Document.h index 0a7c68582..dc96a7df1 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -148,7 +148,7 @@ public: //@{ /// Getter for the active view Gui::MDIView* getActiveView(void) const; - Gui::MDIView* getFirstViewOfViewProvider(Gui::ViewProvider*) const; + Gui::MDIView* getEditingViewOfViewProvider(Gui::ViewProvider*) const; Gui::MDIView* getViewOfViewProvider(Gui::ViewProvider*) const; std::list getViewsOfViewProvider(Gui::ViewProvider*) const; /// Create a new view diff --git a/src/Gui/ViewProviderDocumentObject.cpp b/src/Gui/ViewProviderDocumentObject.cpp index dfb6b585a..42235a23b 100644 --- a/src/Gui/ViewProviderDocumentObject.cpp +++ b/src/Gui/ViewProviderDocumentObject.cpp @@ -163,6 +163,13 @@ Gui::MDIView* ViewProviderDocumentObject::getActiveView() const return pGuiDoc->getActiveView(); } +Gui::MDIView* ViewProviderDocumentObject::getEditingView() const +{ + App::Document* pAppDoc = pcObject->getDocument(); + Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(pAppDoc); + return pGuiDoc->getEditingViewOfViewProvider(const_cast(this)); +} + SoNode* ViewProviderDocumentObject::findFrontRootOfType(const SoType& type) const { // first get the document this object is part of and get its GUI counterpart diff --git a/src/Gui/ViewProviderDocumentObject.h b/src/Gui/ViewProviderDocumentObject.h index fd3cfcf74..165d4eef3 100644 --- a/src/Gui/ViewProviderDocumentObject.h +++ b/src/Gui/ViewProviderDocumentObject.h @@ -92,6 +92,8 @@ public: protected: /// Get the active mdi view of a view provider Gui::MDIView* getActiveView() const; + /// Get the editing mdi view of a view provider in edit mode + Gui::MDIView* getEditingView() const; /// Gets called by the container whenever a property has been changed virtual void onChanged(const App::Property* prop); /** Searches in all view providers that are attached to an object that diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 380f5776d..0b0f18913 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -832,11 +832,6 @@ bool ViewProviderSketch::mouseButtonPressed(int Button, bool pressed, const SbVe } else if (edit->PreselectConstraintSet.empty() != true) { return true; } else { - //Get Viewer - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - Gui::View3DInventorViewer *viewer; - viewer = static_cast(mdi)->getViewer(); - Gui::MenuItem *geom = new Gui::MenuItem(); geom->setCommand("Sketcher geoms"); *geom << "Sketcher_CreatePoint" @@ -869,11 +864,6 @@ bool ViewProviderSketch::mouseButtonPressed(int Button, bool pressed, const SbVe break; case STATUS_SELECT_Edge: { - //Get Viewer - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - Gui::View3DInventorViewer *viewer ; - viewer = static_cast(mdi)->getViewer(); - Gui::MenuItem *geom = new Gui::MenuItem(); geom->setCommand("Sketcher constraints"); *geom << "Sketcher_ConstrainVertical" @@ -1337,8 +1327,9 @@ Base::Vector3d ViewProviderSketch::seekConstraintPosition(const Base::Vector3d & const SoNode *constraint) { assert(edit); - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - Gui::View3DInventorViewer *viewer = static_cast(mdi)->getViewer(); + Gui::View3DInventor* mdi = qobject_cast(this->getEditingView()); + Gui::View3DInventorViewer *viewer = mdi->getViewer(); + SoRayPickAction rp(viewer->getSoRenderManager()->getViewportRegion()); float scaled_step = step * getScaleFactor(); @@ -1823,8 +1814,7 @@ SbVec3s ViewProviderSketch::getDisplayedSize(const SoImage *iconPtr) const void ViewProviderSketch::centerSelection() { - Gui::Document* doc = Gui::Application::Instance->getDocument(getObject()->getDocument()); - Gui::View3DInventor* view = qobject_cast(doc->getFirstViewOfViewProvider(this)); + Gui::View3DInventor* view = qobject_cast(this->getEditingView()); if (!view || !edit) return; @@ -1845,7 +1835,6 @@ void ViewProviderSketch::centerSelection() SbBox3f box = action.getBoundingBox(); if (!box.isEmpty()) { - // get cirumscribing sphere SoCamera* camera = viewer->getSoRenderManager()->getCamera(); SbVec3f direction; camera->orientation.getValue().multVec(SbVec3f(0, 0, 1), direction); @@ -2561,9 +2550,9 @@ void ViewProviderSketch::drawConstraintIcons() double x0,y0,x1,y1; SbVec3f pos0(startingpoint.x,startingpoint.y,startingpoint.z); SbVec3f pos1(endpoint.x,endpoint.y,endpoint.z); - - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - Gui::View3DInventorViewer *viewer = static_cast(mdi)->getViewer(); + + Gui::View3DInventor* mdi = qobject_cast(this->getEditingView()); + Gui::View3DInventorViewer *viewer = mdi->getViewer(); SoCamera* pCam = viewer->getSoRenderManager()->getCamera(); if (!pCam) return; @@ -2929,11 +2918,12 @@ void ViewProviderSketch::drawTypicalConstraintIcon(const constrIconQueueItem &i) float ViewProviderSketch::getScaleFactor() { - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - if (mdi && mdi->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { - Gui::View3DInventorViewer *viewer = static_cast(mdi)->getViewer(); + Gui::View3DInventor* mdi = qobject_cast(this->getEditingView()); + if (mdi) { + Gui::View3DInventorViewer *viewer = mdi->getViewer(); return viewer->getSoRenderManager()->getCamera()->getViewVolume(viewer->getSoRenderManager()->getCamera()->aspectRatio.getValue()).getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / 3; - } else { + } + else { return 1.f; } } @@ -2942,9 +2932,6 @@ void ViewProviderSketch::draw(bool temp) { assert(edit); - // Get Bounding box dimensions for Datum text - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - // Render Geometry =================================================== std::vector Coords; std::vector Points; @@ -3920,12 +3907,17 @@ Restart: this->updateColor(); // delete the cloned objects - if (temp) - for (std::vector::iterator it=tempGeo.begin(); it != tempGeo.end(); ++it) - if (*it) delete *it; + if (temp) { + for (std::vector::iterator it=tempGeo.begin(); it != tempGeo.end(); ++it) { + if (*it) + delete *it; + } + } - if (mdi && mdi->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { - static_cast(mdi)->getViewer()->redraw(); + // Get Bounding box dimensions for Datum text + Gui::View3DInventor* mdi = qobject_cast(this->getEditingView()); + if (mdi) { + mdi->getViewer()->redraw(); } }