diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui index 13bd424c85b1bc1949a9d3e3a4c46b387562bc26..e81ea5d2e39049ea51e092c058c0dd621084202d 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>576</width> - <height>400</height> + <width>626</width> + <height>429</height> </rect> </property> <property name="windowTitle"> @@ -39,18 +39,44 @@ </property> </widget> </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Layers:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="hideAllButton"> + <property name="text"> + <string>Hide All</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="showAllButton"> + <property name="text"> + <string>Show All</string> + </property> + </widget> + </item> <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <widget class="QPushButton" name="hideFilteredButton"> + <property name="text"> + <string>Hide Filtered</string> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + </widget> + </item> + <item> + <widget class="QPushButton" name="showFilteredButton"> + <property name="text"> + <string>Show Filtered</string> </property> - </spacer> + </widget> </item> </layout> </item> diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp index 0e95b31acc62e8b96a1884f3ef38bf1908af2bce..54afae0a8a36f762ab73bb23b483b473edadd790 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp @@ -38,6 +38,10 @@ ArVizWidgetController::ArVizWidgetController() connect(widget.expandButton, &QPushButton::clicked, this, &ArVizWidgetController::onExpandAll); connect(widget.collapseButton, &QPushButton::clicked, this, &ArVizWidgetController::onCollapseAll); connect(widget.filterEdit, &QLineEdit::textChanged, this, &ArVizWidgetController::onFilterTextChanged); + connect(widget.hideAllButton, &QPushButton::clicked, this, &ArVizWidgetController::onHideAll); + connect(widget.showAllButton, &QPushButton::clicked, this, &ArVizWidgetController::onShowAll); + connect(widget.hideFilteredButton, &QPushButton::clicked, this, &ArVizWidgetController::onHideFiltered); + connect(widget.showFilteredButton, &QPushButton::clicked, this, &ArVizWidgetController::onShowFiltered); // We need a callback from the visualizer, when the layers have changed @@ -210,6 +214,26 @@ void ArVizWidgetController::onExpandAll(bool) widget.layerTree->expandAll(); } +void ArVizWidgetController::onHideAll(bool) +{ + showAllLayers(false); +} + +void ArVizWidgetController::onShowAll(bool) +{ + showAllLayers(true); +} + +void ArVizWidgetController::onHideFiltered(bool) +{ + showFilteredLayers(false); +} + +void ArVizWidgetController::onShowFiltered(bool) +{ + showFilteredLayers(true); +} + void ArVizWidgetController::onFilterTextChanged(const QString& filter) { // Now we need to show these matches and hide the other items @@ -229,6 +253,46 @@ void ArVizWidgetController::onFilterTextChanged(const QString& filter) } } +void ArVizWidgetController::showAllLayers(bool visible) +{ + widget.layerTree->blockSignals(true); + + for (QTreeWidgetItemIterator iter(widget.layerTree); *iter; ++iter) + { + QTreeWidgetItem* item = *iter; + item->setCheckState(0, visible ? Qt::Checked : Qt::Unchecked); + } + + widget.layerTree->blockSignals(false); + + // Update shown/hidden layers + layerTreeChanged(nullptr, 0); +} + +void ArVizWidgetController::showFilteredLayers(bool visible) +{ + widget.layerTree->blockSignals(true); + + QString filter = widget.filterEdit->text(); + QRegExp rx(filter, Qt::CaseInsensitive, QRegExp::Wildcard); + + for (QTreeWidgetItemIterator iter(widget.layerTree); *iter; ++iter) + { + QTreeWidgetItem* item = *iter; + QString itemText = item->text(0); + bool matches = filter.size() == 0 || itemText.contains(rx); + if (matches) + { + item->setCheckState(0, visible ? Qt::Checked : Qt::Unchecked); + } + } + + widget.layerTree->blockSignals(false); + + // Update shown/hidden layers + layerTreeChanged(nullptr, 0); +} + SoNode* ArVizWidgetController::getScene() { return visualizer.root; diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h index 4c56e6917fc856453c3577abb019d8256b788c5e..13db4a5aeb7836a8207f8f7a5840b9ad6da91a98 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h @@ -111,8 +111,16 @@ namespace armarx void onCollapseAll(bool); void onExpandAll(bool); + void onHideAll(bool); + void onShowAll(bool); + void onHideFiltered(bool); + void onShowFiltered(bool); + void onFilterTextChanged(QString const& filter); + void showAllLayers(bool visible); + void showFilteredLayers(bool visible); + private: Ui::ArVizWidget widget;