[gtk/wip/otte/whatever: 5/15] filterlistmodel: Add gtk_filter_list_model_get_pending()



commit 1dd08ad8db875d62f7983ece14b1f6381c519404
Author: Benjamin Otte <otte redhat com>
Date:   Tue Jun 30 04:01:39 2020 +0200

    filterlistmodel: Add gtk_filter_list_model_get_pending()
    
    This allows tracking if the model is busy filtering.

 docs/reference/gtk/gtk4-sections.txt |  1 +
 gtk/gtkfilterlistmodel.c             | 51 ++++++++++++++++++++++++++++++++++++
 gtk/gtkfilterlistmodel.h             |  2 ++
 3 files changed, 54 insertions(+)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index e543f24b8e..91964e7fad 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1546,6 +1546,7 @@ gtk_filter_list_model_set_filter
 gtk_filter_list_model_get_filter
 gtk_filter_list_model_set_incremental
 gtk_filter_list_model_get_incremental
+gtk_filter_list_model_get_pending
 <SUBSECTION Standard>
 GTK_FILTER_LIST_MODEL
 GTK_IS_FILTER_LIST_MODEL
diff --git a/gtk/gtkfilterlistmodel.c b/gtk/gtkfilterlistmodel.c
index 9240933f6c..e553a5bb31 100644
--- a/gtk/gtkfilterlistmodel.c
+++ b/gtk/gtkfilterlistmodel.c
@@ -47,6 +47,7 @@ enum {
   PROP_INCREMENTAL,
   PROP_ITEM_TYPE,
   PROP_MODEL,
+  PROP_PENDING,
   NUM_PROPERTIES
 };
 
@@ -184,6 +185,7 @@ gtk_filter_list_model_run_filter (GtkFilterListModel *self,
     gtk_bitset_remove_range_closed (self->pending, 0, pos);
   else
     g_clear_pointer (&self->pending, gtk_bitset_unref);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
 
   return;
 }
@@ -191,8 +193,13 @@ gtk_filter_list_model_run_filter (GtkFilterListModel *self,
 static void
 gtk_filter_list_model_stop_filtering (GtkFilterListModel *self)
 {
+  gboolean notify_pending = self->pending != NULL;
+
   g_clear_pointer (&self->pending, gtk_bitset_unref);
   g_clear_handle_id (&self->pending_cb, g_source_remove);
+
+  if (notify_pending)
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
 }
 
 static void
@@ -244,6 +251,7 @@ gtk_filter_list_model_start_filtering (GtkFilterListModel *self,
     {
       gtk_bitset_union (self->pending, items);
       gtk_bitset_unref (items);
+      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
       return;
     }
 
@@ -262,6 +270,7 @@ gtk_filter_list_model_start_filtering (GtkFilterListModel *self,
       return;
     }
 
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
   g_assert (self->pending_cb == 0);
   self->pending_cb = g_idle_add (gtk_filter_list_model_run_filter_cb, self);
   g_source_set_name_by_id (self->pending_cb, "[gtk] gtk_filter_list_model_run_filter_cb");
@@ -368,6 +377,10 @@ gtk_filter_list_model_get_property (GObject     *object,
       g_value_set_object (value, self->model);
       break;
 
+    case PROP_PENDING:
+      g_value_set_uint (value, gtk_filter_list_model_get_pending (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -579,6 +592,18 @@ gtk_filter_list_model_class_init (GtkFilterListModelClass *class)
                            G_TYPE_LIST_MODEL,
                            GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkFilterListModel:pending:
+   *
+   * Number of items not yet filtered
+   */
+  properties[PROP_PENDING] =
+      g_param_spec_uint ("pending",
+                         P_("Pending"),
+                         P_("Number of items not yet filtered"),
+                         0, G_MAXUINT, 0,
+                         GTK_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
 }
 
@@ -822,3 +847,29 @@ gtk_filter_list_model_get_incremental (GtkFilterListModel *self)
 
   return self->incremental;
 }
+
+/**
+ * gtk_filter_list_model_get_pending:
+ * @self: a #GtkFilterListModel
+ *
+ * Returns the number of items that have not been filtered yet.
+ *
+ * When incremental filtering is not enabled, this always returns 0.
+ *
+ * You can use this value to check if @self is busy filtering by
+ * comparing the return value to 0 or you can compute the percentage
+ * of the filter remaining by dividing the return value by
+ * g_list_model_get_n_items(gtk_filter_list_model_get_model (self)).
+ *
+ * Returns: The number of items not yet filtered
+ **/
+guint
+gtk_filter_list_model_get_pending (GtkFilterListModel *self)
+{
+  g_return_val_if_fail (GTK_IS_FILTER_LIST_MODEL (self), FALSE);
+
+  if (self->pending == NULL)
+    return 0;
+
+  return gtk_bitset_get_size (self->pending);
+}
diff --git a/gtk/gtkfilterlistmodel.h b/gtk/gtkfilterlistmodel.h
index 2bf986b05e..9c2c063e94 100644
--- a/gtk/gtkfilterlistmodel.h
+++ b/gtk/gtkfilterlistmodel.h
@@ -57,6 +57,8 @@ void                    gtk_filter_list_model_set_incremental   (GtkFilterListMo
                                                                  gboolean                incremental);
 GDK_AVAILABLE_IN_ALL
 gboolean                gtk_filter_list_model_get_incremental   (GtkFilterListModel     *self);
+GDK_AVAILABLE_IN_ALL
+guint                   gtk_filter_list_model_get_pending       (GtkFilterListModel     *self);
 
 
 G_END_DECLS


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