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:
Zelda Ahmed
2026-09-26 13:02:27 +01:00
parent 4ea2fcfcbe
commit 3f1bc3edf0
2 changed files with 32 additions and 6 deletions
+3 -2
View File
@@ -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))
+29 -4
View File
@@ -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 *