From c7555eaa630557b525832efcdd69d45c18dfed40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Wed, 6 May 2015 17:33:44 +0200 Subject: [PATCH] interactively show origin objects for feature pick --- src/Gui/ViewProviderOrigin.cpp | 42 ++++++++++++++++++++++ src/Gui/ViewProviderOrigin.h | 12 +++++++ src/Mod/PartDesign/Gui/TaskFeaturePick.cpp | 29 +++++++++++++-- src/Mod/PartDesign/Gui/TaskFeaturePick.h | 4 +++ 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/src/Gui/ViewProviderOrigin.cpp b/src/Gui/ViewProviderOrigin.cpp index a502750ec..7c454bdd4 100644 --- a/src/Gui/ViewProviderOrigin.cpp +++ b/src/Gui/ViewProviderOrigin.cpp @@ -84,6 +84,48 @@ QIcon ViewProviderOrigin::getIcon(void) const return Gui::ViewProvider::getIcon(); } +void ViewProviderOrigin::setTemporaryVisibilityMode(bool onoff, Gui::Document* doc) +{ + tempVisDoc = doc; + + if(tempVisMode == onoff) + return; + + tempVisMode = onoff; + if(onoff && doc) { + App::Origin* origin = static_cast(pcObject); + tempVisMap.clear(); + + for(App::DocumentObject* obj : origin->getObjects()) { + Gui::ViewProvider* vp = doc->getViewProvider(obj); + if(vp) { + tempVisMap[vp] = vp->isVisible(); + vp->setVisible(false); + } + } + tempVisMap[this] = isVisible(); + setVisible(true); + } + else if(!onoff) { + for(std::pair pair : tempVisMap) + pair.first->setVisible(pair.second); + } +} + +void ViewProviderOrigin::setTemporaryVisibility(App::DocumentObject* obj, bool onoff) +{ + Gui::ViewProvider* vp = tempVisDoc->getViewProvider(obj); + if(vp) { + vp->setVisible(onoff); + } +} + +bool ViewProviderOrigin::isTemporaryVisibilityMode() +{ + return tempVisMode; +} + + // Python feature ----------------------------------------------------------------------- diff --git a/src/Gui/ViewProviderOrigin.h b/src/Gui/ViewProviderOrigin.h index f1a96f004..9f5948e01 100644 --- a/src/Gui/ViewProviderOrigin.h +++ b/src/Gui/ViewProviderOrigin.h @@ -34,6 +34,8 @@ namespace Gui { +class Document; + class GuiExport ViewProviderOrigin : public ViewProviderGeoFeatureGroup { PROPERTY_HEADER(Gui::ViewProviderOrigin); @@ -48,6 +50,16 @@ public: virtual void unsetEdit(int ModNum); virtual QIcon getIcon(void) const; + + //temporary mode to override visibility of grouped objects + void setTemporaryVisibilityMode(bool onoff, Gui::Document* doc = NULL); + bool isTemporaryVisibilityMode(); + void setTemporaryVisibility(App::DocumentObject* obj, bool onoff); + +private: + bool tempVisMode = false; + Gui::Document* tempVisDoc; + std::map tempVisMap; }; typedef ViewProviderPythonFeatureT ViewProviderOriginPython; diff --git a/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp b/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp index fab9a2830..74e5c83b1 100644 --- a/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp +++ b/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include @@ -81,6 +83,9 @@ TaskFeaturePick::TaskFeaturePick(std::vector& objects, // These are not implemented yet ui->radioDependent->setEnabled(false); ui->radioXRef->setEnabled(false); + + auto guidoc = Gui::Application::Instance->activeDocument(); + auto origin_obj = App::GetApplication().getActiveDocument()->getObjectsOfType(); std::vector::const_iterator st = status.begin(); for (std::vector::const_iterator o = objects.begin(); o != objects.end(); o++) { @@ -88,6 +93,19 @@ TaskFeaturePick::TaskFeaturePick(std::vector& objects, QString::fromAscii(" (") + getFeatureStatusString(*st) + QString::fromAscii(")")); ui->listWidget->addItem(item); st++; + + //check if we need to set any origin in temporary visibility mode + for(App::Origin* obj : origin_obj) { + if(obj->hasObject(*o)) { + Gui::ViewProviderOrigin* vpo = static_cast(guidoc->getViewProvider(obj)); + if(!vpo->isTemporaryVisibilityMode()) + vpo->setTemporaryVisibilityMode(true, guidoc); + + vpo->setTemporaryVisibility(*o, true); + origins.push_back(vpo); + break; + } + } } groupLayout()->addWidget(proxy); @@ -97,13 +115,18 @@ TaskFeaturePick::TaskFeaturePick(std::vector& objects, TaskFeaturePick::~TaskFeaturePick() { + for(Gui::ViewProviderOrigin* vpo : origins) + vpo->setTemporaryVisibilityMode(false, NULL); } void TaskFeaturePick::updateList() { int index = 0; - + + //get all origins in temporary mode + + for (std::vector::const_iterator st = statuses.begin(); st != statuses.end(); st++) { QListWidgetItem* item = ui->listWidget->item(index); @@ -174,8 +197,8 @@ std::vector TaskFeaturePick::getFeatures() { } void TaskFeaturePick::onSelectionChanged(const Gui::SelectionChanges& msg) -{ - +{ + } //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskFeaturePick.h b/src/Mod/PartDesign/Gui/TaskFeaturePick.h index ab83ec761..81f53d7d0 100644 --- a/src/Mod/PartDesign/Gui/TaskFeaturePick.h +++ b/src/Mod/PartDesign/Gui/TaskFeaturePick.h @@ -26,12 +26,14 @@ #include #include #include +#include #include #include namespace PartDesignGui { +class SoSwitch; class Ui_TaskFeaturePick; class TaskFeaturePick : public Gui::TaskView::TaskBox, public Gui::SelectionObserver { @@ -68,6 +70,8 @@ protected Q_SLOTS: private: Ui_TaskFeaturePick* ui; QWidget* proxy; + SoSwitch* featureswitch; + std::vector origins; std::vector features; std::vector statuses;