[gtk/wip/otte/whatever: 81/83] filterlistmodel: Add gtk_filter_list_model_get_pending()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/whatever: 81/83] filterlistmodel: Add gtk_filter_list_model_get_pending()
- Date: Tue, 30 Jun 2020 02:25:01 +0000 (UTC)
commit 9dd92c6f337d5055bff56d1112669ed7576b33d0
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 e63a429b11..b05cb2af0b 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_READWRITE | 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().
+ *
+ * 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]