provider: Use GListModel to track origins

And adapt to changes

It's easier to track changes if we are using GListModel than
a GList.  Also, eventually we shall have multiple providers,
and we can use GtkFlattenListModel to merge multiple origins
without manually managing pointers ourself.

Since several widgets has APIs to handle GListModels, it will
also help us create widgets from GListModels easily.
This commit is contained in:
Mohammed Sadiq
2021-02-15 11:04:34 +05:30
parent b5645c4cca
commit eda460ac15
16 changed files with 274 additions and 366 deletions

View File

@@ -35,7 +35,7 @@ struct _CallsDummyProvider
{
CallsProvider parent_instance;
GList *origins;
GListStore *origins;
};
static void calls_dummy_provider_message_source_interface_init (CallsMessageSourceInterface *iface);
@@ -61,13 +61,15 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED
static gboolean
usr1_handler (CallsDummyProvider *self)
{
CallsDummyOrigin *origin;
GListModel *model;
g_autoptr(CallsDummyOrigin) origin = NULL;
g_return_val_if_fail (self->origins != NULL, FALSE);
model = G_LIST_MODEL (self->origins);
g_return_val_if_fail (g_list_model_get_n_items (model) > 0, FALSE);
g_debug ("Received SIGUSR1, adding new incoming call");
origin = CALLS_DUMMY_ORIGIN (self->origins->data);
origin = g_list_model_get_item (model, 0);
calls_dummy_origin_create_inbound (origin, "0987654321");
return TRUE;
@@ -85,12 +87,12 @@ calls_dummy_provider_get_status (CallsProvider *provider)
return "Normal";
}
static GList *
static GListModel *
calls_dummy_provider_get_origins (CallsProvider *provider)
{
CallsDummyProvider *self = CALLS_DUMMY_PROVIDER (provider);
return g_list_copy (self->origins);
return G_LIST_MODEL (self->origins);
}
static void
@@ -111,19 +113,10 @@ constructed (GObject *object)
static void
dispose (GObject *object)
{
gpointer origin;
GList *next;
CallsDummyProvider *self = CALLS_DUMMY_PROVIDER (object);
while (self->origins != NULL) {
origin = self->origins->data;
next = self->origins->next;
g_list_free_1 (self->origins);
self->origins = next;
g_signal_emit_by_name (self, "origin-removed", origin);
g_object_unref (origin);
}
g_list_store_remove_all (self->origins);
g_clear_object (&self->origins);
G_OBJECT_CLASS (calls_dummy_provider_parent_class)->dispose (object);
}
@@ -153,6 +146,7 @@ calls_dummy_provider_message_source_interface_init (CallsMessageSourceInterface
static void
calls_dummy_provider_init (CallsDummyProvider *self)
{
self->origins = g_list_store_new (CALLS_TYPE_DUMMY_ORIGIN);
}
@@ -161,9 +155,7 @@ calls_dummy_provider_add_origin (CallsDummyProvider *self,
const gchar *name)
{
CallsDummyOrigin *origin = calls_dummy_origin_new (name);
self->origins = g_list_append (self->origins, origin);
g_signal_emit_by_name (CALLS_PROVIDER (self), "origin-added", CALLS_ORIGIN (origin));
g_list_store_append (self->origins, origin);
}