diff --git a/src/app/widget_gui_document.cpp b/src/app/widget_gui_document.cpp index 78d7cd69..9ae2aa21 100644 --- a/src/app/widget_gui_document.cpp +++ b/src/app/widget_gui_document.cpp @@ -28,6 +28,9 @@ #include #include +#include +#include + namespace Mayo { namespace { @@ -70,6 +73,18 @@ class MenuIconSizeStyle : public QProxyStyle { // Default margin to be used in widgets const int Internal_widgetMargin = 4; +std::vector getSelectedNodeIds(const GuiDocument* guiDoc) +{ + std::vector nodeIds; + const GuiApplication* guiApp = guiDoc->guiApplication(); + for (const ApplicationItem& appItem : guiApp->selectionModel()->selectedItems()) { + if (appItem.isDocumentTreeNode() && appItem.document() == guiDoc->document()) + nodeIds.push_back(appItem.documentTreeNode().id()); + } + + return nodeIds; +} + } // namespace WidgetGuiDocument::WidgetGuiDocument(GuiDocument* guiDoc, QWidget* parent) @@ -139,6 +154,20 @@ WidgetGuiDocument::WidgetGuiDocument(GuiDocument* guiDoc, QWidget* parent) auto mode = on ? GraphicsScene::SelectionMode::Multi : GraphicsScene::SelectionMode::Single; gfxScene->setSelectionMode(mode); }); + m_controller->signalToggleSelectionVisibilityRequested.connectSlot([=]{ + const auto vecSelectedNodeId = getSelectedNodeIds(m_guiDoc); + if (vecSelectedNodeId.empty()) + return; + + const bool allSelectedItemVisible = std::all_of( + vecSelectedNodeId.cbegin(), vecSelectedNodeId.cend(), + [=](TreeNodeId nodeId) { return m_guiDoc->nodeVisibleState(nodeId) == CheckState::On; } + ); + for (TreeNodeId nodeId : vecSelectedNodeId) + m_guiDoc->setNodeVisible(nodeId, !allSelectedItemVisible); + + m_guiDoc->graphicsScene()->redraw(); + }); m_guiDoc->viewCameraAnimation()->setBackend(std::make_unique(QEasingCurve::OutExpo)); m_guiDoc->viewCameraAnimation()->setRenderFunction([=](const OccHandle& view){ @@ -399,15 +428,7 @@ void WidgetGuiDocument::createMenuItemVisibility(QWidget* container) const DocumentPtr doc = m_guiDoc->document(); // Helper function to get the selected tree nodes(ids) in the document - auto fnGetDocSelectedNodeIds = [=]() -> std::vector { - std::vector nodeIds; - const GuiApplication* guiApp = m_guiDoc->guiApplication(); - for (const ApplicationItem& appItem : guiApp->selectionModel()->selectedItems()) { - if (appItem.isDocumentTreeNode() && appItem.document() == m_guiDoc->document()) - nodeIds.push_back(appItem.documentTreeNode().id()); - } - return nodeIds; - }; + auto fnGetDocSelectedNodeIds = [=] { return getSelectedNodeIds(m_guiDoc); }; // "Show all" action QObject::connect(actionShowAll, &QAction::triggered, this, [=]{ diff --git a/src/app/widget_occ_view_controller.cpp b/src/app/widget_occ_view_controller.cpp index fbb82881..ede753c6 100644 --- a/src/app/widget_occ_view_controller.cpp +++ b/src/app/widget_occ_view_controller.cpp @@ -210,6 +210,9 @@ void WidgetOccViewController::handleKeyPress(const QKeyEvent* event) return; m_inputSequence.push(event->key()); + if (m_inputSequence.equal({ Qt::Key_H })) + this->signalToggleSelectionVisibilityRequested.send(); + if (m_inputSequence.equal({ Qt::Key_Space })) this->startInstantZoom(toPosition(m_occView->widget()->mapFromGlobal(QCursor::pos()))); diff --git a/src/gui/v3d_view_controller.h b/src/gui/v3d_view_controller.h index 4017a038..b8470264 100644 --- a/src/gui/v3d_view_controller.h +++ b/src/gui/v3d_view_controller.h @@ -56,6 +56,7 @@ class V3dViewController { Signal signalMouseMoved; // x,y: mouse position in view Signal signalMouseButtonClicked; Signal signalMultiSelectionToggled; + Signal<> signalToggleSelectionVisibilityRequested; protected: struct Position { int x; int y; };