search/model: Port to GListModel
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/742>
This commit is contained in:
committed by
Marge Bot
parent
34e28e31fe
commit
807f5608b1
@@ -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 *
|
||||
|
||||
Reference in New Issue
Block a user