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:
committed by
Marge Bot
parent
bbc041eed9
commit
c0127fa2af
@@ -26,6 +26,7 @@
|
|||||||
#include "gcal-clock.h"
|
#include "gcal-clock.h"
|
||||||
#include "gcal-debug.h"
|
#include "gcal-debug.h"
|
||||||
#include "gcal-event-widget.h"
|
#include "gcal-event-widget.h"
|
||||||
|
#include "gcal-event-widget-pool.h"
|
||||||
#include "gcal-gui-utils.h"
|
#include "gcal-gui-utils.h"
|
||||||
#include "gcal-utils.h"
|
#include "gcal-utils.h"
|
||||||
#include "gcal-view-private.h"
|
#include "gcal-view-private.h"
|
||||||
@@ -88,6 +89,8 @@ struct _GcalWeekHeader
|
|||||||
GtkFilterListModel *events_model;
|
GtkFilterListModel *events_model;
|
||||||
GcalEventArray event_array;
|
GcalEventArray event_array;
|
||||||
|
|
||||||
|
GcalEventWidgetPool *event_widget_pool;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stores the events as they come from the week-view
|
* Stores the events as they come from the week-view
|
||||||
* The list will later be iterated after the active date is changed
|
* 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);
|
g_signal_handlers_disconnect_by_func (widget, on_event_widget_activated, self);
|
||||||
gtk_grid_remove (self->grid, widget);
|
gtk_grid_remove (self->grid, widget);
|
||||||
|
|
||||||
|
gcal_event_widget_pool_reclaim (self->event_widget_pool, widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Auxiliary methods */
|
/* Auxiliary methods */
|
||||||
@@ -622,6 +627,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
|
|||||||
GtkLayoutManager *layout_manager;
|
GtkLayoutManager *layout_manager;
|
||||||
GtkLayoutChild *layout_child;
|
GtkLayoutChild *layout_child;
|
||||||
GDateTime *week_start, *column_date, *end_column_date;
|
GDateTime *week_start, *column_date, *end_column_date;
|
||||||
|
GcalEvent *event;
|
||||||
gboolean create_before;
|
gboolean create_before;
|
||||||
gboolean create_after;
|
gboolean create_after;
|
||||||
gint left_attach;
|
gint left_attach;
|
||||||
@@ -642,11 +648,15 @@ split_event_widget_at_column (GcalWeekHeader *self,
|
|||||||
create_before = column > 0 && left_attach < column;
|
create_before = column > 0 && left_attach < column;
|
||||||
create_after = column < N_WEEKDAYS - 1 && old_width > 1 && left_attach + old_width > column + 1;
|
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)
|
if (create_before)
|
||||||
{
|
{
|
||||||
GtkWidget *widget_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);
|
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_before), column_date);
|
||||||
|
|
||||||
setup_event_widget (self, widget_before);
|
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)));
|
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_start (GCAL_EVENT_WIDGET (widget_after), end_column_date);
|
||||||
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_after), event_end);
|
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);
|
move_events_at_column (self, DOWN, start, position);
|
||||||
|
|
||||||
/* Add the event to the grid */
|
/* 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);
|
setup_event_widget (self, widget);
|
||||||
|
|
||||||
gtk_grid_attach (self->grid,
|
gtk_grid_attach (self->grid,
|
||||||
@@ -854,7 +867,9 @@ add_event_to_grid (GcalWeekHeader *self,
|
|||||||
GtkWidget *cloned_widget;
|
GtkWidget *cloned_widget;
|
||||||
|
|
||||||
cloned_widget_start_dt = g_date_time_add_days (week_start, i);
|
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);
|
setup_event_widget (self, cloned_widget);
|
||||||
|
|
||||||
gtk_grid_attach (self->grid,
|
gtk_grid_attach (self->grid,
|
||||||
@@ -1605,6 +1620,8 @@ gcal_week_header_finalize (GObject *object)
|
|||||||
GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
|
GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
|
g_clear_object (&self->event_widget_pool);
|
||||||
|
|
||||||
gcal_event_array_clear (&self->event_array);
|
gcal_event_array_clear (&self->event_array);
|
||||||
g_clear_object (&self->events_model);
|
g_clear_object (&self->events_model);
|
||||||
|
|
||||||
@@ -1719,6 +1736,8 @@ gcal_week_header_init (GcalWeekHeader *self)
|
|||||||
GtkDropTarget *drop_target;
|
GtkDropTarget *drop_target;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
|
self->event_widget_pool = gcal_event_widget_pool_new ();
|
||||||
|
|
||||||
gcal_event_array_init (&self->event_array);
|
gcal_event_array_init (&self->event_array);
|
||||||
|
|
||||||
filter = gtk_custom_filter_new (event_is_all_day_or_multiday_func, NULL, NULL);
|
filter = gtk_custom_filter_new (event_is_all_day_or_multiday_func, NULL, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user