[Libreoffice-commits] core.git: sc/source sc/uiconfig

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Tue Jun 16 20:34:57 UTC 2020


 sc/source/ui/cctrl/checklistmenu.cxx   |   79 +++++++++++++++++++++------------
 sc/uiconfig/scalc/ui/filterdropdown.ui |    2 
 2 files changed, 52 insertions(+), 29 deletions(-)

New commits:
commit fa4ae1b318fef5984303f5906a9391d33d46bed7
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Jun 16 14:43:52 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue Jun 16 22:34:09 2020 +0200

    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 at redhat.com>

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">


More information about the Libreoffice-commits mailing list