[gnome-calendar] date-chooser: Implement GcalView
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] date-chooser: Implement GcalView
- Date: Thu, 16 Jun 2022 11:44:37 +0000 (UTC)
commit db0f07136c6a4e6969da67d7de3b14c095a53b4d
Author: Adrien Plazas <kekun plazas laposte net>
Date: Thu Apr 7 11:47:22 2022 +0200
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 <stdlib.h>
#include <langinfo.h>
#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 <locale.h>
#include <langinfo.h>
@@ -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));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]