gui/date-chooser: Port to GListModel
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/742>
This commit is contained in:
committed by
Marge Bot
parent
d065d4b9e8
commit
136fd16a0a
@@ -54,6 +54,7 @@ struct _GcalDateChooser
|
|||||||
GtkWidget *week[ROWS];
|
GtkWidget *week[ROWS];
|
||||||
|
|
||||||
GDateTime *date;
|
GDateTime *date;
|
||||||
|
GSignalGroup *model_signal_group;
|
||||||
|
|
||||||
gint this_year;
|
gint this_year;
|
||||||
gint week_start;
|
gint week_start;
|
||||||
@@ -65,8 +66,6 @@ struct _GcalDateChooser
|
|||||||
gboolean show_events;
|
gboolean show_events;
|
||||||
gboolean split_month_year;
|
gboolean split_month_year;
|
||||||
|
|
||||||
GcalRangeTree *events;
|
|
||||||
|
|
||||||
gulong update_indicators_idle_id;
|
gulong update_indicators_idle_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -501,23 +500,50 @@ calendar_update_selected_day (GcalDateChooser *self)
|
|||||||
static void
|
static void
|
||||||
update_event_indicators (GcalDateChooser *self)
|
update_event_indicators (GcalDateChooser *self)
|
||||||
{
|
{
|
||||||
|
g_autoptr (GcalRangeTree) events_at_range = NULL;
|
||||||
|
g_autoptr (GListModel) events = NULL;
|
||||||
gint row, col;
|
gint row, col;
|
||||||
|
|
||||||
|
events = g_signal_group_dup_target (self->model_signal_group);
|
||||||
|
if (events)
|
||||||
|
{
|
||||||
|
size_t n_events = g_list_model_get_n_items (events);
|
||||||
|
|
||||||
|
events_at_range = gcal_range_tree_new ();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n_events; i++)
|
||||||
|
{
|
||||||
|
g_autoptr (GcalEvent) event = g_list_model_get_item (events, i);
|
||||||
|
|
||||||
|
gcal_range_tree_add_range (events_at_range, gcal_event_get_range (event), event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (row = 0; row < ROWS; row++)
|
for (row = 0; row < ROWS; row++)
|
||||||
{
|
{
|
||||||
for (col = 0; col < N_WEEKDAYS; col++)
|
for (col = 0; col < N_WEEKDAYS; col++)
|
||||||
{
|
{
|
||||||
GDateTime *date;
|
GcalDateChooserDay *day = GCAL_DATE_CHOOSER_DAY (self->days[row][col]);
|
||||||
g_autoptr (GcalRange) range = NULL;
|
if (events_at_range)
|
||||||
|
{
|
||||||
|
g_autoptr (GcalRange) range = NULL;
|
||||||
|
GDateTime *date;
|
||||||
|
uint64_t n_events;
|
||||||
|
|
||||||
date = gcal_date_chooser_day_get_date (GCAL_DATE_CHOOSER_DAY (self->days[row][col]));
|
date = gcal_date_chooser_day_get_date (day);
|
||||||
range = gcal_range_new_take (g_date_time_ref (date),
|
range = gcal_range_new_take (g_date_time_ref (date),
|
||||||
g_date_time_add_days (date, 1),
|
g_date_time_add_days (date, 1),
|
||||||
GCAL_RANGE_DEFAULT);
|
GCAL_RANGE_DEFAULT);
|
||||||
|
|
||||||
gcal_date_chooser_day_set_dot_visible (GCAL_DATE_CHOOSER_DAY (self->days[row][col]),
|
n_events = gcal_range_tree_count_entries_at_range (events_at_range, range);
|
||||||
gcal_range_tree_count_entries_at_range (self->events, range) > 0);
|
|
||||||
}
|
gcal_date_chooser_day_set_dot_visible (day, n_events > 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gcal_date_chooser_day_set_dot_visible (day, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,28 +690,12 @@ static void
|
|||||||
gcal_date_chooser_add_event (GcalTimelineSubscriber *subscriber,
|
gcal_date_chooser_add_event (GcalTimelineSubscriber *subscriber,
|
||||||
GcalEvent *event)
|
GcalEvent *event)
|
||||||
{
|
{
|
||||||
GcalDateChooser *self;
|
|
||||||
|
|
||||||
self = GCAL_DATE_CHOOSER (subscriber);
|
|
||||||
|
|
||||||
g_debug ("Caching event '%s' in %s", gcal_event_get_uid (event), G_OBJECT_TYPE_NAME (self));
|
|
||||||
gcal_range_tree_add_range (self->events, gcal_event_get_range (event), g_object_ref (event));
|
|
||||||
|
|
||||||
queue_update_event_indicators (self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_date_chooser_remove_event (GcalTimelineSubscriber *subscriber,
|
gcal_date_chooser_remove_event (GcalTimelineSubscriber *subscriber,
|
||||||
GcalEvent *event)
|
GcalEvent *event)
|
||||||
{
|
{
|
||||||
GcalDateChooser *self;
|
|
||||||
|
|
||||||
self = GCAL_DATE_CHOOSER (subscriber);
|
|
||||||
|
|
||||||
g_debug ("Removing event '%s' from %s's cache", gcal_event_get_uid (event), G_OBJECT_TYPE_NAME (self));
|
|
||||||
gcal_range_tree_remove_range (self->events, gcal_event_get_range (event), event);
|
|
||||||
|
|
||||||
queue_update_event_indicators (self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -693,8 +703,16 @@ gcal_date_chooser_update_event (GcalTimelineSubscriber *subscriber,
|
|||||||
GcalEvent *old_event,
|
GcalEvent *old_event,
|
||||||
GcalEvent *event)
|
GcalEvent *event)
|
||||||
{
|
{
|
||||||
gcal_date_chooser_remove_event (subscriber, old_event);
|
}
|
||||||
gcal_date_chooser_add_event (subscriber, event);
|
|
||||||
|
static void
|
||||||
|
gcal_date_chooser_set_model (GcalTimelineSubscriber *subscriber,
|
||||||
|
GListModel *model)
|
||||||
|
{
|
||||||
|
GcalDateChooser *self = GCAL_DATE_CHOOSER (subscriber);
|
||||||
|
|
||||||
|
g_signal_group_set_target (self->model_signal_group, model);
|
||||||
|
queue_update_event_indicators (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -704,6 +722,7 @@ gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface)
|
|||||||
iface->add_event = gcal_date_chooser_add_event;
|
iface->add_event = gcal_date_chooser_add_event;
|
||||||
iface->remove_event = gcal_date_chooser_remove_event;
|
iface->remove_event = gcal_date_chooser_remove_event;
|
||||||
iface->update_event = gcal_date_chooser_update_event;
|
iface->update_event = gcal_date_chooser_update_event;
|
||||||
|
iface->set_model = gcal_date_chooser_set_model;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -876,8 +895,9 @@ gcal_date_chooser_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
GcalDateChooser *self = GCAL_DATE_CHOOSER (object);
|
GcalDateChooser *self = GCAL_DATE_CHOOSER (object);
|
||||||
|
|
||||||
|
g_clear_object (&self->model_signal_group);
|
||||||
|
|
||||||
g_clear_pointer (&self->date, g_date_time_unref);
|
g_clear_pointer (&self->date, g_date_time_unref);
|
||||||
g_clear_pointer (&self->events, gcal_range_tree_unref);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (gcal_date_chooser_parent_class)->finalize (object);
|
G_OBJECT_CLASS (gcal_date_chooser_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -1056,6 +1076,15 @@ show_week_number_to_column_span_cb (GBinding *binding,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_event_model_items_changed_cb (GListModel *model,
|
||||||
|
unsigned int position,
|
||||||
|
unsigned int removed,
|
||||||
|
unsigned int added,
|
||||||
|
GcalDateChooser *self)
|
||||||
|
{
|
||||||
|
queue_update_event_indicators (self);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_date_chooser_init (GcalDateChooser *self)
|
gcal_date_chooser_init (GcalDateChooser *self)
|
||||||
@@ -1067,6 +1096,12 @@ gcal_date_chooser_init (GcalDateChooser *self)
|
|||||||
gint year, month, day;
|
gint year, month, day;
|
||||||
GtkLayoutManager *layout_manager;
|
GtkLayoutManager *layout_manager;
|
||||||
|
|
||||||
|
self->model_signal_group = g_signal_group_new (G_TYPE_LIST_MODEL);
|
||||||
|
g_signal_group_connect (self->model_signal_group,
|
||||||
|
"items-changed",
|
||||||
|
G_CALLBACK (on_event_model_items_changed_cb),
|
||||||
|
self);
|
||||||
|
|
||||||
self->show_heading = TRUE;
|
self->show_heading = TRUE;
|
||||||
self->show_day_names = TRUE;
|
self->show_day_names = TRUE;
|
||||||
self->show_week_numbers = TRUE;
|
self->show_week_numbers = TRUE;
|
||||||
@@ -1079,8 +1114,6 @@ gcal_date_chooser_init (GcalDateChooser *self)
|
|||||||
|
|
||||||
self->week_start = get_first_weekday ();
|
self->week_start = get_first_weekday ();
|
||||||
|
|
||||||
self->events = gcal_range_tree_new_with_free_func (g_object_unref);
|
|
||||||
|
|
||||||
gtk_widget_init_template (GTK_WIDGET (self));
|
gtk_widget_init_template (GTK_WIDGET (self));
|
||||||
|
|
||||||
for (col = 0; col < N_WEEKDAYS; col++)
|
for (col = 0; col < N_WEEKDAYS; col++)
|
||||||
|
|||||||
Reference in New Issue
Block a user