diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-11 13:00:37 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-16 09:28:30 -0300 |
commit | 5dd98ea01c6e894ec024cb34f78576ff3a6bc326 (patch) | |
tree | 319f5641fcd51f99261c7a5a4b0765d77eca72c9 | |
parent | a21670602634ecfa7c6e1b8a6303e9226bcc0c75 (diff) | |
download | gnome-calendar-5dd98ea01c6e894ec024cb34f78576ff3a6bc326.tar.gz |
search/model: Don't ignore results past limits
Instead, monitor where items are added relative to each other, and
proxy the 'items-changed' call to match the inner list.
Helps https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/989
-rw-r--r-- | src/search/gcal-search-model.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/src/search/gcal-search-model.c b/src/search/gcal-search-model.c index f6a0bf8e..461939f1 100644 --- a/src/search/gcal-search-model.c +++ b/src/search/gcal-search-model.c @@ -88,16 +88,6 @@ stop_idle: return G_SOURCE_REMOVE; } -static void -on_model_items_changed_cb (GListModel *model, - guint position, - guint removed, - guint added, - GcalSearchModel *self) -{ - g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added); -} - /* * GcalTimelineSubscriber interface @@ -149,12 +139,10 @@ gcal_search_model_add_event (GcalTimelineSubscriber *subscriber, g_autoptr (GcalSearchHitEvent) search_hit = NULL; GcalSearchModel *self; gboolean found; + guint position; self = GCAL_SEARCH_MODEL (subscriber); - if (g_list_model_get_n_items (self->model) > self->max_results) - return; - GCAL_TRACE_MSG ("Adding search hit '%s'", gcal_event_get_summary (event)); search_hit = gcal_search_hit_event_new (event); @@ -167,10 +155,16 @@ gcal_search_model_add_event (GcalTimelineSubscriber *subscriber, if (found) return; - g_list_store_insert_sorted (G_LIST_STORE (self->model), - search_hit, - compare_search_hits_cb, - self); + position = g_list_store_insert_sorted (G_LIST_STORE (self->model), + search_hit, + compare_search_hits_cb, + self); + if (position < self->max_results) + { + if (g_list_model_get_n_items (self->model) > self->max_results) + g_list_model_items_changed (G_LIST_MODEL (self), self->max_results, 1, 0); + g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1); + } } static void @@ -209,7 +203,7 @@ static guint gcal_search_model_get_n_items (GListModel *model) { GcalSearchModel *self = (GcalSearchModel *)model; - return g_list_model_get_n_items (self->model); + return CLAMP (g_list_model_get_n_items (self->model), 0, self->max_results); } static gpointer @@ -263,7 +257,6 @@ static void gcal_search_model_init (GcalSearchModel *self) { self->model = (GListModel*) g_list_store_new (GCAL_TYPE_SEARCH_HIT); - g_signal_connect_object (self->model, "items-changed", G_CALLBACK (on_model_items_changed_cb), self, 0); } GcalSearchModel * |