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 <m.weghorn@posteo.de>
This commit is contained in:
Michael Weghorn
2026-01-13 19:35:48 +01:00
parent ec8a326453
commit 9d055f5261
7 changed files with 16 additions and 18 deletions
+2 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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());
+2 -8
View File
@@ -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
+8
View File
@@ -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);
+1 -6
View File
@@ -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;
}