views/week-header: Reuse event widgets using the new pool

Same deal as the Month view.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
This commit is contained in:
Georges Basile Stavracas Neto
2026-05-19 22:20:10 +00:00
committed by Marge Bot
parent bbc041eed9
commit c0127fa2af
+23 -4
View File
@@ -26,6 +26,7 @@
#include "gcal-clock.h"
#include "gcal-debug.h"
#include "gcal-event-widget.h"
#include "gcal-event-widget-pool.h"
#include "gcal-gui-utils.h"
#include "gcal-utils.h"
#include "gcal-view-private.h"
@@ -88,6 +89,8 @@ struct _GcalWeekHeader
GtkFilterListModel *events_model;
GcalEventArray event_array;
GcalEventWidgetPool *event_widget_pool;
/*
* Stores the events as they come from the week-view
* The list will later be iterated after the active date is changed
@@ -259,6 +262,8 @@ destroy_event_widget (GcalWeekHeader *self,
{
g_signal_handlers_disconnect_by_func (widget, on_event_widget_activated, self);
gtk_grid_remove (self->grid, widget);
gcal_event_widget_pool_reclaim (self->event_widget_pool, widget);
}
/* Auxiliary methods */
@@ -622,6 +627,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
GtkLayoutManager *layout_manager;
GtkLayoutChild *layout_child;
GDateTime *week_start, *column_date, *end_column_date;
GcalEvent *event;
gboolean create_before;
gboolean create_after;
gint left_attach;
@@ -642,11 +648,15 @@ split_event_widget_at_column (GcalWeekHeader *self,
create_before = column > 0 && left_attach < column;
create_after = column < N_WEEKDAYS - 1 && old_width > 1 && left_attach + old_width > column + 1;
event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (widget));
if (create_before)
{
GtkWidget *widget_before;
widget_before = gcal_event_widget_clone (GCAL_EVENT_WIDGET (widget));
widget_before = gcal_event_widget_pool_take_or_create (self->event_widget_pool, event);
g_assert (GCAL_IS_EVENT_WIDGET (widget_before));
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_before), column_date);
setup_event_widget (self, widget_before);
@@ -680,7 +690,9 @@ split_event_widget_at_column (GcalWeekHeader *self,
event_end = g_date_time_to_local (gcal_event_widget_get_date_end (GCAL_EVENT_WIDGET (widget)));
widget_after = gcal_event_widget_clone (GCAL_EVENT_WIDGET (widget));
widget_after = gcal_event_widget_pool_take_or_create (self->event_widget_pool, event);
g_assert (GCAL_IS_EVENT_WIDGET (widget_after));
gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (widget_after), end_column_date);
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_after), event_end);
@@ -792,7 +804,8 @@ add_event_to_grid (GcalWeekHeader *self,
move_events_at_column (self, DOWN, start, position);
/* Add the event to the grid */
widget = gcal_event_widget_new (event);
widget = gcal_event_widget_pool_take_or_create (self->event_widget_pool, event);
g_assert (GCAL_IS_EVENT_WIDGET (widget));
setup_event_widget (self, widget);
gtk_grid_attach (self->grid,
@@ -854,7 +867,9 @@ add_event_to_grid (GcalWeekHeader *self,
GtkWidget *cloned_widget;
cloned_widget_start_dt = g_date_time_add_days (week_start, i);
cloned_widget = gcal_event_widget_clone (GCAL_EVENT_WIDGET (widget));
cloned_widget = gcal_event_widget_pool_take_or_create (self->event_widget_pool, event);
g_assert (GCAL_IS_EVENT_WIDGET (cloned_widget));
setup_event_widget (self, cloned_widget);
gtk_grid_attach (self->grid,
@@ -1605,6 +1620,8 @@ gcal_week_header_finalize (GObject *object)
GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
gint i;
g_clear_object (&self->event_widget_pool);
gcal_event_array_clear (&self->event_array);
g_clear_object (&self->events_model);
@@ -1719,6 +1736,8 @@ gcal_week_header_init (GcalWeekHeader *self)
GtkDropTarget *drop_target;
gint i;
self->event_widget_pool = gcal_event_widget_pool_new ();
gcal_event_array_init (&self->event_array);
filter = gtk_custom_filter_new (event_is_all_day_or_multiday_func, NULL, NULL);