diff --git a/data/ui/week-view.ui b/data/ui/week-view.ui
index 62d8754c..7540bcb8 100644
--- a/data/ui/week-view.ui
+++ b/data/ui/week-view.ui
@@ -9,7 +9,6 @@
@@ -37,7 +36,6 @@
True
True
True
-
diff --git a/src/gcal-view.c b/src/gcal-view.c
index fae8a769..037bc052 100644
--- a/src/gcal-view.c
+++ b/src/gcal-view.c
@@ -75,24 +75,38 @@ gcal_view_default_init (GcalViewInterface *iface)
G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
}
+/**
+ * gcal_view_set_date:
+ * @view: a #GcalView
+ * @date: an #icaltimetype
+ *
+ * Sets the date of @view.
+ */
void
gcal_view_set_date (GcalView *view,
icaltimetype *date)
{
g_return_if_fail (GCAL_IS_VIEW (view));
+ g_return_if_fail (GCAL_VIEW_GET_IFACE (view)->set_date);
- g_object_set (view, "active-date", date, NULL);
+ GCAL_VIEW_GET_IFACE (view)->set_date (view, date);
}
+/**
+ * gcal_view_get_date:
+ * @view: a #GcalView
+ *
+ * Retrieves the date of @view.
+ *
+ * Returns: (transfer none): an #icaltimetype.
+ */
icaltimetype*
gcal_view_get_date (GcalView *view)
{
- icaltimetype *date;
-
g_return_val_if_fail (GCAL_IS_VIEW (view), NULL);
+ g_return_val_if_fail (GCAL_VIEW_GET_IFACE (view)->get_date, NULL);
- g_object_get (view, "active-date", &date, NULL);
- return date;
+ return GCAL_VIEW_GET_IFACE (view)->get_date (view);
}
/**
diff --git a/src/gcal-view.h b/src/gcal-view.h
index 8ec6e6c1..a1df2d27 100644
--- a/src/gcal-view.h
+++ b/src/gcal-view.h
@@ -42,6 +42,11 @@ struct _GcalViewInterface
icaltimetype *start_span,
icaltimetype *end_span);
+ icaltimetype* (*get_date) (GcalView *view);
+
+ void (*set_date) (GcalView *view,
+ icaltimetype *date);
+
/* Marks related API */
void (*clear_marks) (GcalView *view);
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 662d3d8e..89750c9f 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -268,7 +268,10 @@ update_active_date (GcalWindow *window,
previous_date = window->active_date;
window->active_date = new_date;
- g_object_notify (G_OBJECT (window), "active-date");
+
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), new_date);
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), new_date);
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_YEAR]), new_date);
/* year_view */
if (previous_date->year != new_date->year)
@@ -1234,82 +1237,6 @@ schedule_open_edit_dialog_by_uuid (OpenEditDialogData *edit_dialog_data)
return G_SOURCE_CONTINUE;
}
-static void
-gcal_window_constructed (GObject *object)
-{
- GcalWindow *window = GCAL_WINDOW (object);
-
- GtkBuilder *builder;
- GMenuModel *winmenu;
-
- GSettings *helper_settings;
- gchar *clock_format;
- gboolean use_24h_format;
-
- GCAL_ENTRY;
-
- if (G_OBJECT_CLASS (gcal_window_parent_class)->constructed != NULL)
- G_OBJECT_CLASS (gcal_window_parent_class)->constructed (object);
-
- helper_settings = g_settings_new ("org.gnome.desktop.interface");
- clock_format = g_settings_get_string (helper_settings, "clock-format");
- use_24h_format = (g_strcmp0 (clock_format, "24h") == 0);
- g_free (clock_format);
- g_object_unref (helper_settings);
-
- /* header_bar: menu */
- builder = gtk_builder_new ();
- gtk_builder_add_from_resource (builder,
- "/org/gnome/calendar/gtk/menus.ui",
- NULL);
-
- winmenu = (GMenuModel *)gtk_builder_get_object (builder, "win-menu");
- gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (window->menu_button),
- winmenu);
-
- g_object_unref (builder);
-
- window->views[GCAL_WINDOW_VIEW_WEEK] = window->week_view;
- window->views[GCAL_WINDOW_VIEW_MONTH] = window->month_view;
- window->views[GCAL_WINDOW_VIEW_YEAR] = window->year_view;
-
- gcal_edit_dialog_set_time_format (GCAL_EDIT_DIALOG (window->edit_dialog), use_24h_format);
-
- gcal_week_view_set_first_weekday (GCAL_WEEK_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), get_first_weekday ());
- gcal_week_view_set_use_24h_format (GCAL_WEEK_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), use_24h_format);
-
- gcal_month_view_set_first_weekday (GCAL_MONTH_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), get_first_weekday ());
- gcal_month_view_set_use_24h_format (GCAL_MONTH_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), use_24h_format);
-
- gcal_year_view_set_first_weekday (GCAL_YEAR_VIEW (window->views[GCAL_WINDOW_VIEW_YEAR]), get_first_weekday ());
- gcal_year_view_set_use_24h_format (GCAL_YEAR_VIEW (window->views[GCAL_WINDOW_VIEW_YEAR]), use_24h_format);
-
- /* search view */
- gcal_search_view_connect (GCAL_SEARCH_VIEW (window->search_view), window->manager);
- gcal_search_view_set_time_format (GCAL_SEARCH_VIEW (window->search_view), use_24h_format);
-
- /* refresh timeout, first is fast */
- window->refresh_timeout_id = g_timeout_add (FAST_REFRESH_TIMEOUT, (GSourceFunc) refresh_sources, object);
-
- /* calendars popover */
- gtk_list_box_set_sort_func (GTK_LIST_BOX (window->calendar_listbox), (GtkListBoxSortFunc) calendar_listbox_sort_func,
- object, NULL);
-
- if (!gcal_manager_get_loading (window->manager))
- {
- GList *sources, *l;
-
- sources = gcal_manager_get_sources_connected (window->manager);
-
- for (l = sources; l != NULL; l = g_list_next (l))
- add_source (window->manager, l->data, is_source_enabled (l->data), object);
-
- g_list_free (sources);
- }
-
- GCAL_EXIT;
-}
-
static void
gcal_window_finalize (GObject *object)
{
@@ -1380,6 +1307,19 @@ gcal_window_set_property (GObject *object,
case PROP_MANAGER:
if (g_set_object (&self->manager, g_value_get_object (value)))
{
+
+ if (!gcal_manager_get_loading (self->manager))
+ {
+ GList *sources, *l;
+
+ sources = gcal_manager_get_sources_connected (self->manager);
+
+ for (l = sources; l != NULL; l = g_list_next (l))
+ add_source (self->manager, l->data, is_source_enabled (l->data), self);
+
+ g_list_free (sources);
+ }
+
g_signal_connect (self->manager, "source-added", G_CALLBACK (add_source), object);
g_signal_connect (self->manager, "source-removed", G_CALLBACK (remove_source), object);
g_signal_connect_swapped (self->manager, "source-enabled", G_CALLBACK (source_enabled), object);
@@ -1487,7 +1427,6 @@ gcal_window_class_init(GcalWindowClass *klass)
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass);
- object_class->constructed = gcal_window_constructed;
object_class->finalize = gcal_window_finalize;
object_class->set_property = gcal_window_set_property;
object_class->get_property = gcal_window_get_property;
@@ -1523,7 +1462,6 @@ gcal_window_class_init(GcalWindowClass *klass)
"Date",
"The active/selected date",
ICAL_TIME_TYPE,
- G_PARAM_CONSTRUCT |
G_PARAM_READWRITE));
g_object_class_install_property (
@@ -1597,6 +1535,12 @@ gcal_window_class_init(GcalWindowClass *klass)
static void
gcal_window_init (GcalWindow *self)
{
+ GtkBuilder *builder;
+ GMenuModel *winmenu;
+ GSettings *helper_settings;
+ gchar *clock_format;
+ gboolean use_24h_format;
+
/* Setup actions */
g_action_map_add_action_entries (G_ACTION_MAP (self),
actions,
@@ -1609,6 +1553,52 @@ gcal_window_init (GcalWindow *self)
g_object_bind_property (self, "application", self->source_dialog, "application",
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+ helper_settings = g_settings_new ("org.gnome.desktop.interface");
+ clock_format = g_settings_get_string (helper_settings, "clock-format");
+ use_24h_format = (g_strcmp0 (clock_format, "24h") == 0);
+ g_free (clock_format);
+ g_object_unref (helper_settings);
+
+ /* header_bar: menu */
+ builder = gtk_builder_new ();
+ gtk_builder_add_from_resource (builder,
+ "/org/gnome/calendar/gtk/menus.ui",
+ NULL);
+
+ winmenu = (GMenuModel *)gtk_builder_get_object (builder, "win-menu");
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->menu_button),
+ winmenu);
+
+ g_object_unref (builder);
+
+ self->views[GCAL_WINDOW_VIEW_WEEK] = self->week_view;
+ self->views[GCAL_WINDOW_VIEW_MONTH] = self->month_view;
+ self->views[GCAL_WINDOW_VIEW_YEAR] = self->year_view;
+
+ gcal_edit_dialog_set_time_format (GCAL_EDIT_DIALOG (self->edit_dialog), use_24h_format);
+
+ gcal_week_view_set_first_weekday (GCAL_WEEK_VIEW (self->views[GCAL_WINDOW_VIEW_WEEK]), get_first_weekday ());
+ gcal_week_view_set_use_24h_format (GCAL_WEEK_VIEW (self->views[GCAL_WINDOW_VIEW_WEEK]), use_24h_format);
+
+ gcal_month_view_set_first_weekday (GCAL_MONTH_VIEW (self->views[GCAL_WINDOW_VIEW_MONTH]), get_first_weekday ());
+ gcal_month_view_set_use_24h_format (GCAL_MONTH_VIEW (self->views[GCAL_WINDOW_VIEW_MONTH]), use_24h_format);
+
+ gcal_year_view_set_first_weekday (GCAL_YEAR_VIEW (self->views[GCAL_WINDOW_VIEW_YEAR]), get_first_weekday ());
+ gcal_year_view_set_use_24h_format (GCAL_YEAR_VIEW (self->views[GCAL_WINDOW_VIEW_YEAR]), use_24h_format);
+
+ /* search view */
+ gcal_search_view_connect (GCAL_SEARCH_VIEW (self->search_view), self->manager);
+ gcal_search_view_set_time_format (GCAL_SEARCH_VIEW (self->search_view), use_24h_format);
+
+ /* refresh timeout, first is fast */
+ self->refresh_timeout_id = g_timeout_add (FAST_REFRESH_TIMEOUT, (GSourceFunc) refresh_sources, self);
+
+ /* calendars popover */
+ gtk_list_box_set_sort_func (GTK_LIST_BOX (self->calendar_listbox),
+ (GtkListBoxSortFunc) calendar_listbox_sort_func,
+ self,
+ NULL);
+
self->active_date = g_new0 (icaltimetype, 1);
self->rtl = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL;
}
diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c
index 82841a0d..5758ad50 100644
--- a/src/views/gcal-month-view.c
+++ b/src/views/gcal-month-view.c
@@ -24,6 +24,7 @@
#define G_LOG_DOMAIN "GcalMonthView"
+#include "gcal-debug.h"
#include "gcal-month-view.h"
#include "gcal-subscriber-view-private.h"
#include "gcal-utils.h"
@@ -914,6 +915,42 @@ add_new_event_button_cb (GtkWidget *button,
}
/* GcalView Interface API */
+static icaltimetype*
+gcal_month_view_get_date (GcalView *view)
+{
+ GcalMonthView *self = GCAL_MONTH_VIEW (view);
+
+ return self->date;
+}
+
+static void
+gcal_month_view_set_date (GcalView *view,
+ icaltimetype *date)
+{
+ GcalSubscriberViewPrivate *ppriv;
+ GcalMonthView *self;
+
+ GCAL_ENTRY;
+
+ self = GCAL_MONTH_VIEW (view);
+ ppriv = GCAL_SUBSCRIBER_VIEW (view)->priv;
+
+ g_clear_pointer (&self->date, g_free);
+
+ self->date = gcal_dup_icaltime (date);
+ self->days_delay = (time_day_of_week (1, self->date->month - 1, self->date->year) - self->first_weekday + 7) % 7;
+ self->keyboard_cell = self->days_delay + (self->date->day - 1);
+
+ GCAL_TRACE_MSG ("new date: %s", icaltime_as_ical_string (*date));
+
+ cancel_selection (self);
+
+ ppriv->children_changed = TRUE;
+ gtk_widget_queue_resize (GTK_WIDGET (view));
+
+ GCAL_EXIT;
+}
+
static void
gcal_month_view_clear_marks (GcalView *view)
{
@@ -939,6 +976,8 @@ gcal_month_view_get_children_by_uuid (GcalView *view,
static void
gcal_view_interface_init (GcalViewInterface *iface)
{
+ iface->get_date = gcal_month_view_get_date;
+ iface->set_date = gcal_month_view_set_date;
iface->clear_marks = gcal_month_view_clear_marks;
iface->get_children_by_uuid = gcal_month_view_get_children_by_uuid;
}
@@ -949,29 +988,12 @@ gcal_month_view_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- GcalSubscriberViewPrivate *ppriv;
- GcalMonthView *self;
-
- ppriv = GCAL_SUBSCRIBER_VIEW (object)->priv;
- self = GCAL_MONTH_VIEW (object);
-
switch (property_id)
{
case PROP_DATE:
- {
- if (self->date != NULL)
- g_free (self->date);
+ gcal_view_set_date (GCAL_VIEW (object), g_value_get_boxed (value));
+ break;
- self->date = g_value_dup_boxed (value);
- self->days_delay = (time_day_of_week (1, self->date->month - 1, self->date->year) - self->first_weekday + 7) % 7;
- self->keyboard_cell = self->days_delay + (self->date->day - 1);
-
- cancel_selection (GCAL_MONTH_VIEW (object));
-
- ppriv->children_changed = TRUE;
- gtk_widget_queue_resize (GTK_WIDGET (object));
- break;
- }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -2063,15 +2085,22 @@ gcal_month_view_button_release (GtkWidget *widget,
if (current_day >= self->days_delay && current_day < days)
{
+ gboolean valid;
+
g_clear_pointer (&self->end_mark_cell, g_date_time_unref);
self->keyboard_cell = current_day;
self->end_mark_cell = g_date_time_new_local (self->date->year, self->date->month, current_day - self->days_delay + 1, 0, 0, 0);
self->date->day = g_date_time_get_day_of_month (self->end_mark_cell);
+
+ /* First, make sure to show the popover */
+ valid = show_popover_for_position (GCAL_MONTH_VIEW (widget), x, y, released_indicator);
+
+ /* Then update the active date */
g_object_notify (G_OBJECT (self), "active-date");
- return show_popover_for_position (GCAL_MONTH_VIEW (widget), x, y, released_indicator);
+ return valid;
}
else
{
diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c
index 59ec049f..004ad1f0 100644
--- a/src/views/gcal-week-grid.c
+++ b/src/views/gcal-week-grid.c
@@ -74,12 +74,6 @@ struct _GcalWeekGrid
G_DEFINE_TYPE (GcalWeekGrid, gcal_week_grid, GTK_TYPE_CONTAINER);
-enum
-{
- PROP_0,
- PROP_ACTIVE_DATE,
- LAST_PROP
-};
enum
{
@@ -88,7 +82,6 @@ enum
};
static guint signals[LAST_SIGNAL] = { 0, };
-static GParamSpec* properties[LAST_PROP] = { NULL, };
/* ChildData methods */
static ChildData*
@@ -311,17 +304,7 @@ gcal_week_grid_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
- GcalWeekGrid *self = GCAL_WEEK_GRID (object);
-
- switch (prop_id)
- {
- case PROP_ACTIVE_DATE:
- g_value_set_boxed (value, self->active_date);
- return;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
static void
@@ -330,21 +313,7 @@ gcal_week_grid_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- GcalWeekGrid *self = GCAL_WEEK_GRID (object);
-
- switch (prop_id)
- {
- case PROP_ACTIVE_DATE:
- g_clear_pointer (&self->active_date, g_free);
- self->active_date = g_value_dup_boxed (value);
-
- gtk_widget_queue_resize (GTK_WIDGET (self));
- gtk_widget_queue_draw (GTK_WIDGET (self));
- return;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
static void
@@ -1115,13 +1084,6 @@ gcal_week_grid_class_init (GcalWeekGridClass *klass)
widget_class->drag_leave = gcal_week_grid_drag_leave;
widget_class->drag_drop = gcal_week_grid_drag_drop;
- properties[PROP_ACTIVE_DATE] = g_param_spec_boxed ("active-date",
- "Date",
- "The active selected date",
- ICAL_TIME_TYPE,
- G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
-
-
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_GRID,
G_SIGNAL_RUN_FIRST,
@@ -1130,8 +1092,6 @@ gcal_week_grid_class_init (GcalWeekGridClass *klass)
1,
GCAL_TYPE_EVENT_WIDGET);
- g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
-
gtk_widget_class_set_css_name (widget_class, "weekgrid");
}
@@ -1290,3 +1250,14 @@ gcal_week_grid_clear_marks (GcalWeekGrid *self)
gtk_widget_queue_draw (GTK_WIDGET (self));
}
+
+void
+gcal_week_grid_set_date (GcalWeekGrid *self,
+ icaltimetype *date)
+{
+ g_clear_pointer (&self->active_date, g_free);
+ self->active_date = gcal_dup_icaltime (date);
+
+ gtk_widget_queue_resize (GTK_WIDGET (self));
+ gtk_widget_queue_draw (GTK_WIDGET (self));
+}
diff --git a/src/views/gcal-week-grid.h b/src/views/gcal-week-grid.h
index 99925082..2d519b32 100644
--- a/src/views/gcal-week-grid.h
+++ b/src/views/gcal-week-grid.h
@@ -51,6 +51,9 @@ GList* gcal_week_grid_get_children_by_uuid (GcalWeekGrid
void gcal_week_grid_clear_marks (GcalWeekGrid *self);
+void gcal_week_grid_set_date (GcalWeekGrid *self,
+ icaltimetype *date);
+
G_END_DECLS
#endif /* GCAL_WEEK_GRID_H */
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 23e0a4f7..6cbcc731 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -84,12 +84,6 @@ typedef enum
DOWN
} MoveDirection;
-enum
-{
- PROP_0,
- PROP_ACTIVE_DATE
-};
-
enum
{
EVENT_ACTIVATED,
@@ -1060,17 +1054,7 @@ gcal_week_header_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
- GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
-
- switch (prop_id)
- {
- case PROP_ACTIVE_DATE:
- g_value_set_boxed (value, self->active_date);
- return;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
static void
@@ -1079,41 +1063,7 @@ gcal_week_header_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
- icaltimetype *old_date, *new_date;
-
- switch (prop_id)
- {
- case PROP_ACTIVE_DATE:
- old_date = self->active_date;
- new_date = g_value_dup_boxed (value);
-
- /*
- * If the active date changed, but we're still in the same week,
- * there's no need to recalculate visible events.
- */
- if (old_date && new_date &&
- old_date->year == new_date->year &&
- icaltime_week_number (*old_date) == icaltime_week_number (*new_date))
- {
- g_free (new_date);
- break;
- }
-
- self->active_date = new_date;
-
- update_title (self);
- gtk_widget_queue_draw (GTK_WIDGET (self));
-
- if (old_date)
- update_unchanged_events (self, self->active_date);
-
- g_clear_pointer (&old_date, g_free);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
static void
@@ -1514,14 +1464,6 @@ gcal_week_header_class_init (GcalWeekHeaderClass *kclass)
widget_class->drag_leave = gcal_week_header_drag_leave;
widget_class->drag_drop = gcal_week_header_drag_drop;
- g_object_class_install_property (object_class,
- PROP_ACTIVE_DATE,
- g_param_spec_boxed ("active-date",
- "Date",
- "The active selected date",
- ICAL_TIME_TYPE,
- G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
-
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_HEADER,
G_SIGNAL_RUN_FIRST,
@@ -1787,3 +1729,35 @@ gcal_week_header_clear_marks (GcalWeekHeader *self)
gtk_widget_queue_draw (GTK_WIDGET (self));
}
+
+void
+gcal_week_header_set_date (GcalWeekHeader *self,
+ icaltimetype *date)
+{
+ icaltimetype *old_date, *new_date;
+
+ old_date = self->active_date;
+ new_date = gcal_dup_icaltime (date);
+
+ /*
+ * If the active date changed, but we're still in the same week,
+ * there's no need to recalculate visible events.
+ */
+ if (old_date && new_date &&
+ old_date->year == new_date->year &&
+ icaltime_week_number (*old_date) == icaltime_week_number (*new_date))
+ {
+ g_free (new_date);
+ return;
+ }
+
+ self->active_date = new_date;
+
+ update_title (self);
+ gtk_widget_queue_draw (GTK_WIDGET (self));
+
+ if (old_date)
+ update_unchanged_events (self, self->active_date);
+
+ g_clear_pointer (&old_date, g_free);
+}
diff --git a/src/views/gcal-week-header.h b/src/views/gcal-week-header.h
index fa866dc0..8c9d9046 100644
--- a/src/views/gcal-week-header.h
+++ b/src/views/gcal-week-header.h
@@ -53,6 +53,9 @@ GtkSizeGroup* gcal_week_header_get_sidebar_size_group (GcalWeekHeader
void gcal_week_header_clear_marks (GcalWeekHeader *self);
+void gcal_week_header_set_date (GcalWeekHeader *self,
+ icaltimetype *date);
+
G_END_DECLS
#endif /* GCAL_WEEK_HEADER_H */
diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c
index b115919e..8d7fcb4c 100644
--- a/src/views/gcal-week-view.c
+++ b/src/views/gcal-week-view.c
@@ -162,6 +162,35 @@ schedule_position_scroll (GcalWeekView *self)
self);
}
+/* GcalView implementation */
+static icaltimetype*
+gcal_week_view_get_date (GcalView *view)
+{
+ GcalWeekView *self = GCAL_WEEK_VIEW (view);
+
+ return self->date;
+}
+
+static void
+gcal_week_view_set_date (GcalView *view,
+ icaltimetype *date)
+{
+ GcalWeekView *self = GCAL_WEEK_VIEW (view);
+
+ GCAL_ENTRY;
+
+ g_clear_pointer (&self->date, g_free);
+ self->date = gcal_dup_icaltime (date);
+
+ /* Propagate the new date */
+ gcal_week_grid_set_date (GCAL_WEEK_GRID (self->week_grid), date);
+ gcal_week_header_set_date (GCAL_WEEK_HEADER (self->header), date);
+
+ schedule_position_scroll (self);
+
+ GCAL_EXIT;
+}
+
static GList*
gcal_week_view_get_children_by_uuid (GcalView *view,
const gchar *uuid)
@@ -185,6 +214,15 @@ gcal_week_view_clear_marks (GcalView *view)
gcal_week_grid_clear_marks (GCAL_WEEK_GRID (self->week_grid));
}
+static void
+gcal_view_interface_init (GcalViewInterface *iface)
+{
+ iface->get_date = gcal_week_view_get_date;
+ iface->set_date = gcal_week_view_set_date;
+ iface->get_children_by_uuid = gcal_week_view_get_children_by_uuid;
+ iface->clear_marks = gcal_week_view_clear_marks;
+}
+
static void
update_hours_sidebar_size (GcalWeekView *self)
{
@@ -239,6 +277,8 @@ update_hours_sidebar_size (GcalWeekView *self)
g_object_unref (layout);
}
+
+/* ECalDataModelSubscriber implementation */
static void
gcal_week_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
@@ -429,13 +469,6 @@ gcal_week_view_draw_hours (GcalWeekView *self,
return FALSE;
}
-static void
-gcal_view_interface_init (GcalViewInterface *iface)
-{
- iface->get_children_by_uuid = gcal_week_view_get_children_by_uuid;
- iface->clear_marks = gcal_week_view_clear_marks;
-}
-
static void
gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface)
{
@@ -465,18 +498,10 @@ gcal_week_view_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- GcalWeekView *self;
-
- self = GCAL_WEEK_VIEW (object);
-
switch (property_id)
{
case PROP_DATE:
- g_clear_pointer (&self->date, g_free);
- self->date = g_value_dup_boxed (value);
-
- schedule_position_scroll (self);
-
+ gcal_view_set_date (GCAL_VIEW (object), g_value_get_boxed (value));
break;
default:
diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c
index de5a2f33..68c6db33 100644
--- a/src/views/gcal-year-view.c
+++ b/src/views/gcal-year-view.c
@@ -19,6 +19,7 @@
#define G_LOG_DOMAIN "GcalYearView"
+#include "gcal-debug.h"
#include "gcal-year-view.h"
#include "gcal-view.h"
#include "gcal-utils.h"
@@ -553,7 +554,7 @@ update_date (GcalYearView *year_view,
needs_reset = TRUE;
g_clear_pointer (&year_view->date, g_free);
- year_view->date = new_date;
+ year_view->date = gcal_dup_icaltime (new_date);
year_view->first_week_of_year = get_last_week_of_year_dmy (year_view->first_weekday,
1, G_DATE_JANUARY, year_view->date->year);;
@@ -1541,6 +1542,62 @@ navigator_drag_leave_cb (GcalYearView *self,
gtk_widget_queue_draw (navigator);
}
+/* GcalView implementation */
+static icaltimetype*
+gcal_year_view_get_date (GcalView *view)
+{
+ GcalYearView *self = GCAL_YEAR_VIEW (view);
+
+ return self->date;
+}
+
+static void
+gcal_year_view_set_date (GcalView *view,
+ icaltimetype *date)
+{
+ GCAL_ENTRY;
+
+ update_date (GCAL_YEAR_VIEW (view), date);
+
+ GCAL_EXIT;
+}
+
+static GList*
+gcal_year_view_get_children_by_uuid (GcalView *view,
+ const gchar *uuid)
+{
+ GcalYearView *year_view = GCAL_YEAR_VIEW (view);
+ GList *children, *l, *result = NULL;
+
+ children = gtk_container_get_children (GTK_CONTAINER (year_view->events_sidebar));
+
+ for (l = children; l != NULL; l = g_list_next (l))
+ {
+ GcalEventWidget *child_widget;
+ GcalEvent *event;
+
+ child_widget = GCAL_EVENT_WIDGET (gtk_bin_get_child (GTK_BIN (l->data)));
+ event = gcal_event_widget_get_event (child_widget);
+
+
+ if (child_widget != NULL && g_strcmp0 (uuid, gcal_event_get_uid (event)) == 0)
+ result = g_list_append (result, child_widget);
+ }
+
+ g_list_free (children);
+
+ return result;
+}
+
+static void
+gcal_view_interface_init (GcalViewInterface *iface)
+{
+ /* FIXME: implement what's needed */
+ iface->get_date = gcal_year_view_get_date;
+ iface->set_date = gcal_year_view_set_date;
+ iface->get_children_by_uuid = gcal_year_view_get_children_by_uuid;
+}
+
static void
gcal_year_view_finalize (GObject *object)
{
@@ -1597,7 +1654,7 @@ gcal_year_view_set_property (GObject *object,
switch (prop_id)
{
case PROP_DATE:
- update_date (self, g_value_dup_boxed (value));
+ gcal_view_set_date (GCAL_VIEW (self), g_value_get_boxed (value));
break;
case PROP_SHOW_WEEK_NUMBERS:
@@ -1716,31 +1773,6 @@ gcal_year_view_direction_changed (GtkWidget *widget,
year_view->k = 1;
}
-static GList*
-gcal_year_view_get_children_by_uuid (GcalView *view,
- const gchar *uuid)
-{
- GcalYearView *year_view = GCAL_YEAR_VIEW (view);
- GList *children, *l, *result = NULL;
-
- children = gtk_container_get_children (GTK_CONTAINER (year_view->events_sidebar));
- for (l = children; l != NULL; l = g_list_next (l))
- {
- GcalEventWidget *child_widget;
- GcalEvent *event;
-
- child_widget = GCAL_EVENT_WIDGET (gtk_bin_get_child (GTK_BIN (l->data)));
- event = gcal_event_widget_get_event (child_widget);
-
-
- if (child_widget != NULL && g_strcmp0 (uuid, gcal_event_get_uid (event)) == 0)
- result = g_list_append (result, child_widget);
- }
- g_list_free (children);
-
- return result;
-}
-
static void
gcal_year_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
@@ -1780,7 +1812,6 @@ gcal_year_view_component_added (ECalDataModelSubscriber *subscriber,
for (i = start_month; i <= end_month; i++)
g_ptr_array_add (self->events[i], event);
- update_selected_dates_from_button_data (self);
update_sidebar (self);
gtk_widget_queue_draw (GTK_WIDGET (self->navigator));
@@ -1985,13 +2016,6 @@ gcal_year_view_init (GcalYearView *self)
GDK_ACTION_MOVE);
}
-static void
-gcal_view_interface_init (GcalViewInterface *iface)
-{
- /* FIXME: implement what's needed */
- iface->get_children_by_uuid = gcal_year_view_get_children_by_uuid;
-}
-
static void
gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface)
{