search/model: Port to GListModel

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/742>
This commit is contained in:
Georges Basile Stavracas Neto
2026-05-03 16:57:52 +00:00
committed by Marge Bot
parent 34e28e31fe
commit 807f5608b1
+41 -39
View File
@@ -40,7 +40,8 @@ struct _GcalSearchModel
GDateTime *range_start;
GDateTime *range_end;
GListModel *model;
GtkMapListModel *map_model;
GtkSortListModel *sort_model;
GTimer *timer;
guint idle_id;
@@ -73,7 +74,7 @@ check_for_search_hits_cb (gpointer user_data)
goto stop_idle;
if (g_timer_elapsed (self->timer, NULL) >= WAIT_FOR_RESULTS_MS ||
g_list_model_get_n_items (self->model) >= MIN_RESULTS)
g_list_model_get_n_items (G_LIST_MODEL (self->sort_model)) >= MIN_RESULTS)
{
g_task_return_boolean (task, TRUE);
goto stop_idle;
@@ -108,16 +109,6 @@ compare_search_hits_cb (gconstpointer a,
return gcal_search_hit_compare (hit_a, hit_b);
}
static gboolean
search_hits_equals_cb (gconstpointer a,
gconstpointer b)
{
GcalSearchHit *search_hit_a = GCAL_SEARCH_HIT ((gpointer) a);
GcalSearchHit *search_hit_b = GCAL_SEARCH_HIT ((gpointer) b);
return gcal_search_hit_compare (search_hit_a, search_hit_b) == 0;
}
static void
on_search_model_items_changed_cb (GListModel *model,
guint position,
@@ -128,6 +119,20 @@ on_search_model_items_changed_cb (GListModel *model,
g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added);
}
static gpointer
event_to_search_hit_func (gpointer item,
gpointer user_data)
{
g_autoptr (GcalSearchHitEvent) search_hit = NULL;
g_assert (GCAL_IS_EVENT (item));
search_hit = gcal_search_hit_event_new (item);
g_object_unref (item);
return g_steal_pointer (&search_hit);
}
/*
* GcalTimelineSubscriber interface
@@ -145,28 +150,6 @@ static void
gcal_search_model_add_event (GcalTimelineSubscriber *subscriber,
GcalEvent *event)
{
g_autoptr (GcalSearchHitEvent) search_hit = NULL;
GcalSearchModel *self;
gboolean found;
self = GCAL_SEARCH_MODEL (subscriber);
GCAL_TRACE_MSG ("Adding search hit '%s'", gcal_event_get_summary (event));
search_hit = gcal_search_hit_event_new (event);
found = g_list_store_find_with_equal_func (G_LIST_STORE (self->model),
search_hit,
search_hits_equals_cb,
NULL);
if (found)
return;
g_list_store_insert_sorted (G_LIST_STORE (self->model),
search_hit,
compare_search_hits_cb,
self);
}
static void
@@ -182,6 +165,19 @@ gcal_search_model_remove_event (GcalTimelineSubscriber *subscriber,
{
}
static void
gcal_search_model_set_model (GcalTimelineSubscriber *subscriber,
GListModel *model)
{
GcalSearchModel *self = GCAL_SEARCH_MODEL (subscriber);
GCAL_ENTRY;
gtk_map_list_model_set_model (self->map_model, model);
GCAL_EXIT;
}
static void
gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface)
{
@@ -189,6 +185,7 @@ gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface)
iface->add_event = gcal_search_model_add_event;
iface->update_event = gcal_search_model_update_event;
iface->remove_event = gcal_search_model_remove_event;
iface->set_model = gcal_search_model_set_model;
}
@@ -206,7 +203,8 @@ static guint
gcal_search_model_get_n_items (GListModel *model)
{
GcalSearchModel *self = (GcalSearchModel *)model;
return g_list_model_get_n_items (self->model);
GListModel *sort_model = (GListModel *)self->sort_model;
return g_list_model_get_n_items (sort_model);
}
static gpointer
@@ -214,7 +212,8 @@ gcal_search_model_get_item (GListModel *model,
guint position)
{
GcalSearchModel *self = (GcalSearchModel *)model;
return g_list_model_get_item (self->model, position);
GListModel *sort_model = (GListModel *)self->sort_model;
return g_list_model_get_item (sort_model, position);
}
static void
@@ -243,7 +242,8 @@ gcal_search_model_finalize (GObject *object)
gcal_clear_date_time (&self->range_start);
gcal_clear_date_time (&self->range_end);
g_clear_object (&self->cancellable);
g_clear_object (&self->model);
g_clear_object (&self->sort_model);
g_clear_object (&self->map_model);
G_OBJECT_CLASS (gcal_search_model_parent_class)->finalize (object);
}
@@ -259,8 +259,10 @@ gcal_search_model_class_init (GcalSearchModelClass *klass)
static void
gcal_search_model_init (GcalSearchModel *self)
{
self->model = (GListModel*) g_list_store_new (GCAL_TYPE_SEARCH_HIT);
g_signal_connect (self->model, "items-changed", G_CALLBACK (on_search_model_items_changed_cb), self);
self->map_model = gtk_map_list_model_new (NULL, event_to_search_hit_func, NULL, NULL);
self->sort_model = gtk_sort_list_model_new (G_LIST_MODEL (g_object_ref (self->map_model)),
GTK_SORTER (gtk_custom_sorter_new (compare_search_hits_cb, NULL, NULL)));
g_signal_connect (self->sort_model, "items-changed", G_CALLBACK (on_search_model_items_changed_cb), self);
}
GcalSearchModel *