diff --git a/src/search/gcal-search-model.c b/src/search/gcal-search-model.c index e5e8b94c..7edc8b6b 100644 --- a/src/search/gcal-search-model.c +++ b/src/search/gcal-search-model.c @@ -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 *