diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-06-16 14:43:52 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-06-16 22:34:09 +0200 |
commit | fa4ae1b318fef5984303f5906a9391d33d46bed7 (patch) | |
tree | 991049d636d54ad5e7a68d39794c4f0c76e41f9b | |
parent | 84eef89a1c8efca6b77ca161b6525cd1a6bb49f5 (diff) |
tdf#134038 insert in optimal order
Change-Id: I7b3d2b7bb37f4a7de118b4654f63bcc18a24b855
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96473
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sc/source/ui/cctrl/checklistmenu.cxx | 79 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/filterdropdown.ui | 2 |
2 files changed, 52 insertions, 29 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx index 7a4d8348f913..f095e66c2e6d 100644 --- a/sc/source/ui/cctrl/checklistmenu.cxx +++ b/sc/source/ui/cctrl/checklistmenu.cxx @@ -1161,43 +1161,71 @@ void ScCheckListMenuControl::setHasDates(bool bHasDates) mxChecks->set_show_expanders(mbHasDates); } +namespace +{ + void insertMember(weld::TreeView& rView, weld::TreeIter& rIter, const ScCheckListMember& rMember) + { + OUString aLabel = rMember.maName; + if (aLabel.isEmpty()) + aLabel = ScResId(STR_EMPTYDATA); + rView.set_toggle(rIter, rMember.mbVisible ? TRISTATE_TRUE : TRISTATE_FALSE); + rView.set_text(rIter, aLabel, 0); + } +} + size_t ScCheckListMenuControl::initMembers() { size_t n = maMembers.size(); size_t nVisMemCount = 0; - mxChecks->freeze(); + if (!mxChecks->n_children() && !mbHasDates) + { + // tdf#134038 insert in the fastest order, this might be backwards so only do it for + // the !mbHasDates case where no entry depends on another to exist before getting + // inserted. We cannot retain pre-existing treeview content, only clear and fill it. + mxChecks->bulk_insert_for_each(n, [this, &nVisMemCount](weld::TreeIter& rIter, int i) { + assert(!maMembers[i].mbDate); + insertMember(*mxChecks, rIter, maMembers[i]); + if (maMembers[i].mbVisible) + ++nVisMemCount; + }); + } + else + { + mxChecks->freeze(); - std::unique_ptr<weld::TreeIter> xEntry = mxChecks->make_iterator(); - std::vector<std::unique_ptr<weld::TreeIter>> aExpandRows; + std::unique_ptr<weld::TreeIter> xEntry = mxChecks->make_iterator(); + std::vector<std::unique_ptr<weld::TreeIter>> aExpandRows; - for (size_t i = 0; i < n; ++i) - { - if (maMembers[i].mbDate) + for (size_t i = 0; i < n; ++i) { - CheckEntry(maMembers[i].maName, maMembers[i].mxParent.get(), maMembers[i].mbVisible); - // Expand first node of checked dates - if (!maMembers[i].mxParent && IsChecked(maMembers[i].maName, maMembers[i].mxParent.get())) + if (maMembers[i].mbDate) { - std::unique_ptr<weld::TreeIter> xDateEntry = FindEntry(nullptr, maMembers[i].maName); - if (xDateEntry) - aExpandRows.emplace_back(std::move(xDateEntry)); + CheckEntry(maMembers[i].maName, maMembers[i].mxParent.get(), maMembers[i].mbVisible); + // Expand first node of checked dates + if (!maMembers[i].mxParent && IsChecked(maMembers[i].maName, maMembers[i].mxParent.get())) + { + std::unique_ptr<weld::TreeIter> xDateEntry = FindEntry(nullptr, maMembers[i].maName); + if (xDateEntry) + aExpandRows.emplace_back(std::move(xDateEntry)); + } + } + else + { + mxChecks->append(xEntry.get()); + insertMember(*mxChecks, *xEntry, maMembers[i]); } - } - else - { - OUString aLabel = maMembers[i].maName; - if (aLabel.isEmpty()) - aLabel = ScResId(STR_EMPTYDATA); - mxChecks->append(xEntry.get()); - mxChecks->set_toggle(*xEntry, maMembers[i].mbVisible ? TRISTATE_TRUE : TRISTATE_FALSE); - mxChecks->set_text(*xEntry, aLabel, 0); + if (maMembers[i].mbVisible) + ++nVisMemCount; } - if (maMembers[i].mbVisible) - ++nVisMemCount; + mxChecks->thaw(); + + for (auto& rRow : aExpandRows) + mxChecks->expand_row(*rRow); } + if (nVisMemCount == n) { // all members visible @@ -1216,11 +1244,6 @@ size_t ScCheckListMenuControl::initMembers() mePrevToggleAllState = TRISTATE_INDET; } - mxChecks->thaw(); - - for (auto& rRow : aExpandRows) - mxChecks->expand_row(*rRow); - if (nVisMemCount) mxChecks->select(0); diff --git a/sc/uiconfig/scalc/ui/filterdropdown.ui b/sc/uiconfig/scalc/ui/filterdropdown.ui index c37771a2116c..b6a3e4f77d0e 100644 --- a/sc/uiconfig/scalc/ui/filterdropdown.ui +++ b/sc/uiconfig/scalc/ui/filterdropdown.ui @@ -198,7 +198,7 @@ <property name="can_focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> - <property name="hscrollbar_policy">never</property> + <property name="hscrollbar_policy">external</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="check_list_box"> |