From 20c628fc0c45f5ed3a35c6cadbf6dcbd8447670b Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sat, 17 Aug 2019 11:50:05 +0800 Subject: [PATCH] Gui: fix tree view selection focus problem --- src/Gui/Tree.cpp | 23 ++++++++++++----------- src/Gui/Tree.h | 1 + 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 4933aec7ada0..45baa87206c4 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -2207,19 +2207,18 @@ void TreeWidget::slotActiveDocument(const Gui::Document& Doc) } } -static int _UpdateBlocked; - struct UpdateDisabler { QWidget &widget; + int &blocked; bool visible; bool focus; // Note! DO NOT block signal here, or else // QTreeWidgetItem::setChildIndicatorPolicy() does not work - UpdateDisabler(QWidget &w) - :widget(w) + UpdateDisabler(QWidget &w, int &blocked) + :widget(w),blocked(blocked) { - if(++_UpdateBlocked > 1) + if(++blocked > 1) return; focus = widget.hasFocus(); visible = widget.isVisible(); @@ -2234,7 +2233,7 @@ struct UpdateDisabler { } } ~UpdateDisabler() { - if(_UpdateBlocked<=0 || --_UpdateBlocked!=0) + if(blocked<=0 || --blocked!=0) return; if(visible) { @@ -2267,7 +2266,7 @@ void TreeWidget::onUpdateStatus(void) FC_LOG("begin update status"); - UpdateDisabler disabler(*this); + UpdateDisabler disabler(*this,updateBlocked); std::vector errors; @@ -2450,7 +2449,7 @@ void TreeWidget::onItemEntered(QTreeWidgetItem * item) } void TreeWidget::leaveEvent(QEvent *) { - if(!_UpdateBlocked && FC_TREEPARAM(PreSelection)) { + if(!updateBlocked && FC_TREEPARAM(PreSelection)) { preselectTimer->stop(); Selection().rmvPreselect(); } @@ -2608,8 +2607,10 @@ void TreeWidget::setupText() { void TreeWidget::syncView(ViewProviderDocumentObject *vp) { if(currentDocItem && FC_TREEPARAM(SyncView)) { + bool focus = hasFocus(); currentDocItem->document()->setActiveView(vp); - setFocus(); + if(focus) + setFocus(); } } @@ -2644,7 +2645,7 @@ void TreeWidget::onItemSelectionChanged () { if (!this->isConnectionAttached() || this->isConnectionBlocked() - || _UpdateBlocked) + || updateBlocked) return; _LastSelectedTreeWidget = this; @@ -3123,7 +3124,7 @@ void TreeWidget::slotDeleteDocument(const Gui::Document& Doc) NewObjects.erase(Doc.getDocument()->getName()); auto it = DocumentMap.find(&Doc); if (it != DocumentMap.end()) { - UpdateDisabler disabler(*this); + UpdateDisabler disabler(*this,updateBlocked); auto docItem = it->second; for(auto &v : docItem->ObjectMap) { for(auto item : v.second->items) diff --git a/src/Gui/Tree.h b/src/Gui/Tree.h index 30261c7fecd7..47d854462788 100644 --- a/src/Gui/Tree.h +++ b/src/Gui/Tree.h @@ -241,6 +241,7 @@ private Q_SLOTS: static std::set Instances; std::string myName; // for debugging purpose + int updateBlocked = 0; friend class DocumentItem; friend class DocumentObjectItem;