From 4eb8fc590cbd3411a00116c9fec58ebe83af7530 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Mon, 6 Nov 2023 19:41:27 +0100 Subject: [PATCH] Std_Transparency : Toggle transparency of objects. (#10805) * Std_Transparency : Toggle transparency of objects. * Remove "Std_ToggleTransparency" from toolbar --------- Co-authored-by: Paddle --- src/Gui/CommandView.cpp | 99 ++++++ src/Gui/Icons/Std_ToggleTransparency.svg | 380 +++++++++++++++++++++++ src/Gui/Icons/resource.qrc | 1 + src/Gui/Workbench.cpp | 5 +- 4 files changed, 483 insertions(+), 2 deletions(-) create mode 100644 src/Gui/Icons/Std_ToggleTransparency.svg diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp index 00f5243d43..8e26be7d85 100644 --- a/src/Gui/CommandView.cpp +++ b/src/Gui/CommandView.cpp @@ -48,6 +48,8 @@ #include #include #include +#include +#include #include #include #include @@ -887,6 +889,102 @@ bool StdCmdToggleVisibility::isActive() return (Gui::Selection().size() != 0); } +//=========================================================================== +// Std_ToggleTransparency +//=========================================================================== +DEF_STD_CMD_A(StdCmdToggleTransparency) + +StdCmdToggleTransparency::StdCmdToggleTransparency() + : Command("Std_ToggleTransparency") +{ + sGroup = "Standard-View"; + sMenuText = QT_TR_NOOP("Toggle transparency"); + static std::string toolTip = std::string("

") + + QT_TR_NOOP("Toggles transparency of the selected objects. You can also fine tune transparency " + "value in the Appearance taskbox (right click an object in the tree, Appearance).") + + "

"; + sToolTipText = toolTip.c_str(); + sStatusTip = sToolTipText; + sWhatsThis = "Std_ToggleTransparency"; + sPixmap = "Std_ToggleTransparency"; + sAccel = "V,T"; + eType = Alter3DView; +} + +void StdCmdToggleTransparency::activated(int iMsg) +{ + Q_UNUSED(iMsg); + getActiveGuiDocument()->openCommand(QT_TRANSLATE_NOOP("Command", "Toggle transparency")); + + std::vector sels = Gui::Selection().getCompleteSelection(); + + std::vector viewsToToggle = {}; + + for (Gui::SelectionSingleton::SelObj& sel : sels) { + App::DocumentObject* obj = sel.pObject; + if (!obj) + continue; + + if (!dynamic_cast(obj) && !dynamic_cast(obj)) { + Gui::ViewProvider* view = Application::Instance->getDocument(sel.pDoc)->getViewProvider(obj); + App::Property* prop = view->getPropertyByName("Transparency"); + if (prop && prop->getTypeId().isDerivedFrom(App::PropertyInteger::getClassTypeId())) { + viewsToToggle.push_back(view); + } + } + else { + std::function&)> addSubObjects = + [&addSubObjects](App::DocumentObject* obj, std::vector& viewsToToggle) { + if (!dynamic_cast(obj) && !dynamic_cast(obj)) { + App::Document* doc = obj->getDocument(); + Gui::ViewProvider* view = Application::Instance->getDocument(doc)->getViewProvider(obj); + App::Property* prop = view->getPropertyByName("Transparency"); + if (prop && prop->getTypeId().isDerivedFrom(App::PropertyInteger::getClassTypeId()) + && std::find(viewsToToggle.begin(), viewsToToggle.end(), view) == viewsToToggle.end()) { + viewsToToggle.push_back(view); + } + } + else { + for (App::DocumentObject* subobj : obj->getOutList()) { + addSubObjects(subobj, viewsToToggle); + } + } + }; + + addSubObjects(obj, viewsToToggle); + } + } + + bool oneTransparent = false; + for (auto* view : viewsToToggle) { + App::Property* prop = view->getPropertyByName("Transparency"); + if (prop && prop->getTypeId().isDerivedFrom(App::PropertyInteger::getClassTypeId())) { + auto* transparencyProp = dynamic_cast(prop); + int transparency = transparencyProp->getValue(); + if (transparency != 0) { + oneTransparent = true; + } + } + } + + int transparency = oneTransparent ? 0 : 70; + + for (auto* view : viewsToToggle) { + App::Property* prop = view->getPropertyByName("Transparency"); + if (prop && prop->getTypeId().isDerivedFrom(App::PropertyInteger::getClassTypeId())) { + auto* transparencyProp = dynamic_cast(prop); + transparencyProp->setValue(transparency); + } + } + + getActiveGuiDocument()->commitCommand(); +} + +bool StdCmdToggleTransparency::isActive() +{ + return (Gui::Selection().size() != 0); +} + //=========================================================================== // Std_ToggleSelectability //=========================================================================== @@ -4102,6 +4200,7 @@ void CreateViewStdCommands() rcCmdMgr.addCommand(new StdViewDockUndockFullscreen()); rcCmdMgr.addCommand(new StdCmdSetAppearance()); rcCmdMgr.addCommand(new StdCmdToggleVisibility()); + rcCmdMgr.addCommand(new StdCmdToggleTransparency()); rcCmdMgr.addCommand(new StdCmdToggleSelectability()); rcCmdMgr.addCommand(new StdCmdShowSelection()); rcCmdMgr.addCommand(new StdCmdHideSelection()); diff --git a/src/Gui/Icons/Std_ToggleTransparency.svg b/src/Gui/Icons/Std_ToggleTransparency.svg new file mode 100644 index 0000000000..d56b3bbcd6 --- /dev/null +++ b/src/Gui/Icons/Std_ToggleTransparency.svg @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Gui/Icons/resource.qrc b/src/Gui/Icons/resource.qrc index d7f3d83772..10d04069cd 100644 --- a/src/Gui/Icons/resource.qrc +++ b/src/Gui/Icons/resource.qrc @@ -190,6 +190,7 @@ Std_ToggleNavigation.svg Std_ToggleObjects.svg Std_ToggleVisibility.svg + Std_ToggleTransparency.svg Std_Tool1.svg Std_Tool2.svg Std_Tool3.svg diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index 5c26c5a977..c85f768060 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -602,7 +602,7 @@ void StdWorkbench::setupContextMenu(const char* recipient, MenuItem* item) const if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0) { *item << "Separator" << "Std_SetAppearance" << "Std_ToggleVisibility" << "Std_ToggleSelectability" << "Std_TreeSelection" - << "Std_RandomColor" << "Separator" << "Std_Delete" + << "Std_RandomColor" << "Std_ToggleTransparency" << "Separator" << "Std_Delete" << "Std_SendToPythonConsole" << "Std_TransformManip"; } } @@ -611,7 +611,7 @@ void StdWorkbench::setupContextMenu(const char* recipient, MenuItem* item) const if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0) { *item << "Std_ToggleVisibility" << "Std_ShowSelection" << "Std_HideSelection" << "Std_ToggleSelectability" << "Std_TreeSelectAllInstances" << "Separator" - << "Std_SetAppearance" << "Std_RandomColor" << "Separator" + << "Std_SetAppearance" << "Std_RandomColor" << "Std_ToggleTransparency" << "Separator" << "Std_Cut" << "Std_Copy" << "Std_Paste" << "Std_Delete" << "Std_SendToPythonConsole" << "Separator"; } @@ -708,6 +708,7 @@ MenuItem* StdWorkbench::setupMenuBar() const *view << "Std_DockOverlay"; } *view << "Separator" + << "Std_ToggleTransparency" << "Std_LinkSelectActions" << "Std_TreeViewActions" << "Std_ViewStatusBar";