From db0f07136c6a4e6969da67d7de3b14c095a53b4d Mon Sep 17 00:00:00 2001 From: Adrien Plazas Date: Thu, 7 Apr 2022 11:47:22 +0200 Subject: [PATCH] date-chooser: Implement GcalView This also replace the date property by the overridden active-date one ans adds the context property. --- src/gui/event-editor/gcal-date-chooser.c | 174 +++++++++++++++------- src/gui/event-editor/gcal-date-chooser.h | 5 - src/gui/event-editor/gcal-date-selector.c | 9 +- 3 files changed, 128 insertions(+), 60 deletions(-) diff --git a/src/gui/event-editor/gcal-date-chooser.c b/src/gui/event-editor/gcal-date-chooser.c index f9f09ce2..fcb060c6 100644 --- a/src/gui/event-editor/gcal-date-chooser.c +++ b/src/gui/event-editor/gcal-date-chooser.c @@ -26,12 +26,14 @@ #include "gcal-multi-choice.h" #include "gcal-range-tree.h" #include "gcal-timeline-subscriber.h" +#include "gcal-view.h" #include #include #define ROWS 6 #define COLS 7 +#define DAYS 42 struct _GcalDateChooser { @@ -49,6 +51,7 @@ struct _GcalDateChooser GtkWidget *week[ROWS]; GDateTime *date; + GcalContext *context; gint this_year; gint week_start; @@ -64,10 +67,16 @@ struct _GcalDateChooser gulong update_indicators_idle_id; }; +static void gcal_view_interface_init (GcalViewInterface *iface); + static void gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface); static gboolean update_event_indicators_in_idle_cb (gpointer data); +static void gcal_date_chooser_set_date (GcalView *view, + GDateTime *date); + G_DEFINE_TYPE_WITH_CODE (GcalDateChooser, gcal_date_chooser, ADW_TYPE_BIN, + G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init) G_IMPLEMENT_INTERFACE (GCAL_TYPE_TIMELINE_SUBSCRIBER, gcal_timeline_subscriber_interface_init)); @@ -80,13 +89,14 @@ enum enum { PROP_0, - PROP_DATE, PROP_SHOW_HEADING, PROP_SHOW_DAY_NAMES, PROP_SHOW_WEEK_NUMBERS, PROP_SHOW_SELECTED_WEEK, PROP_SHOW_EVENTS, - NUM_PROPERTIES + PROP_DATE, + PROP_CONTEXT, + NUM_PROPERTIES = PROP_SHOW_EVENTS + 1, }; static guint signals[LAST_SIGNAL] = { 0, }; @@ -323,7 +333,7 @@ calendar_update_selected_day (GcalDateChooser *self) if (month_len < day) { date = g_date_time_new_local (year, month, month_len, 1, 1, 1); - gcal_date_chooser_set_date (self, date); + gcal_date_chooser_set_date (GCAL_VIEW (self), date); g_date_time_unref (date); } else @@ -371,7 +381,13 @@ static void day_selected_cb (GcalDateChooserDay *d, GcalDateChooser *self) { - gcal_date_chooser_set_date (self, gcal_date_chooser_day_get_date (d)); + gcal_date_chooser_set_date (GCAL_VIEW (self), gcal_date_chooser_day_get_date (d)); +} + +static void +on_clock_day_changed_cb (GcalDateChooser *self) +{ + /* FIXME Update the widget to the new day. */ } static gboolean @@ -385,6 +401,87 @@ update_event_indicators_in_idle_cb (gpointer data) return G_SOURCE_REMOVE; } +/* + * GcalView interface + */ + +static void +gcal_date_chooser_set_date (GcalView *view, + GDateTime *date) +{ + GcalDateChooser *self = GCAL_DATE_CHOOSER (view); + gint y1, m1, d1, y2, m2, d2; + + g_object_freeze_notify (G_OBJECT (self)); + + g_date_time_get_ymd (self->date, &y1, &m1, &d1); + g_date_time_get_ymd (date, &y2, &m2, &d2); + + g_date_time_unref (self->date); + self->date = g_date_time_ref (date); + + if (y1 != y2 || m1 != m2) + { + gcal_multi_choice_set_value (GCAL_MULTI_CHOICE (self->year_choice), y2); + gcal_multi_choice_set_value (GCAL_MULTI_CHOICE (self->month_choice), m2 - 1); + calendar_compute_days (self); + gcal_timeline_subscriber_range_changed (GCAL_TIMELINE_SUBSCRIBER (self)); + } + + if (y1 != y2 || m1 != m2 || d1 != d2) + { + calendar_update_selected_day (self); + g_signal_emit (self, signals[DAY_SELECTED], 0); + g_object_notify (G_OBJECT (self), "active-date"); + } + + g_object_thaw_notify (G_OBJECT (self)); +} + +static GDateTime* +gcal_date_chooser_get_date (GcalView *view) +{ + GcalDateChooser *self = GCAL_DATE_CHOOSER (view); + + return self->date; +} + +static GList* +gcal_date_chooser_get_children_by_uuid (GcalView *view, + GcalRecurrenceModType mod, + const gchar *uuid) +{ + return NULL; +} + +static GDateTime* +gcal_date_chooser_get_next_date (GcalView *view) +{ + GcalDateChooser *self = GCAL_DATE_CHOOSER (view); + + g_assert (self->date != NULL); + return g_date_time_add_months (self->date, 1); +} + +static GDateTime* +gcal_date_chooser_get_previous_date (GcalView *view) +{ + GcalDateChooser *self = GCAL_DATE_CHOOSER (view); + + g_assert (self->date != NULL); + return g_date_time_add_months (self->date, -1); +} + +static void +gcal_view_interface_init (GcalViewInterface *iface) +{ + iface->get_date = gcal_date_chooser_get_date; + iface->set_date = gcal_date_chooser_set_date; + iface->get_children_by_uuid = gcal_date_chooser_get_children_by_uuid; + iface->get_next_date = gcal_date_chooser_get_next_date; + iface->get_previous_date = gcal_date_chooser_get_previous_date; +} + /* * GcalTimelineSubscriber implementation @@ -460,7 +557,18 @@ calendar_set_property (GObject *obj, switch (property_id) { case PROP_DATE: - gcal_date_chooser_set_date (self, g_value_get_boxed (value)); + gcal_date_chooser_set_date (GCAL_VIEW (self), g_value_get_boxed (value)); + break; + + case PROP_CONTEXT: + g_assert (self->context == NULL); + self->context = g_value_dup_object (value); + + g_signal_connect_object (gcal_context_get_clock (self->context), + "day-changed", + G_CALLBACK (on_clock_day_changed_cb), + self, + G_CONNECT_SWAPPED); break; case PROP_SHOW_HEADING: @@ -503,6 +611,10 @@ calendar_get_property (GObject *obj, g_value_set_boxed (value, self->date); break; + case PROP_CONTEXT: + g_value_set_object (value, self->context); + break; + case PROP_SHOW_HEADING: g_value_set_boolean (value, self->show_heading); break; @@ -543,7 +655,7 @@ multi_choice_changed (GcalDateChooser *self) day = MIN (day, month_length[leap (year)][month]); date = g_date_time_new_local (year, month, day, 1, 1, 1); - gcal_date_chooser_set_date (self, date); + gcal_date_chooser_set_date (GCAL_VIEW (self), date); } static gboolean @@ -575,7 +687,7 @@ on_drop_target_drop_cb (GtkDropTarget *target, g_date_time_get_ymd (self->date, &year, &month, NULL); date = g_date_time_new_local (year, month, day, 1, 1, 1); - gcal_date_chooser_set_date (self, date); + gcal_date_chooser_set_date (GCAL_VIEW (self), date); return TRUE; } @@ -585,6 +697,7 @@ gcal_date_chooser_finalize (GObject *object) { GcalDateChooser *self = GCAL_DATE_CHOOSER (object); + g_clear_object (&self->context); g_clear_pointer (&self->date, g_date_time_unref); g_clear_pointer (&self->events, gcal_range_tree_unref); @@ -612,12 +725,6 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/event-editor/gcal-date-chooser.ui"); - properties[PROP_DATE] = g_param_spec_boxed ("date", - "Date", - "The selected date", - G_TYPE_DATE_TIME, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - properties[PROP_SHOW_HEADING] = g_param_spec_boolean ("show-heading", "Show Heading", "If TRUE, a heading is displayed", @@ -655,6 +762,9 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class) g_object_class_install_properties (object_class, NUM_PROPERTIES, properties); + g_object_class_override_property (object_class, PROP_DATE, "active-date"); + g_object_class_override_property (object_class, PROP_CONTEXT, "context"); + signals[DAY_SELECTED] = g_signal_new ("day-selected", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, @@ -957,41 +1067,3 @@ gcal_date_chooser_get_show_events (GcalDateChooser *self) { return self->show_events; } - -void -gcal_date_chooser_set_date (GcalDateChooser *self, - GDateTime *date) -{ - gint y1, m1, d1, y2, m2, d2; - - g_object_freeze_notify (G_OBJECT (self)); - - g_date_time_get_ymd (self->date, &y1, &m1, &d1); - g_date_time_get_ymd (date, &y2, &m2, &d2); - - g_date_time_unref (self->date); - self->date = g_date_time_ref (date); - - if (y1 != y2 || m1 != m2) - { - gcal_multi_choice_set_value (GCAL_MULTI_CHOICE (self->year_choice), y2); - gcal_multi_choice_set_value (GCAL_MULTI_CHOICE (self->month_choice), m2 - 1); - calendar_compute_days (self); - gcal_timeline_subscriber_range_changed (GCAL_TIMELINE_SUBSCRIBER (self)); - } - - if (y1 != y2 || m1 != m2 || d1 != d2) - { - calendar_update_selected_day (self); - g_signal_emit (self, signals[DAY_SELECTED], 0); - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DATE]); - } - - g_object_thaw_notify (G_OBJECT (self)); -} - -GDateTime * -gcal_date_chooser_get_date (GcalDateChooser *self) -{ - return self->date; -} diff --git a/src/gui/event-editor/gcal-date-chooser.h b/src/gui/event-editor/gcal-date-chooser.h index c6f42fda..c2b287a2 100644 --- a/src/gui/event-editor/gcal-date-chooser.h +++ b/src/gui/event-editor/gcal-date-chooser.h @@ -28,11 +28,6 @@ G_DECLARE_FINAL_TYPE (GcalDateChooser, gcal_date_chooser, GCAL, DATE_CHOOSER, Ad GtkWidget* gcal_date_chooser_new (void); -GDateTime* gcal_date_chooser_get_date (GcalDateChooser *self); - -void gcal_date_chooser_set_date (GcalDateChooser *self, - GDateTime *date); - gboolean gcal_date_chooser_get_show_heading (GcalDateChooser *self); void gcal_date_chooser_set_show_heading (GcalDateChooser *self, diff --git a/src/gui/event-editor/gcal-date-selector.c b/src/gui/event-editor/gcal-date-selector.c index 67afdc89..f3a18a97 100644 --- a/src/gui/event-editor/gcal-date-selector.c +++ b/src/gui/event-editor/gcal-date-selector.c @@ -20,6 +20,7 @@ #include "gcal-date-chooser.h" #include "gcal-date-selector.h" +#include "gcal-view.h" #include #include @@ -54,7 +55,7 @@ update_text (GcalDateSelector *self) GDateTime *date; gchar *label; - date = gcal_date_chooser_get_date (GCAL_DATE_CHOOSER (self->date_chooser)); + date = gcal_view_get_date (GCAL_VIEW (self->date_chooser)); /* rebuild the date label */ label = g_date_time_format (date, "%x"); @@ -176,7 +177,7 @@ gcal_date_selector_get_property (GObject *object, switch (prop_id) { case PROP_DATE: - g_value_set_boxed (value, gcal_date_chooser_get_date (GCAL_DATE_CHOOSER (self->date_chooser))); + g_value_set_boxed (value, gcal_view_get_date (GCAL_VIEW (self->date_chooser))); break; default: @@ -285,7 +286,7 @@ gcal_date_selector_set_date (GcalDateSelector *selector, g_return_if_fail (GCAL_IS_DATE_SELECTOR (selector)); /* set calendar's date */ - gcal_date_chooser_set_date (GCAL_DATE_CHOOSER (selector->date_chooser), date); + gcal_view_set_date (GCAL_VIEW (selector->date_chooser), date); update_text (selector); /* emit the MODIFIED signal */ @@ -305,5 +306,5 @@ gcal_date_selector_get_date (GcalDateSelector *selector) { g_return_val_if_fail (GCAL_IS_DATE_SELECTOR (selector), NULL); - return gcal_date_chooser_get_date (GCAL_DATE_CHOOSER (selector->date_chooser)); + return gcal_view_get_date (GCAL_VIEW (selector->date_chooser)); }