summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2023-01-25 13:49:49 -0800
committerChristian Hergert <chergert@redhat.com>2023-01-25 13:49:49 -0800
commit1a0867d737699b3e289ba3acd767d5596e1e3724 (patch)
tree7079638d1f0112500e1530387fc7031c7fc481c3
parent78ddac27c92c82e5e08a741fa5a2ecec999385b7 (diff)
downloadlibpeas-1a0867d737699b3e289ba3acd767d5596e1e3724.tar.gz
extension-set: implement GListModel
This implements glistmodel from the PeasExtensionSet so it can be monitored via GListModelInterface::items-changed for change and easily bound to list widgets in GTK.
-rw-r--r--libpeas/peas-extension-set.c54
1 files changed, 50 insertions, 4 deletions
diff --git a/libpeas/peas-extension-set.c b/libpeas/peas-extension-set.c
index 266a550..fa402a8 100644
--- a/libpeas/peas-extension-set.c
+++ b/libpeas/peas-extension-set.c
@@ -127,9 +127,11 @@ enum {
static guint signals[LAST_SIGNAL];
static GParamSpec *properties[N_PROPERTIES] = { NULL };
-G_DEFINE_TYPE_WITH_PRIVATE (PeasExtensionSet,
- peas_extension_set,
- G_TYPE_OBJECT)
+static void list_model_iface_init (GListModelInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (PeasExtensionSet, peas_extension_set, G_TYPE_OBJECT,
+ G_ADD_PRIVATE (PeasExtensionSet)
+ G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, list_model_iface_init))
#define GET_PRIV(o) \
(peas_extension_set_get_instance_private (o))
@@ -207,6 +209,7 @@ add_extension (PeasExtensionSet *set,
PeasExtensionSetPrivate *priv = GET_PRIV (set);
PeasExtension *exten;
ExtensionItem *item;
+ guint position;
/* Let's just ignore unloaded plugins... */
if (!peas_plugin_info_is_loaded (info))
@@ -225,7 +228,11 @@ add_extension (PeasExtensionSet *set,
item->info = info;
item->exten = exten;
+ position = priv->extensions.length;
+
g_queue_push_tail (&priv->extensions, item);
+
+ g_list_model_items_changed (G_LIST_MODEL (set), position, 0, 1);
g_signal_emit (set, signals[EXTENSION_ADDED], 0, info, exten);
}
@@ -246,8 +253,9 @@ remove_extension (PeasExtensionSet *set,
{
PeasExtensionSetPrivate *priv = GET_PRIV (set);
GList *l;
+ guint position = 0;
- for (l = priv->extensions.head; l != NULL; l = l->next)
+ for (l = priv->extensions.head; l != NULL; l = l->next, position++)
{
ExtensionItem *item = l->data;
@@ -256,6 +264,7 @@ remove_extension (PeasExtensionSet *set,
remove_extension_item (set, item);
g_queue_delete_link (&priv->extensions, l);
+ g_list_model_items_changed (G_LIST_MODEL (set), position, 1, 0);
return;
}
}
@@ -801,3 +810,40 @@ peas_extension_set_new (PeasEngine *engine,
return set;
}
+
+static guint
+peas_extension_set_get_n_items (GListModel *model)
+{
+ PeasExtensionSet *set = PEAS_EXTENSION_SET (model);
+ PeasExtensionSetPrivate *priv = GET_PRIV (set);
+
+ return priv->extensions.length;
+}
+
+static gpointer
+peas_extension_set_get_item (GListModel *model,
+ guint position)
+{
+ PeasExtensionSet *set = PEAS_EXTENSION_SET (model);
+ PeasExtensionSetPrivate *priv = GET_PRIV (set);
+
+ if (position >= priv->extensions.length)
+ return NULL;
+
+ return g_object_ref (g_queue_peek_nth (&priv->extensions, position));
+}
+
+static GType
+peas_extension_set_get_item_type (GListModel *model)
+{
+ return G_TYPE_OBJECT;
+}
+
+static void
+list_model_iface_init (GListModelInterface *iface)
+{
+ iface->get_item_type = peas_extension_set_get_item_type;
+ iface->get_item = peas_extension_set_get_item;
+ iface->get_n_items = peas_extension_set_get_n_items;
+}
+