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_start;
|
||||||
GDateTime *range_end;
|
GDateTime *range_end;
|
||||||
|
|
||||||
GListModel *model;
|
GtkMapListModel *map_model;
|
||||||
|
GtkSortListModel *sort_model;
|
||||||
|
|
||||||
GTimer *timer;
|
GTimer *timer;
|
||||||
guint idle_id;
|
guint idle_id;
|
||||||
@@ -73,7 +74,7 @@ check_for_search_hits_cb (gpointer user_data)
|
|||||||
goto stop_idle;
|
goto stop_idle;
|
||||||
|
|
||||||
if (g_timer_elapsed (self->timer, NULL) >= WAIT_FOR_RESULTS_MS ||
|
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);
|
g_task_return_boolean (task, TRUE);
|
||||||
goto stop_idle;
|
goto stop_idle;
|
||||||
@@ -108,16 +109,6 @@ compare_search_hits_cb (gconstpointer a,
|
|||||||
return gcal_search_hit_compare (hit_a, hit_b);
|
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
|
static void
|
||||||
on_search_model_items_changed_cb (GListModel *model,
|
on_search_model_items_changed_cb (GListModel *model,
|
||||||
guint position,
|
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);
|
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
|
* GcalTimelineSubscriber interface
|
||||||
@@ -145,28 +150,6 @@ static void
|
|||||||
gcal_search_model_add_event (GcalTimelineSubscriber *subscriber,
|
gcal_search_model_add_event (GcalTimelineSubscriber *subscriber,
|
||||||
GcalEvent *event)
|
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
|
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
|
static void
|
||||||
gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface)
|
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->add_event = gcal_search_model_add_event;
|
||||||
iface->update_event = gcal_search_model_update_event;
|
iface->update_event = gcal_search_model_update_event;
|
||||||
iface->remove_event = gcal_search_model_remove_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)
|
gcal_search_model_get_n_items (GListModel *model)
|
||||||
{
|
{
|
||||||
GcalSearchModel *self = (GcalSearchModel *)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
|
static gpointer
|
||||||
@@ -214,7 +212,8 @@ gcal_search_model_get_item (GListModel *model,
|
|||||||
guint position)
|
guint position)
|
||||||
{
|
{
|
||||||
GcalSearchModel *self = (GcalSearchModel *)model;
|
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
|
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_start);
|
||||||
gcal_clear_date_time (&self->range_end);
|
gcal_clear_date_time (&self->range_end);
|
||||||
g_clear_object (&self->cancellable);
|
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);
|
G_OBJECT_CLASS (gcal_search_model_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -259,8 +259,10 @@ gcal_search_model_class_init (GcalSearchModelClass *klass)
|
|||||||
static void
|
static void
|
||||||
gcal_search_model_init (GcalSearchModel *self)
|
gcal_search_model_init (GcalSearchModel *self)
|
||||||
{
|
{
|
||||||
self->model = (GListModel*) g_list_store_new (GCAL_TYPE_SEARCH_HIT);
|
self->map_model = gtk_map_list_model_new (NULL, event_to_search_hit_func, NULL, NULL);
|
||||||
g_signal_connect (self->model, "items-changed", G_CALLBACK (on_search_model_items_changed_cb), self);
|
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 *
|
GcalSearchModel *
|
||||||
|
|||||||
Reference in New Issue
Block a user