include/vcl/weld/TreeView.hxx | 3 ++- vcl/inc/qt5/QtInstanceTreeView.hxx | 2 +- vcl/inc/salvtables.hxx | 2 +- vcl/qt5/QtInstanceTreeView.cxx | 2 +- vcl/source/app/salvtables.cxx | 10 ++-------- vcl/source/treelist/treelist.cxx | 12 +++--------- vcl/source/weld/TreeView.cxx | 8 ++++++++ vcl/unx/gtk3/gtkinst.cxx | 7 +------ 8 files changed, 19 insertions(+), 27 deletions(-)
New commits: commit d74c234b3dbfb68b42394847a55e69bca09a7d53 Author: Michael Weghorn <[email protected]> AuthorDate: Sun Jan 11 00:09:16 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Tue Jan 13 19:35:55 2026 +0100 vcl: Simplify SvTreeList::Prev Use the existing SvTreeListEntry::PrevSibling to get the previous sibling. Change-Id: I1b31efe03546d77c04384ce80f77202dafffb417 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196995 Reviewed-by: Michael Weghorn <[email protected]> Tested-by: Jenkins diff --git a/vcl/source/treelist/treelist.cxx b/vcl/source/treelist/treelist.cxx index f9d9106392b6..1f158e5fd04a 100644 --- a/vcl/source/treelist/treelist.cxx +++ b/vcl/source/treelist/treelist.cxx @@ -529,17 +529,11 @@ SvTreeListEntry* SvTreeList::Prev( SvTreeListEntry* pActEntry ) const { assert(pActEntry && "Entry?"); - SvTreeListEntries* pActualList = &pActEntry->pParent->m_Children; - sal_uInt32 nActualPos = pActEntry->GetChildListPos(); - - if ( nActualPos > 0 ) + if (SvTreeListEntry* pPrevSibling = pActEntry->PrevSibling()) { - pActEntry = (*pActualList)[nActualPos-1].get(); + pActEntry = pPrevSibling; while (!pActEntry->m_Children.empty()) - { - pActualList = &pActEntry->m_Children; - pActEntry = pActualList->back().get(); - } + pActEntry = pActEntry->m_Children.back().get(); return pActEntry; } if ( pActEntry->pParent == pRootItem.get() ) commit 9d055f5261b4436527eb7ad2b37fbdb201a11d4d Author: Michael Weghorn <[email protected]> AuthorDate: Sat Jan 10 21:46:57 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Tue Jan 13 19:35:48 2026 +0100 tdf#130857 weld: Filter dummy entries in base weld::TreeView::iter_children Make the so far purely virtual weld::TreeView::iter_children a new method implemented directly in the base class that wraps the new purely virtual weld::TreeView::do_iter_children. Let the new base class implementation/wrapper detect when a node is a children-on-demand-node (as described in the "expanding on-demand node details" comment above weld::TreeView::get_row_expanded) and return false right there, to unify and deduplicate the toolkit-specific implementations a bit. This is also one step to prepare for implementing support for on-demand children in the Qt implementation. Change-Id: I9c0d5e5893ebef029c0065b45b0805d009b99516 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196994 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/include/vcl/weld/TreeView.hxx b/include/vcl/weld/TreeView.hxx index 0a5ddfbaa209..6fb8b9ed8031 100644 --- a/include/vcl/weld/TreeView.hxx +++ b/include/vcl/weld/TreeView.hxx @@ -132,6 +132,7 @@ protected: using weld::ItemView::do_set_cursor; virtual void do_set_cursor(int pos) = 0; virtual void do_scroll_to_row(const TreeIter& rIter) = 0; + virtual bool do_iter_children(TreeIter& rIter) const = 0; virtual void do_set_children_on_demand(const TreeIter& rIter, bool bChildrenOnDemand) = 0; virtual void do_remove_selection() = 0; @@ -318,7 +319,7 @@ public: // set iter to point to previous node, sibling first then depth virtual bool iter_previous(TreeIter& rIter) const = 0; // set iter to point to first child node - virtual bool iter_children(TreeIter& rIter) const = 0; + bool iter_children(TreeIter& rIter) const; bool iter_nth_sibling(TreeIter& rIter, int nChild) const { bool bRet = true; diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx b/vcl/inc/qt5/QtInstanceTreeView.hxx index 4fe51d26fa2c..f7b6dcbaf15e 100644 --- a/vcl/inc/qt5/QtInstanceTreeView.hxx +++ b/vcl/inc/qt5/QtInstanceTreeView.hxx @@ -64,7 +64,7 @@ public: virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override; virtual bool iter_next(weld::TreeIter& rIter) const override; virtual bool iter_previous(weld::TreeIter& rIter) const override; - virtual bool iter_children(weld::TreeIter& rIter) const override; + virtual bool do_iter_children(weld::TreeIter& rIter) const override; virtual bool iter_parent(weld::TreeIter& rIter) const override; virtual int get_iter_depth(const weld::TreeIter& rIter) const override; diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 4b2806d1814b..10bda5c0cee1 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1732,7 +1732,7 @@ public: virtual bool iter_previous(weld::TreeIter& rIter) const override; - virtual bool iter_children(weld::TreeIter& rIter) const override; + virtual bool do_iter_children(weld::TreeIter& rIter) const override; virtual bool iter_parent(weld::TreeIter& rIter) const override; diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index f1ced87e9d0e..e59ef68c67f1 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -233,7 +233,7 @@ bool QtInstanceTreeView::iter_previous(weld::TreeIter&) const return false; } -bool QtInstanceTreeView::iter_children(weld::TreeIter& rIter) const +bool QtInstanceTreeView::do_iter_children(weld::TreeIter& rIter) const { QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter); const QModelIndex aChildIndex = m_pModel->index(0, 0, rQtIter.modelIndex()); diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index c1ff84bdfb30..c59762ec6c9e 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -4513,17 +4513,11 @@ bool SalInstanceTreeView::iter_previous(weld::TreeIter& rIter) const return rVclIter.iter != nullptr; } -bool SalInstanceTreeView::iter_children(weld::TreeIter& rIter) const +bool SalInstanceTreeView::do_iter_children(weld::TreeIter& rIter) const { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); rVclIter.iter = m_xTreeView->FirstChild(rVclIter.iter); - bool bRet = rVclIter.iter != nullptr; - if (bRet) - { - //on-demand dummy entry doesn't count - return !IsDummyEntry(rVclIter.iter); - } - return bRet; + return rVclIter.iter != nullptr; } bool SalInstanceTreeView::iter_parent(weld::TreeIter& rIter) const diff --git a/vcl/source/weld/TreeView.cxx b/vcl/source/weld/TreeView.cxx index 4662d8bc6ce1..2e2ce98baaa8 100644 --- a/vcl/source/weld/TreeView.cxx +++ b/vcl/source/weld/TreeView.cxx @@ -127,6 +127,14 @@ bool weld::TreeView::is_selected(int pos) const return false; } +bool weld::TreeView::iter_children(TreeIter& rIter) const +{ + if (get_children_on_demand(rIter)) + return false; + + return do_iter_children(rIter); +} + bool weld::TreeView::iter_has_child(const TreeIter& rIter) const { std::unique_ptr<weld::TreeIter> pIter = make_iterator(&rIter); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index f14f2e75a193..6ee98ef27d36 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -15669,17 +15669,12 @@ public: return false; } - virtual bool iter_children(weld::TreeIter& rIter) const override + virtual bool do_iter_children(weld::TreeIter& rIter) const override { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); GtkTreeIter tmp; bool ret = gtk_tree_model_iter_children(m_pTreeModel, &tmp, &rGtkIter.iter); rGtkIter.iter = tmp; - if (ret) - { - //on-demand dummy entry doesn't count - return get_text(rGtkIter, -1) != "<dummy>"; - } return ret; }
