From 92a8e0e3d8f3845e5007f95f4c94bf1c83f50ff6 Mon Sep 17 00:00:00 2001 From: 0penBrain <48731257+0penBrain@users.noreply.github.com> Date: Thu, 2 Dec 2021 17:38:36 +0100 Subject: [PATCH] [Gui] Tree: implement collapse/expand system with keys Implemented using Alt modifier + arrow keys * Alt+Left : collapse selected items * Alt+Right : expand selected items * Alt+Up : expand selected items with all tier-1 children collapsed * Alt+Down : expand selected items with all tier-1 children expanded --- src/Gui/Tree.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/Gui/Tree.h | 2 ++ 2 files changed, 46 insertions(+) diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 6d400dbf66..f02f0a5f87 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -1372,6 +1372,38 @@ void TreeWidget::keyPressEvent(QKeyEvent *event) event->accept(); onSearchObjects(); return; + }else if(event->modifiers() == Qt::AltModifier) { + if(event->key() == Qt::Key_Left) { + for(auto &item: selectedItems()) { + item->setExpanded(false); + } + event->accept(); + return; + }else if(event->key() == Qt::Key_Right) { + for(auto &item: selectedItems()) { + item->setExpanded(true); + } + event->accept(); + return; + }else if(event->key() == Qt::Key_Up) { + for(auto &item: selectedItems()) { + item->setExpanded(true); + for (auto &child: childrenOfItem(*item)) { + child->setExpanded(false); + } + } + event->accept(); + return; + }else if(event->key() == Qt::Key_Down) { + for(auto &item: selectedItems()) { + item->setExpanded(true); + for (auto &child: childrenOfItem(*item)) { + child->setExpanded(true); + } + } + event->accept(); + return; + } }else if(event->key() == Qt::Key_Left) { auto index = currentIndex(); if(index.column()==1) { @@ -2915,6 +2947,18 @@ void TreeWidget::synchronizeSelectionCheckBoxes() { resizeColumnToContents(0); } +QList TreeWidget::childrenOfItem(const QTreeWidgetItem &item) const{ + QList children = QList(); + + // check item is in this tree + if (!this->indexFromItem(&item).isValid()) return children; + + for (int i=0 ; i < item.childCount() ; i++) { + children.append(item.child(i)); + } + return children; +} + void TreeWidget::onItemChanged(QTreeWidgetItem *item, int column) { if (column == 0 && isSelectionCheckBoxesEnabled()) { bool selected = item->isSelected(); diff --git a/src/Gui/Tree.h b/src/Gui/Tree.h index f644f81a64..d2b4575757 100644 --- a/src/Gui/Tree.h +++ b/src/Gui/Tree.h @@ -131,6 +131,8 @@ public: void synchronizeSelectionCheckBoxes(); + QList childrenOfItem(const QTreeWidgetItem &item) const; + protected: /// Observer message from the Selection void onSelectionChanged(const SelectionChanges& msg) override;