view/agenda-view-day: Use a map model to create GcalAgendaViewItems for each event of the day
Required some small changes to `gcal-agenda-day-row.c` to keep the application working - `create_day_row_func` was tweaked to query the given item for the event, instead of assuming the event is the item itself. This will be removed (alongside the rest of GcalAgendaDayRow) in a later commit Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "gcal-agenda-view-day-row.h"
|
||||
#include "gcal-agenda-view-item.h"
|
||||
#include "gcal-date-time-utils.h"
|
||||
#include "gcal-debug.h"
|
||||
#include "gcal-enums.h"
|
||||
@@ -129,10 +130,10 @@ create_day_row_func (gpointer item,
|
||||
|
||||
self = (GcalAgendaViewDayRow *) user_data;
|
||||
|
||||
g_assert (GCAL_IS_EVENT (item));
|
||||
g_assert (GCAL_IS_AGENDA_VIEW_ITEM (item));
|
||||
g_assert (GCAL_IS_AGENDA_VIEW_DAY_ROW (self));
|
||||
|
||||
event = item;
|
||||
event = gcal_agenda_view_item_get_event (GCAL_AGENDA_VIEW_ITEM (item));
|
||||
|
||||
/* Create and add the new event widget */
|
||||
if (gcal_event_get_all_day (event) || gcal_event_is_multiday (event))
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#define G_LOG_DOMAIN "GcalAgendaViewDay"
|
||||
|
||||
#include "gcal-agenda-view-day.h"
|
||||
#include "gcal-agenda-view-item.h"
|
||||
|
||||
#include "gcal-date-time-utils.h"
|
||||
#include "gcal-range.h"
|
||||
@@ -34,6 +35,7 @@ struct _GcalAgendaViewDay
|
||||
GcalRange *range;
|
||||
|
||||
GtkFilterListModel *filtered_events;
|
||||
GtkMapListModel *map_model;
|
||||
};
|
||||
|
||||
static void g_list_model_interface_init (GListModelInterface *iface);
|
||||
@@ -67,6 +69,21 @@ on_filtered_events_items_changed_cb (GListModel *model,
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_N_ITEMS]);
|
||||
}
|
||||
|
||||
static gpointer
|
||||
map_events_to_items_func (GcalEvent *event,
|
||||
GcalAgendaViewDay *self)
|
||||
{
|
||||
g_autoptr (GcalAgendaViewItem) item = NULL;
|
||||
|
||||
item = g_object_new (GCAL_TYPE_AGENDA_VIEW_ITEM,
|
||||
"event", event,
|
||||
NULL);
|
||||
|
||||
g_object_unref (event);
|
||||
|
||||
return g_steal_pointer (&item);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* GListModel interface
|
||||
@@ -75,7 +92,7 @@ on_filtered_events_items_changed_cb (GListModel *model,
|
||||
static GType
|
||||
gcal_agenda_view_day_get_item_type (GListModel *model G_GNUC_UNUSED)
|
||||
{
|
||||
return GCAL_TYPE_EVENT;
|
||||
return GCAL_TYPE_AGENDA_VIEW_ITEM;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
@@ -85,7 +102,7 @@ gcal_agenda_view_day_get_n_items (GListModel *model)
|
||||
|
||||
g_assert (GCAL_IS_AGENDA_VIEW_DAY (self));
|
||||
|
||||
return g_list_model_get_n_items (G_LIST_MODEL (self->filtered_events));
|
||||
return g_list_model_get_n_items (G_LIST_MODEL (self->map_model));
|
||||
}
|
||||
|
||||
static gpointer
|
||||
@@ -96,7 +113,7 @@ gcal_agenda_view_day_get_item (GListModel *model,
|
||||
|
||||
g_assert (GCAL_IS_AGENDA_VIEW_DAY (self));
|
||||
|
||||
return g_list_model_get_item (G_LIST_MODEL (self->filtered_events), position);
|
||||
return g_list_model_get_item (G_LIST_MODEL (self->map_model), position);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -120,6 +137,8 @@ gcal_agenda_view_day_dispose (GObject *object)
|
||||
g_clear_pointer (&self->range, gcal_range_unref);
|
||||
gcal_clear_date_time (&self->date);
|
||||
|
||||
g_clear_object (&self->map_model);
|
||||
|
||||
G_OBJECT_CLASS (gcal_agenda_view_day_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
@@ -216,9 +235,15 @@ filter_events_func (gpointer item,
|
||||
static void
|
||||
gcal_agenda_view_day_init (GcalAgendaViewDay *self)
|
||||
{
|
||||
|
||||
self->filtered_events = gtk_filter_list_model_new (NULL,
|
||||
GTK_FILTER (gtk_custom_filter_new (filter_events_func, self, NULL)));
|
||||
g_signal_connect (self->filtered_events, "items-changed", G_CALLBACK (on_filtered_events_items_changed_cb), self);
|
||||
|
||||
self->map_model = gtk_map_list_model_new (G_LIST_MODEL (self->filtered_events),
|
||||
(GtkMapListModelMapFunc) map_events_to_items_func,
|
||||
self, NULL);
|
||||
|
||||
g_signal_connect (self->map_model, "items-changed", G_CALLBACK (on_filtered_events_items_changed_cb), self);
|
||||
}
|
||||
|
||||
GcalAgendaViewDay *
|
||||
|
||||
Reference in New Issue
Block a user