diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-04-23 21:09:16 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-04-27 09:49:25 +0200 |
commit | 1a891f2fadae01aca95157b09d6ea8e223bee1ea (patch) | |
tree | 66d84e59ea881588ddd429cdb14f2e24c69e5cb2 /vcl | |
parent | 62f6d6ee8bca918e17ae167582095f4302203bed (diff) |
Related: tdf#130326 allow bulk_insert_for_each to insert under a node
Change-Id: Iad14638a33710ef0b790c702e7eab2283726f2fb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114571
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/salvtables.hxx | 1 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 15 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 27 |
3 files changed, 33 insertions, 10 deletions
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 7f51cf5b6636..f71ce7a055b2 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1448,6 +1448,7 @@ public: virtual void bulk_insert_for_each(int nSourceCount, const std::function<void(weld::TreeIter&, int nSourceIndex)>& func, + const weld::TreeIter* pParent = nullptr, const std::vector<int>* pFixedWidths = nullptr) override; virtual void set_font_color(int pos, const Color& rColor) override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 7d9be3193c52..585fbebda541 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -3819,10 +3819,19 @@ void SalInstanceTreeView::insert_separator(int pos, const OUString& /*rId*/) void SalInstanceTreeView::bulk_insert_for_each( int nSourceCount, const std::function<void(weld::TreeIter&, int nSourceIndex)>& func, - const std::vector<int>* pFixedWidths) + const weld::TreeIter* pParent, const std::vector<int>* pFixedWidths) { + const SalInstanceTreeIter* pVclIter = static_cast<const SalInstanceTreeIter*>(pParent); + SvTreeListEntry* pVclParent = pVclIter ? pVclIter->iter : nullptr; + freeze(); - clear(); + if (!pVclParent) + clear(); + else + { + while (SvTreeListEntry* pChild = m_xTreeView->FirstChild(pVclParent)) + m_xTreeView->RemoveEntry(pChild); + } SalInstanceTreeIter aVclIter(static_cast<SvTreeListEntry*>(nullptr)); m_xTreeView->nTreeFlags |= SvTreeFlags::MANINS; @@ -3840,7 +3849,7 @@ void SalInstanceTreeView::bulk_insert_for_each( if (bHasAutoCheckButton) AddStringItem(aVclIter.iter, "", -1); aVclIter.iter->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false)); - m_xTreeView->Insert(aVclIter.iter, nullptr, TREELIST_APPEND); + m_xTreeView->Insert(aVclIter.iter, pVclParent, TREELIST_APPEND); func(aVclIter, i); if (!pFixedWidths) diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 9d408680c98b..8f261d1fdb93 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -9950,14 +9950,14 @@ void list_store_clear(GtkTreeModel* pTreeModel) gtk_list_store_clear(GTK_LIST_STORE(pTreeModel)); } -void tree_store_remove(GtkTreeModel* pTreeModel, GtkTreeIter *pIter) +bool tree_store_remove(GtkTreeModel* pTreeModel, GtkTreeIter *pIter) { - gtk_tree_store_remove(GTK_TREE_STORE(pTreeModel), pIter); + return gtk_tree_store_remove(GTK_TREE_STORE(pTreeModel), pIter); } -void list_store_remove(GtkTreeModel* pTreeModel, GtkTreeIter *pIter) +bool list_store_remove(GtkTreeModel* pTreeModel, GtkTreeIter *pIter) { - gtk_list_store_remove(GTK_LIST_STORE(pTreeModel), pIter); + return gtk_list_store_remove(GTK_LIST_STORE(pTreeModel), pIter); } void tree_store_swap(GtkTreeModel* pTreeModel, GtkTreeIter* pIter1, GtkTreeIter* pIter2) @@ -10006,7 +10006,7 @@ private: typedef void(*clearFnc)(GtkTreeModel*); clearFnc m_Clear; - typedef void(*removeFnc)(GtkTreeModel*, GtkTreeIter*); + typedef bool(*removeFnc)(GtkTreeModel*, GtkTreeIter*); removeFnc m_Remove; typedef void(*swapFnc)(GtkTreeModel*, GtkTreeIter*, GtkTreeIter*); @@ -11093,10 +11093,23 @@ public: } virtual void bulk_insert_for_each(int nSourceCount, const std::function<void(weld::TreeIter&, int nSourceIndex)>& func, + const weld::TreeIter* pParent, const std::vector<int>* pFixedWidths) override { + GtkInstanceTreeIter* pGtkIter = const_cast<GtkInstanceTreeIter*>(static_cast<const GtkInstanceTreeIter*>(pParent)); + freeze(); - clear(); + if (!pGtkIter) + clear(); + else + { + GtkTreeIter restore(pGtkIter->iter); + + if (iter_children(*pGtkIter)) + while (m_Remove(m_pTreeModel, &pGtkIter->iter)); + + pGtkIter->iter = restore; + } GtkInstanceTreeIter aGtkIter(nullptr); if (pFixedWidths) @@ -11105,7 +11118,7 @@ public: while (nSourceCount) { // tdf#125241 inserting backwards is massively faster - m_Prepend(m_pTreeModel, &aGtkIter.iter, nullptr); + m_Prepend(m_pTreeModel, &aGtkIter.iter, pGtkIter ? &pGtkIter->iter : nullptr); func(aGtkIter, --nSourceCount); } |