From 50f4c012b4d45a4d34055f0be1a48de6e293c9a8 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Thu, 14 Nov 2019 11:57:32 +0800 Subject: [PATCH] Gui: change tree view select all behavior Only select all objects of the current document --- src/Gui/Tree.cpp | 46 +++++++++++++++++++++++++--------------------- src/Gui/Tree.h | 2 ++ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 0aeea68e8c98..800ca145c05c 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -569,6 +569,21 @@ const char *TreeWidget::getTreeName() const { return myName.c_str(); } +// reimpelement to select only objects in the active document +void TreeWidget::selectAll() { + auto gdoc = Application::Instance->getDocument( + App::GetApplication().getActiveDocument()); + if(!gdoc) + return; + auto itDoc = DocumentMap.find(gdoc); + if(itDoc == DocumentMap.end()) + return; + if(TreeParams::Instance()->RecordSelection()) + Gui::Selection().selStackPush(); + Gui::Selection().clearSelection(); + Gui::Selection().setSelection(gdoc->getDocument()->getName(),gdoc->getDocument()->getObjects()); +} + bool TreeWidget::isObjectShowable(App::DocumentObject *obj) { if(!obj || !obj->getNameInDocument()) return true; @@ -2696,29 +2711,18 @@ void TreeWidget::onItemSelectionChanged () auto selItems = selectedItems(); // do not allow document item multi-selection - auto itDoc = selItems.end(); - auto itObj = selItems.end(); - for(auto it=selItems.begin();it!=selItems.end();) { - auto item = *it; - if(item->type() == ObjectType) { - itObj = it; - if(itDoc!=selItems.end()) { - (*itDoc)->setSelected(false); - selItems.erase(itDoc); - itDoc = selItems.end(); - } - }else if(item->type() == DocumentType) { - if(itObj!=selItems.end()) { + if(selItems.size()) { + auto firstType = selItems.back()->type(); + for(auto it=selItems.begin();it!=selItems.end();) { + auto item = *it; + if((firstType==ObjectType && item->type()!=ObjectType) + || (firstType==DocumentType && item!=selItems.back())) + { item->setSelected(false); it = selItems.erase(it); - continue; - }else if(itDoc!=selItems.end()) { - (*itDoc)->setSelected(false); - selItems.erase(itDoc); - } - itDoc = it; + } else + ++it; } - ++it; } if(selItems.size()<=1) { @@ -4176,7 +4180,7 @@ DocumentObjectItem *DocumentItem::findItem( void DocumentItem::selectItems(SelectionReason reason) { const auto &sels = Selection().getSelection(pDocument->getDocument()->getName(),false); - bool sync = reason==SR_SELECT?false:true; + bool sync = (sels.size()>50 || reason==SR_SELECT)?false:true; for(const auto &sel : sels) findItemByObject(sync,sel.pObject,sel.SubName,true); diff --git a/src/Gui/Tree.h b/src/Gui/Tree.h index 2335ea4198db..4da8e8f62ed4 100644 --- a/src/Gui/Tree.h +++ b/src/Gui/Tree.h @@ -108,6 +108,8 @@ class TreeWidget : public QTreeWidget, public SelectionObserver void markItem(const App::DocumentObject* Obj,bool mark); void syncView(ViewProviderDocumentObject *vp); + virtual void selectAll() override; + const char *getTreeName() const; static void updateStatus(bool delay=true);