[gtk/emoji-grid: 31/34] filterlistmodel: Support sections




commit c5275ae165417380b405bb50e2a4f86f75a9d9ea
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Feb 26 14:59:43 2022 -0500

    filterlistmodel: Support sections
    
    Propagate sections from the child model to
    the filter model.

 gtk/gtkfilterlistmodel.c | 69 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 65 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkfilterlistmodel.c b/gtk/gtkfilterlistmodel.c
index 1c03dfb617..bccdc3ffd1 100644
--- a/gtk/gtkfilterlistmodel.c
+++ b/gtk/gtkfilterlistmodel.c
@@ -24,6 +24,7 @@
 #include "gtkbitset.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
+#include "gtksectionmodelprivate.h"
 
 /**
  * GtkFilterListModel:
@@ -134,8 +135,68 @@ gtk_filter_list_model_model_init (GListModelInterface *iface)
   iface->get_item = gtk_filter_list_model_get_item;
 }
 
+static void
+gtk_filter_list_model_get_section (GtkSectionModel *model,
+                                   guint            position,
+                                   guint           *out_start,
+                                   guint           *out_end)
+{
+  GtkFilterListModel *self = GTK_FILTER_LIST_MODEL (model);
+  guint n_items;
+  guint pos, start, end;
+
+  switch (self->strictness)
+    {
+    case GTK_FILTER_MATCH_NONE:
+      *out_start = 0;
+      *out_end = G_MAXUINT;
+      return;
+
+    case GTK_FILTER_MATCH_ALL:
+      gtk_list_model_get_section (self->model, position, out_start, out_end);
+      return;
+
+    case GTK_FILTER_MATCH_SOME:
+      n_items = gtk_bitset_get_size (self->matches);
+      if (position >= n_items)
+        {
+          *out_start = n_items;
+          *out_end = G_MAXUINT;
+          return;
+        }
+      if (!GTK_IS_SECTION_MODEL (self->model))
+        {
+          *out_start = 0;
+          *out_end = n_items;
+          return;
+        }
+
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
+
+  /* if we get here, we have a section model, and are MATCH_SOME */
+
+  pos = gtk_bitset_get_nth (self->matches, position);
+  gtk_list_model_get_section (self->model, pos, &start, &end);
+  if (start == 0)
+    *out_start = 0;
+  else
+    *out_start = gtk_bitset_get_size_in_range (self->matches, 0, start - 1);
+  *out_end = *out_start + gtk_bitset_get_size_in_range (self->matches, start, end - 1);
+}
+
+static void
+gtk_filter_list_model_section_model_init (GtkSectionModelInterface *iface)
+{
+  iface->get_section = gtk_filter_list_model_get_section;
+}
+
 G_DEFINE_TYPE_WITH_CODE (GtkFilterListModel, gtk_filter_list_model, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_filter_list_model_model_init))
+                         G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_filter_list_model_model_init)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_SECTION_MODEL, 
gtk_filter_list_model_section_model_init))
 
 static gboolean
 gtk_filter_list_model_run_filter_on_item (GtkFilterListModel *self,
@@ -163,7 +224,7 @@ gtk_filter_list_model_run_filter (GtkFilterListModel *self,
   gboolean more;
 
   g_return_if_fail (GTK_IS_FILTER_LIST_MODEL (self));
-  
+
   if (self->pending == NULL)
     return;
 
@@ -346,7 +407,7 @@ gtk_filter_list_model_set_property (GObject      *object,
     }
 }
 
-static void 
+static void
 gtk_filter_list_model_get_property (GObject     *object,
                                     guint        prop_id,
                                     GValue      *value,
@@ -473,7 +534,7 @@ gtk_filter_list_model_refilter (GtkFilterListModel *self,
     case GTK_FILTER_MATCH_SOME:
       {
         GtkBitset *old, *pending;
-      
+
         if (self->matches == NULL)
           {
             if (self->strictness == GTK_FILTER_MATCH_ALL)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]