summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-04-23 21:09:16 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-04-27 09:49:25 +0200
commit1a891f2fadae01aca95157b09d6ea8e223bee1ea (patch)
tree66d84e59ea881588ddd429cdb14f2e24c69e5cb2 /vcl
parent62f6d6ee8bca918e17ae167582095f4302203bed (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.hxx1
-rw-r--r--vcl/source/app/salvtables.cxx15
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx27
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);
}