view: rework active-date
The current implementation is deficient in many ways, the worst one being the it relying on GObject semi-synchronous property emission. This issue was exposed by the Week view code, where the active date was updated, but delayed to reach the Week header and some events were being added ~before~ the active date changed. With this work, I was also able to figure out a bunch of code that relied on this (i.e. luck) to work.
This commit is contained in:
@@ -9,7 +9,6 @@
|
||||
<child>
|
||||
<object class="GcalWeekHeader" id="header">
|
||||
<property name="visible">True</property>
|
||||
<property name="active-date" bind-source="GcalWeekView" bind-property="active-date" bind-flags="default" />
|
||||
<signal name="event-activated" handler="on_event_activated" object="GcalWeekView" swapped="yes" />
|
||||
</object>
|
||||
</child>
|
||||
@@ -37,7 +36,6 @@
|
||||
<property name="visible">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="active-date" bind-source="GcalWeekView" bind-property="active-date" bind-flags="default" />
|
||||
<signal name="event-activated" handler="on_event_activated" object="GcalWeekView" swapped="yes" />
|
||||
</object>
|
||||
</child>
|
||||
|
||||
+19
-5
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+69
-79
@@ -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;
|
||||
}
|
||||
|
||||
+49
-20
@@ -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
|
||||
{
|
||||
|
||||
+13
-42
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
+41
-16
@@ -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:
|
||||
|
||||
+59
-35
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user