vcl/qt5/QtInstanceItemView.cxx | 11 +++++++-- vcl/qt5/QtInstanceTreeView.cxx | 18 ++++++++++------ vcl/source/app/salvtables.cxx | 40 ++++++++++++++++++++++++++--------- vcl/unx/gtk3/gtkinst.cxx | 46 ++++++++++++++++++++++++++++++++--------- 4 files changed, 87 insertions(+), 28 deletions(-)
New commits: commit 1105df8305f777d8acf5b85c17503659a3eeb618 Author: Michael Weghorn <[email protected]> AuthorDate: Sat Jan 10 23:00:39 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Tue Jan 13 19:36:18 2026 +0100 tdf#130857 weld: Only update iter in ItemView::get_iter_first if valid In weld::ItemView::get_iter_first, only set the passed iterator to a new value if at least one item actually exists. Otherwise leave it unchanged. See Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d Author: Michael Weghorn <[email protected]> Date: Sat Jan 10 22:39:40 2026 +0100 tdf#130857 weld: Only update iter in TreeView::iter_{children,parent} if valid for more background/context. Change-Id: Ia8537fe94644f76190cad6af044015185cac7018 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196998 Reviewed-by: Michael Weghorn <[email protected]> Tested-by: Jenkins diff --git a/vcl/qt5/QtInstanceItemView.cxx b/vcl/qt5/QtInstanceItemView.cxx index e17096387957..924156b154b5 100644 --- a/vcl/qt5/QtInstanceItemView.cxx +++ b/vcl/qt5/QtInstanceItemView.cxx @@ -26,8 +26,11 @@ bool QtInstanceItemView::get_iter_first(weld::TreeIter& rIter) const { QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter); const QModelIndex aIndex = modelIndex(0); + if (!aIndex.isValid()) + return false; + rQtIter.setModelIndex(aIndex); - return aIndex.isValid(); + return true; } bool QtInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 1d8b817964d9..a6c9e738b309 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -3523,8 +3523,12 @@ SalInstanceItemView::make_iterator(const weld::TreeIter* pOrig) const bool SalInstanceItemView::get_iter_first(weld::TreeIter& rIter) const { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); - rVclIter.iter = m_pTreeListBox->GetEntry(0); - return rVclIter.iter != nullptr; + SvTreeListEntry* pFirst = m_pTreeListBox->GetEntry(0); + if (!pFirst) + return false; + + rVclIter.iter = pFirst; + return true; } bool SalInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 43031f98132e..36abafa309a2 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -15576,7 +15576,12 @@ public: virtual bool get_iter_first(weld::TreeIter& rIter) const override { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); - return gtk_tree_model_get_iter_first(m_pTreeModel, &rGtkIter.iter); + GtkTreeIter aFirstIter; + if (!gtk_tree_model_get_iter_first(m_pTreeModel, &aFirstIter)) + return false; + + rGtkIter.iter = aFirstIter; + return true; } virtual bool iter_next_sibling(weld::TreeIter& rIter) const override @@ -16941,7 +16946,12 @@ public: { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore); - return gtk_tree_model_get_iter_first(pModel, &rGtkIter.iter); + GtkTreeIter aFirstIter; + if (!gtk_tree_model_get_iter_first(pModel, &aFirstIter)) + return false; + + rGtkIter.iter = aFirstIter; + return true; } virtual bool iter_next_sibling(weld::TreeIter& rIter) const override commit eae0dc849d06f4ca2408a591ddc16f7bfdd7ef38 Author: Michael Weghorn <[email protected]> AuthorDate: Sat Jan 10 22:55:48 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Tue Jan 13 19:36:10 2026 +0100 tdf#130857 weld: Only update iter in iter_{next,previous}_sibling if valid In weld::TreeView::iter_previous_sibling and weld::ItemView::iter_next_sibling, only set the passed iterator to a new value if a sibling actually exists. Otherwise leave it unchanged. See Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d Author: Michael Weghorn <[email protected]> Date: Sat Jan 10 22:39:40 2026 +0100 tdf#130857 weld: Only update iter in TreeView::iter_{children,parent} if valid for more background/context. Change-Id: I04137c9545e5026f2b28a8da3dd8b53937754d8d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196997 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/vcl/qt5/QtInstanceItemView.cxx b/vcl/qt5/QtInstanceItemView.cxx index fdcd928a87a3..e17096387957 100644 --- a/vcl/qt5/QtInstanceItemView.cxx +++ b/vcl/qt5/QtInstanceItemView.cxx @@ -35,9 +35,11 @@ bool QtInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter); const QModelIndex aIndex = rQtIter.modelIndex(); const QModelIndex aSiblingIndex = m_rModel.sibling(aIndex.row() + 1, 0, aIndex); - rQtIter.setModelIndex(aSiblingIndex); + if (!aSiblingIndex.isValid()) + return false; - return aSiblingIndex.isValid(); + rQtIter.setModelIndex(aSiblingIndex); + return true; } int QtInstanceItemView::get_iter_index_in_parent(const weld::TreeIter& rIter) const diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index 2d5bbe583373..c2e1f250216f 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -197,9 +197,11 @@ bool QtInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter); const QModelIndex aIndex = rQtIter.modelIndex(); const QModelIndex aSiblingIndex = m_pModel->sibling(aIndex.row() - 1, 0, aIndex); - rQtIter.setModelIndex(aSiblingIndex); + if (!aSiblingIndex.isValid()) + return false; - return aSiblingIndex.isValid(); + rQtIter.setModelIndex(aSiblingIndex); + return true; } bool QtInstanceTreeView::iter_next(weld::TreeIter& rIter) const diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 8d91d711170b..1d8b817964d9 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -3530,8 +3530,12 @@ bool SalInstanceItemView::get_iter_first(weld::TreeIter& rIter) const bool SalInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); - rVclIter.iter = rVclIter.iter->NextSibling(); - return rVclIter.iter != nullptr; + SvTreeListEntry* pSibling = rVclIter.iter->NextSibling(); + if (!pSibling) + return false; + + rVclIter.iter = pSibling; + return true; } int SalInstanceItemView::get_iter_index_in_parent(const weld::TreeIter& rIter) const @@ -4491,8 +4495,12 @@ bool SalInstanceTreeView::get_iter_abs_pos(weld::TreeIter& rIter, int nAbsPos) c bool SalInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); - rVclIter.iter = rVclIter.iter->PrevSibling(); - return rVclIter.iter != nullptr; + SvTreeListEntry* pSibling = rVclIter.iter->PrevSibling(); + if (!pSibling) + return false; + + rVclIter.iter = pSibling; + return true; } bool SalInstanceTreeView::iter_next(weld::TreeIter& rIter) const diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 8f616eeceb26..43031f98132e 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -15582,13 +15582,23 @@ public: virtual bool iter_next_sibling(weld::TreeIter& rIter) const override { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); - return gtk_tree_model_iter_next(m_pTreeModel, &rGtkIter.iter); + GtkTreeIter aTmpIter = rGtkIter.iter; + if (!gtk_tree_model_iter_next(m_pTreeModel, &aTmpIter)) + return false; + + rGtkIter.iter = aTmpIter; + return true; } virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); - return gtk_tree_model_iter_previous(m_pTreeModel, &rGtkIter.iter); + GtkTreeIter aTmpIter = rGtkIter.iter; + if (!gtk_tree_model_iter_previous(m_pTreeModel, &aTmpIter)) + return false; + + rGtkIter.iter = aTmpIter; + return true; } virtual bool iter_next(weld::TreeIter& rIter) const override @@ -16938,7 +16948,12 @@ public: { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); GtkTreeModel* pModel = GTK_TREE_MODEL(m_pTreeStore); - return gtk_tree_model_iter_next(pModel, &rGtkIter.iter); + GtkTreeIter aTmpIter = rGtkIter.iter; + if (!gtk_tree_model_iter_next(pModel, &aTmpIter)) + return false; + + rGtkIter.iter = aTmpIter; + return true; } virtual int get_iter_index_in_parent(const weld::TreeIter& rIter) const override commit 58c1a55bdad3bd06a829be585d31ff8b45181b47 Author: Michael Weghorn <[email protected]> AuthorDate: Sat Jan 10 22:39:40 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Tue Jan 13 19:36:03 2026 +0100 tdf#130857 weld: Only update iter in TreeView::iter_{children,parent} if valid In weld::TreeView::iter_children and weld::TreeView::iter_parent, only set the passed iterator to a new value if a parent/child actually exists. Otherwise leave it unchanged. This prepares for implementing weld::TreeView::iter_next directly in the base class instead of separately in each of the toolkit-specific implementations. The following similar methods will also be adjusted accordingly in upcoming commits for consistency: * ItemView::iter_next_sibling * TreeView::iter_previous_sibling * weld::ItemView::get_iter_first Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196996 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx index e59ef68c67f1..2d5bbe583373 100644 --- a/vcl/qt5/QtInstanceTreeView.cxx +++ b/vcl/qt5/QtInstanceTreeView.cxx @@ -237,18 +237,22 @@ 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()); - rQtIter.setModelIndex(aChildIndex); + if (!aChildIndex.isValid()) + return false; - return aChildIndex.isValid(); + rQtIter.setModelIndex(aChildIndex); + return true; } bool QtInstanceTreeView::iter_parent(weld::TreeIter& rIter) const { QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter); const QModelIndex aParentIndex = rQtIter.modelIndex().parent(); - rQtIter.setModelIndex(aParentIndex); + if (!aParentIndex.isValid()) + return false; - return aParentIndex.isValid(); + rQtIter.setModelIndex(aParentIndex); + return true; } int QtInstanceTreeView::get_iter_depth(const weld::TreeIter& rIter) const diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index c59762ec6c9e..8d91d711170b 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -4516,15 +4516,23 @@ bool SalInstanceTreeView::iter_previous(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); - return rVclIter.iter != nullptr; + SvTreeListEntry* pChild = m_xTreeView->FirstChild(rVclIter.iter); + if (!pChild) + return false; + + rVclIter.iter = pChild; + return true; } bool SalInstanceTreeView::iter_parent(weld::TreeIter& rIter) const { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); - rVclIter.iter = m_xTreeView->GetParent(rVclIter.iter); - return rVclIter.iter != nullptr; + SvTreeListEntry* pParent = m_xTreeView->GetParent(rVclIter.iter); + if (!pParent) + return false; + + rVclIter.iter = pParent; + return true; } void SalInstanceTreeView::do_select(const weld::TreeIter& rIter) diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 6ee98ef27d36..8f616eeceb26 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -15673,18 +15673,21 @@ public: { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); GtkTreeIter tmp; - bool ret = gtk_tree_model_iter_children(m_pTreeModel, &tmp, &rGtkIter.iter); + if (!gtk_tree_model_iter_children(m_pTreeModel, &tmp, &rGtkIter.iter)) + return false; rGtkIter.iter = tmp; - return ret; + return true; } virtual bool iter_parent(weld::TreeIter& rIter) const override { GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter); GtkTreeIter tmp; - bool ret = gtk_tree_model_iter_parent(m_pTreeModel, &tmp, &rGtkIter.iter); + if (!gtk_tree_model_iter_parent(m_pTreeModel, &tmp, &rGtkIter.iter)) + return false; + rGtkIter.iter = tmp; - return ret; + return true; } virtual void do_remove(const weld::TreeIter& rIter) override
