views/month: Reuse event widgets
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
This commit is contained in:
committed by
Marge Bot
parent
59cae05929
commit
4205e08be6
@@ -649,9 +649,61 @@ prepare_layout_blocks (GcalMonthViewRow *self,
|
|||||||
g_clear_pointer (&blocks_per_day[i], g_ptr_array_unref);
|
g_clear_pointer (&blocks_per_day[i], g_ptr_array_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GHashTable *
|
||||||
|
extract_current_event_widgets (GcalMonthViewRow *self)
|
||||||
|
{
|
||||||
|
g_autoptr (GHashTable) event_widgets = NULL;
|
||||||
|
GHashTableIter iter;
|
||||||
|
GPtrArray *blocks;
|
||||||
|
GcalEvent *event;
|
||||||
|
|
||||||
|
g_assert (GCAL_IS_MONTH_VIEW_ROW (self));
|
||||||
|
|
||||||
|
event_widgets = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_ptr_array_unref);
|
||||||
|
|
||||||
|
g_hash_table_iter_init (&iter, self->layout_blocks);
|
||||||
|
while (g_hash_table_iter_next (&iter, (gpointer *) &event, (gpointer *) &blocks))
|
||||||
|
{
|
||||||
|
g_autoptr (GPtrArray) widgets = NULL;
|
||||||
|
|
||||||
|
g_assert (GCAL_IS_EVENT (event));
|
||||||
|
g_assert (blocks != NULL);
|
||||||
|
|
||||||
|
widgets = g_ptr_array_new_full (blocks->len, (GDestroyNotify) gtk_widget_unparent);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < blocks->len; i++)
|
||||||
|
{
|
||||||
|
GcalEventBlock *block = g_ptr_array_index (blocks, i);
|
||||||
|
|
||||||
|
g_ptr_array_add (widgets, g_steal_pointer (&block->event_widget));
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hash_table_insert (event_widgets, event, g_steal_pointer (&widgets));
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_steal_pointer (&event_widgets);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
pick_existing_event_widget (GHashTable *event_widgets,
|
||||||
|
GcalEvent *event)
|
||||||
|
{
|
||||||
|
GPtrArray *widgets;
|
||||||
|
|
||||||
|
g_assert (event_widgets != NULL);
|
||||||
|
g_assert (GCAL_IS_EVENT (event));
|
||||||
|
|
||||||
|
widgets = g_hash_table_lookup (event_widgets, event);
|
||||||
|
if (!widgets || widgets->len == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_ptr_array_steal_index_fast (widgets, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recalculate_layout_blocks (GcalMonthViewRow *self)
|
recalculate_layout_blocks (GcalMonthViewRow *self)
|
||||||
{
|
{
|
||||||
|
g_autoptr (GHashTable) event_widgets = NULL;
|
||||||
g_autoptr (GDateTime) range_start = NULL;
|
g_autoptr (GDateTime) range_start = NULL;
|
||||||
guint events_at_weekday[N_WEEKDAYS] = { 0, };
|
guint events_at_weekday[N_WEEKDAYS] = { 0, };
|
||||||
guint n_events;
|
guint n_events;
|
||||||
@@ -663,6 +715,8 @@ recalculate_layout_blocks (GcalMonthViewRow *self)
|
|||||||
range_start = gcal_range_get_start (self->range);
|
range_start = gcal_range_get_start (self->range);
|
||||||
n_events = g_list_model_get_n_items (self->events);
|
n_events = g_list_model_get_n_items (self->events);
|
||||||
|
|
||||||
|
event_widgets = extract_current_event_widgets (self);
|
||||||
|
|
||||||
g_hash_table_remove_all (self->layout_blocks);
|
g_hash_table_remove_all (self->layout_blocks);
|
||||||
|
|
||||||
for (guint i = 0; i < n_events; i++)
|
for (guint i = 0; i < n_events; i++)
|
||||||
@@ -691,10 +745,14 @@ recalculate_layout_blocks (GcalMonthViewRow *self)
|
|||||||
{
|
{
|
||||||
GtkWidget *event_widget;
|
GtkWidget *event_widget;
|
||||||
|
|
||||||
event_widget = gcal_event_widget_new (event);
|
event_widget = pick_existing_event_widget (event_widgets, event);
|
||||||
if (!gcal_event_get_all_day (event) && !gcal_event_is_multiday (event))
|
if (!event_widget)
|
||||||
gcal_event_widget_set_timestamp_policy (GCAL_EVENT_WIDGET (event_widget), GCAL_TIMESTAMP_POLICY_START);
|
{
|
||||||
setup_child_widget (self, event_widget);
|
event_widget = gcal_event_widget_new (event);
|
||||||
|
if (!gcal_event_get_all_day (event) && !gcal_event_is_multiday (event))
|
||||||
|
gcal_event_widget_set_timestamp_policy (GCAL_EVENT_WIDGET (event_widget), GCAL_TIMESTAMP_POLICY_START);
|
||||||
|
setup_child_widget (self, event_widget);
|
||||||
|
}
|
||||||
|
|
||||||
block = g_new (GcalEventBlock, 1);
|
block = g_new (GcalEventBlock, 1);
|
||||||
block->event_widget = g_steal_pointer (&event_widget);
|
block->event_widget = g_steal_pointer (&event_widget);
|
||||||
@@ -707,8 +765,12 @@ recalculate_layout_blocks (GcalMonthViewRow *self)
|
|||||||
{
|
{
|
||||||
GtkWidget *new_event_widget;
|
GtkWidget *new_event_widget;
|
||||||
|
|
||||||
new_event_widget = gcal_event_widget_clone (GCAL_EVENT_WIDGET (block->event_widget));
|
new_event_widget = pick_existing_event_widget (event_widgets, event);
|
||||||
setup_child_widget (self, new_event_widget);
|
if (!new_event_widget)
|
||||||
|
{
|
||||||
|
new_event_widget = gcal_event_widget_clone (GCAL_EVENT_WIDGET (block->event_widget));
|
||||||
|
setup_child_widget (self, new_event_widget);
|
||||||
|
}
|
||||||
|
|
||||||
block = g_new (GcalEventBlock, 1);
|
block = g_new (GcalEventBlock, 1);
|
||||||
block->event_widget = g_steal_pointer (&new_event_widget);
|
block->event_widget = g_steal_pointer (&new_event_widget);
|
||||||
|
|||||||
Reference in New Issue
Block a user