views: cleanup code

This commit is contained in:
Georges Basile Stavracas Neto
2017-03-17 11:13:19 -03:00
parent 0d44471546
commit 339b49e7d5
7 changed files with 545 additions and 714 deletions
+131 -164
View File
@@ -35,48 +35,12 @@ enum
static guint signals[NUM_SIGNALS] = { 0, };
static void event_activated (GcalEventWidget *widget,
gpointer user_data);
static void gcal_subscriber_view_clear_state (GcalSubscriberView *self);
static void event_visibility_changed (GtkWidget *widget,
gpointer user_data);
static guint gcal_subscriber_view_get_child_cell (GcalSubscriberView *self,
GcalEventWidget *child);
static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface);
static void gcal_subscriber_view_finalize (GObject *object);
static void gcal_subscriber_view_add (GtkContainer *container,
GtkWidget *widget);
static void gcal_subscriber_view_remove (GtkContainer *container,
GtkWidget *widget);
static void gcal_subscriber_view_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
gpointer callback_data);
static guint gcal_subscriber_view_get_child_cell (GcalSubscriberView *subscriber,
GcalEventWidget *child);
static void gcal_subscriber_view_clear_state (GcalSubscriberView *subscriber_view);
static void gcal_subscriber_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp);
static void gcal_subscriber_view_component_modified (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp);
static void gcal_subscriber_view_component_removed (ECalDataModelSubscriber *subscriber,
ECalClient *client,
const gchar *uid,
const gchar *rid);
static void gcal_subscriber_view_freeze (ECalDataModelSubscriber *subscriber);
static void gcal_subscriber_view_thaw (ECalDataModelSubscriber *subscriber);
static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GcalSubscriberView, gcal_subscriber_view, GTK_TYPE_CONTAINER,
G_ADD_PRIVATE (GcalSubscriberView)
@@ -93,47 +57,130 @@ event_activated (GcalEventWidget *widget,
}
static void
event_visibility_changed(GtkWidget *widget,
gpointer user_data)
event_visibility_changed (GtkWidget *widget,
gpointer user_data)
{
GcalSubscriberViewPrivate *priv = GCAL_SUBSCRIBER_VIEW (user_data)->priv;
priv->children_changed = TRUE;
}
/* ECalDataModelSubscriber interface API */
static void
gcal_subscriber_view_class_init (GcalSubscriberViewClass *klass)
gcal_subscriber_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp)
{
GtkContainerClass *container_class;
GtkWidget *event_widget;
GcalEvent *event;
GError *error;
klass->get_child_cell = gcal_subscriber_view_get_child_cell;
error = NULL;
event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
G_OBJECT_CLASS (klass)->finalize = gcal_subscriber_view_finalize;
if (error)
{
g_message ("Error creating event: %s", error->message);
g_clear_error (&error);
return;
}
container_class = GTK_CONTAINER_CLASS (klass);
container_class->add = gcal_subscriber_view_add;
container_class->remove = gcal_subscriber_view_remove;
container_class->forall = gcal_subscriber_view_forall;
event_widget = gcal_event_widget_new (event);
gcal_event_widget_set_read_only (GCAL_EVENT_WIDGET (event_widget), e_client_is_readonly (E_CLIENT (client)));
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated", GCAL_TYPE_SUBSCRIBER_VIEW, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalSubscriberViewClass, event_activated),
NULL, NULL, NULL,
G_TYPE_NONE, 1, GCAL_TYPE_EVENT_WIDGET);
gtk_widget_show (event_widget);
gtk_container_add (GTK_CONTAINER (subscriber), event_widget);
g_clear_object (&event);
}
static void
gcal_subscriber_view_init (GcalSubscriberView *self)
gcal_subscriber_view_component_modified (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp)
{
GcalSubscriberViewPrivate *priv;
GList *l;
GtkWidget *new_widget;
GcalEvent *event;
GError *error;
priv = gcal_subscriber_view_get_instance_private (self);
self->priv = priv;
error = NULL;
priv = gcal_subscriber_view_get_instance_private (GCAL_SUBSCRIBER_VIEW (subscriber));
event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
priv->children = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_list_free);
priv->single_cell_children = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_list_free);
priv->overflow_cells = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_list_free);
priv->hidden_as_overflow = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
if (error)
{
g_message ("Error creating event: %s", error->message);
g_clear_error (&error);
return;
}
new_widget = gcal_event_widget_new (event);
l = g_hash_table_lookup (priv->children, gcal_event_get_uid (event));
if (l != NULL)
{
gtk_widget_destroy (l->data);
gtk_widget_show (new_widget);
gtk_container_add (GTK_CONTAINER (subscriber), new_widget);
}
else
{
g_warning ("%s: Widget with uuid: %s not found in view: %s",
G_STRFUNC, gcal_event_get_uid (event),
gtk_widget_get_name (GTK_WIDGET (subscriber)));
gtk_widget_destroy (new_widget);
}
g_clear_object (&event);
}
static void
gcal_subscriber_view_component_removed (ECalDataModelSubscriber *subscriber,
ECalClient *client,
const gchar *uid,
const gchar *rid)
{
GcalSubscriberViewPrivate *priv;
const gchar *sid;
gchar *uuid;
GList *l;
priv = gcal_subscriber_view_get_instance_private (GCAL_SUBSCRIBER_VIEW (subscriber));
sid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
if (rid != NULL)
uuid = g_strdup_printf ("%s:%s:%s", sid, uid, rid);
else
uuid = g_strdup_printf ("%s:%s", sid, uid);
l = g_hash_table_lookup (priv->children, uuid);
if (l != NULL)
{
gtk_widget_destroy (l->data);
}
else
{
g_warning ("%s: Widget with uuid: %s not found in view: %s",
G_STRFUNC, uuid, gtk_widget_get_name (GTK_WIDGET (subscriber)));
}
g_free (uuid);
}
static void
gcal_subscriber_view_freeze (ECalDataModelSubscriber *subscriber)
{
}
static void
gcal_subscriber_view_thaw (ECalDataModelSubscriber *subscriber)
{
}
static void
gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface)
{
@@ -197,7 +244,9 @@ gcal_subscriber_view_add (GtkContainer *container,
}
else
{
guint cell_idx = gcal_subscriber_view_get_child_cell (GCAL_SUBSCRIBER_VIEW (container), GCAL_EVENT_WIDGET (widget));
guint cell_idx;
cell_idx = gcal_subscriber_view_get_child_cell (GCAL_SUBSCRIBER_VIEW (container), GCAL_EVENT_WIDGET (widget));
l = g_hash_table_lookup (priv->single_cell_children, GINT_TO_POINTER (cell_idx));
l = g_list_insert_sorted (l, widget, (GCompareFunc) gcal_event_widget_compare_by_start_date);
@@ -337,7 +386,7 @@ gcal_subscriber_view_forall (GtkContainer *container,
static guint
gcal_subscriber_view_get_child_cell (GcalSubscriberView *subscriber,
GcalEventWidget *child)
GcalEventWidget *child)
{
GcalSubscriberViewClass *klass;
@@ -364,120 +413,38 @@ gcal_subscriber_view_clear_state (GcalSubscriberView *subscriber_view)
klass->clear_state (subscriber_view);
}
/* ECalDataModelSubscriber interface API */
static void
gcal_subscriber_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp)
gcal_subscriber_view_class_init (GcalSubscriberViewClass *klass)
{
GtkWidget *event_widget;
GcalEvent *event;
GError *error;
GtkContainerClass *container_class;
error = NULL;
event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
klass->get_child_cell = gcal_subscriber_view_get_child_cell;
if (error)
{
g_message ("Error creating event: %s", error->message);
g_clear_error (&error);
return;
}
G_OBJECT_CLASS (klass)->finalize = gcal_subscriber_view_finalize;
event_widget = gcal_event_widget_new (event);
gcal_event_widget_set_read_only (GCAL_EVENT_WIDGET (event_widget), e_client_is_readonly (E_CLIENT (client)));
container_class = GTK_CONTAINER_CLASS (klass);
container_class->add = gcal_subscriber_view_add;
container_class->remove = gcal_subscriber_view_remove;
container_class->forall = gcal_subscriber_view_forall;
gtk_widget_show (event_widget);
gtk_container_add (GTK_CONTAINER (subscriber), event_widget);
g_clear_object (&event);
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated", GCAL_TYPE_SUBSCRIBER_VIEW, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalSubscriberViewClass, event_activated),
NULL, NULL, NULL,
G_TYPE_NONE, 1, GCAL_TYPE_EVENT_WIDGET);
}
static void
gcal_subscriber_view_component_modified (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp)
gcal_subscriber_view_init (GcalSubscriberView *self)
{
GcalSubscriberViewPrivate *priv;
GList *l;
GtkWidget *new_widget;
GcalEvent *event;
GError *error;
error = NULL;
priv = gcal_subscriber_view_get_instance_private (GCAL_SUBSCRIBER_VIEW (subscriber));
event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
priv = gcal_subscriber_view_get_instance_private (self);
self->priv = priv;
if (error)
{
g_message ("Error creating event: %s", error->message);
g_clear_error (&error);
return;
}
new_widget = gcal_event_widget_new (event);
l = g_hash_table_lookup (priv->children, gcal_event_get_uid (event));
if (l != NULL)
{
gtk_widget_destroy (l->data);
gtk_widget_show (new_widget);
gtk_container_add (GTK_CONTAINER (subscriber), new_widget);
}
else
{
g_warning ("%s: Widget with uuid: %s not found in view: %s",
G_STRFUNC, gcal_event_get_uid (event),
gtk_widget_get_name (GTK_WIDGET (subscriber)));
gtk_widget_destroy (new_widget);
}
g_clear_object (&event);
}
static void
gcal_subscriber_view_component_removed (ECalDataModelSubscriber *subscriber,
ECalClient *client,
const gchar *uid,
const gchar *rid)
{
GcalSubscriberViewPrivate *priv;
const gchar *sid;
gchar *uuid;
GList *l;
priv = gcal_subscriber_view_get_instance_private (GCAL_SUBSCRIBER_VIEW (subscriber));
sid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
if (rid != NULL)
uuid = g_strdup_printf ("%s:%s:%s", sid, uid, rid);
else
uuid = g_strdup_printf ("%s:%s", sid, uid);
l = g_hash_table_lookup (priv->children, uuid);
if (l != NULL)
{
gtk_widget_destroy (l->data);
}
else
{
g_warning ("%s: Widget with uuid: %s not found in view: %s",
G_STRFUNC, uuid, gtk_widget_get_name (GTK_WIDGET (subscriber)));
}
g_free (uuid);
}
static void
gcal_subscriber_view_freeze (ECalDataModelSubscriber *subscriber)
{
}
static void
gcal_subscriber_view_thaw (ECalDataModelSubscriber *subscriber)
{
priv->children = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_list_free);
priv->single_cell_children = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_list_free);
priv->overflow_cells = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_list_free);
priv->hidden_as_overflow = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
}
/* Public API */
+323 -408
View File
@@ -95,104 +95,20 @@ struct _GcalMonthView
GcalManager *manager;
};
#define MIRROR(val,start,end) (start + (val / end) * end + (end - val % end))
static void gcal_view_interface_init (GcalViewInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GcalMonthView, gcal_month_view, GCAL_TYPE_SUBSCRIBER_VIEW,
G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init));
enum
{
PROP_0,
PROP_DATE, /* active-date inherited property */
};
#define MIRROR(val,start,end) (start + (val / end) * end + (end - val % end))
static gint gather_button_event_data (GcalMonthView *view,
gdouble x,
gdouble y,
gboolean *out_on_indicator,
gdouble *out_x,
gdouble *out_y);
static gdouble get_start_grid_y (GtkWidget *widget);
static gboolean get_widget_parts (gint first_cell,
gint last_cell,
gint natural_height,
gdouble vertical_cell_space,
gdouble *size_left,
GArray *cells,
GArray *lengths);
static void rebuild_popover_for_day (GcalMonthView *view,
gint day);
static void update_list_box_headers (GtkListBoxRow *row,
GtkListBoxRow *before,
gpointer user_data);
static gboolean gcal_month_view_key_press (GtkWidget *widget,
GdkEventKey *event);
static void add_new_event_button_cb (GtkWidget *button,
gpointer user_data);
static void gcal_month_view_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gcal_month_view_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gcal_month_view_finalize (GObject *object);
static void gcal_month_view_realize (GtkWidget *widget);
static void gcal_month_view_unrealize (GtkWidget *widget);
static void gcal_month_view_map (GtkWidget *widget);
static void gcal_month_view_unmap (GtkWidget *widget);
static void gcal_month_view_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static gboolean gcal_month_view_draw (GtkWidget *widget,
cairo_t *cr);
static gboolean gcal_month_view_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gcal_month_view_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event);
static gboolean gcal_month_view_button_release (GtkWidget *widget,
GdkEventButton *event);
static void gcal_month_view_direction_changed (GtkWidget *widget,
GtkTextDirection previous_direction);
static guint gcal_month_view_get_child_cell (GcalSubscriberView *subscriber,
GcalEventWidget *child);
static void gcal_month_view_clear_state (GcalSubscriberView *subscriber);
static icaltimetype* gcal_month_view_get_initial_date (GcalView *view);
static icaltimetype* gcal_month_view_get_final_date (GcalView *view);
static void gcal_month_view_clear_marks (GcalView *view);
static GList* gcal_month_view_get_children_by_uuid (GcalView *view,
const gchar *uuid);
static void gcal_view_interface_init (GcalViewInterface *iface);
static void cancel_selection (GcalMonthView *month_view);
G_DEFINE_TYPE_WITH_CODE (GcalMonthView, gcal_month_view, GCAL_TYPE_SUBSCRIBER_VIEW,
G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init));
static gint
static inline gint
real_cell (gint cell,
gboolean rtl)
{
@@ -202,13 +118,54 @@ real_cell (gint cell,
return rtl ? MIRROR (cell, 0, 7) - 1 : cell;
}
static void
static inline void
cancel_selection (GcalMonthView *self)
{
g_clear_pointer (&self->start_mark_cell, g_date_time_unref);
g_clear_pointer (&self->end_mark_cell, g_date_time_unref);
}
static gdouble
get_start_grid_y (GtkWidget *widget)
{
GtkStyleContext* context;
GtkStateFlags state_flags;
gint padding_top;
PangoLayout *layout;
PangoFontDescription *font_desc;
gint font_height;
gdouble start_grid_y;
context = gtk_widget_get_style_context (widget);
state_flags = gtk_style_context_get_state (context);
layout = gtk_widget_create_pango_layout (widget, NULL);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "start-header");
gtk_style_context_get (context, state_flags, "padding-top", &padding_top, "font", &font_desc, NULL);
pango_layout_set_font_description (layout, font_desc);
pango_layout_get_pixel_size (layout, NULL, &font_height);
pango_font_description_free (font_desc);
gtk_style_context_restore (context);
start_grid_y = 2 * padding_top + font_height;
gtk_style_context_get (context, state_flags, "font", &font_desc, "padding-top", &padding_top, NULL);
pango_layout_set_font_description (layout, font_desc);
pango_layout_get_pixel_size (layout, NULL, &font_height);
start_grid_y += padding_top + font_height;
pango_font_description_free (font_desc);
g_object_unref (layout);
return start_grid_y;
}
static void
get_cell_position (GcalMonthView *self,
gint cell,
@@ -241,6 +198,131 @@ get_cell_position (GcalMonthView *self,
if (out_y != NULL)
*out_y = cell_height * ((cell / 7) + first_row_gap + 0.5) + start_grid_y;
}
static void
rebuild_popover_for_day (GcalMonthView *self,
gint day)
{
GcalSubscriberViewPrivate *ppriv;
GList *l;
GtkWidget *child_widget;
GdkRectangle rect;
gchar *label_title;
/* placement helpers */
gdouble start_grid_y, cell_width, cell_height;
gint shown_rows;
gint real_clicked_popover_cell;
GtkStyleContext *context;
GtkStateFlags state;
PangoLayout *overflow_layout;
PangoFontDescription *ofont_desc;
gint font_height, padding_bottom;
ppriv = GCAL_SUBSCRIBER_VIEW (self)->priv;
label_title = g_strdup_printf ("%s %d", gcal_get_month_name (self->date->month - 1), day);
gtk_label_set_text (GTK_LABEL (self->popover_title), label_title);
g_free (label_title);
/* Clean all the widgets */
gtk_container_foreach (GTK_CONTAINER (self->events_list_box), (GtkCallback) gtk_widget_destroy, NULL);
l = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (self->pressed_overflow_indicator));
/* Setup the start & end dates of the events as the begin & end of day */
if (l)
{
for (; l != NULL; l = g_list_next (l))
{
GtkWidget *cloned_event;
GDateTime *current_date;
GDateTime *dt_start;
GDateTime *dt_end;
GcalEvent *event;
GTimeZone *tz;
event = gcal_event_widget_get_event (l->data);
if (gcal_event_get_all_day (event))
tz = g_time_zone_new_utc ();
else
tz = g_time_zone_new_local ();
current_date = icaltime_to_datetime (self->date);
dt_start = g_date_time_new (tz,
g_date_time_get_year (current_date),
g_date_time_get_month (current_date),
day,
0, 0, 0);
dt_end = g_date_time_add_days (dt_start, 1);
cloned_event = gcal_event_widget_clone (l->data);
gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (cloned_event), dt_start);
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (cloned_event), dt_end);
gtk_container_add (GTK_CONTAINER (self->events_list_box), cloned_event);
_gcal_subscriber_view_setup_child (GCAL_SUBSCRIBER_VIEW (self), cloned_event);
g_clear_pointer (&current_date, g_date_time_unref);
g_clear_pointer (&dt_start, g_date_time_unref);
g_clear_pointer (&dt_end, g_date_time_unref);
g_clear_pointer (&tz, g_time_zone_unref);
}
}
/* placement calculation */
start_grid_y = get_start_grid_y (GTK_WIDGET (self));
shown_rows = ceil ((self->days_delay + icaltime_days_in_month (self->date->month, self->date->year)) / 7.0);
cell_width = gtk_widget_get_allocated_width (GTK_WIDGET (self)) / 7.0;
cell_height = (gtk_widget_get_allocated_height (GTK_WIDGET (self)) - start_grid_y) / 6.0;
context = gtk_widget_get_style_context (GTK_WIDGET (self));
state = gtk_style_context_get_state (context);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "overflow");
gtk_style_context_get (context, state, "font", &ofont_desc, "padding-bottom", &padding_bottom, NULL);
overflow_layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), NULL);
pango_layout_set_font_description (overflow_layout, ofont_desc);
pango_layout_get_pixel_size (overflow_layout, NULL, &font_height);
gtk_style_context_restore (context);
pango_font_description_free (ofont_desc);
g_object_unref (overflow_layout);
real_clicked_popover_cell = real_cell (self->pressed_overflow_indicator, self->k);
rect.y = cell_height * ((real_clicked_popover_cell / 7) + 1.0 + (6 - shown_rows) * 0.5) + start_grid_y - padding_bottom - font_height / 2;
rect.width = 1;
rect.height = 1;
if (real_clicked_popover_cell % 7 < 3)
{
rect.x = cell_width * ((real_clicked_popover_cell % 7) + 1.0);
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), self->k ? GTK_POS_LEFT : GTK_POS_RIGHT);
}
else if (real_clicked_popover_cell % 7 > 3)
{
rect.x = cell_width * ((real_clicked_popover_cell % 7));
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), self->k ? GTK_POS_RIGHT : GTK_POS_LEFT);
}
else
{
rect.x = cell_width * ((real_clicked_popover_cell % 7) + 1.0 - self->k);
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), GTK_POS_RIGHT);
}
gtk_popover_set_pointing_to (GTK_POPOVER (self->overflow_popover), &rect);
/* sizing hack */
child_widget = gtk_bin_get_child (GTK_BIN (self->overflow_popover));
gtk_widget_set_size_request (child_widget, 200, -1);
g_object_set_data (G_OBJECT (self->overflow_popover), "selected-day", GINT_TO_POINTER (day));
}
static gboolean
show_popover_for_position (GcalMonthView *self,
@@ -397,47 +479,6 @@ gather_button_event_data (GcalMonthView *self,
return cell;
}
static gdouble
get_start_grid_y (GtkWidget *widget)
{
GtkStyleContext* context;
GtkStateFlags state_flags;
gint padding_top;
PangoLayout *layout;
PangoFontDescription *font_desc;
gint font_height;
gdouble start_grid_y;
context = gtk_widget_get_style_context (widget);
state_flags = gtk_style_context_get_state (context);
layout = gtk_widget_create_pango_layout (widget, NULL);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "start-header");
gtk_style_context_get (context, state_flags, "padding-top", &padding_top, "font", &font_desc, NULL);
pango_layout_set_font_description (layout, font_desc);
pango_layout_get_pixel_size (layout, NULL, &font_height);
pango_font_description_free (font_desc);
gtk_style_context_restore (context);
start_grid_y = 2 * padding_top + font_height;
gtk_style_context_get (context, state_flags, "font", &font_desc, "padding-top", &padding_top, NULL);
pango_layout_set_font_description (layout, font_desc);
pango_layout_get_pixel_size (layout, NULL, &font_height);
start_grid_y += padding_top + font_height;
pango_font_description_free (font_desc);
g_object_unref (layout);
return start_grid_y;
}
static gboolean
get_widget_parts (gint first_cell,
gint last_cell,
@@ -485,132 +526,6 @@ get_widget_parts (gint first_cell,
return TRUE;
}
static void
rebuild_popover_for_day (GcalMonthView *self,
gint day)
{
GcalSubscriberViewPrivate *ppriv;
GList *l;
GtkWidget *child_widget;
GdkRectangle rect;
gchar *label_title;
/* placement helpers */
gdouble start_grid_y, cell_width, cell_height;
gint shown_rows;
gint real_clicked_popover_cell;
GtkStyleContext *context;
GtkStateFlags state;
PangoLayout *overflow_layout;
PangoFontDescription *ofont_desc;
gint font_height, padding_bottom;
ppriv = GCAL_SUBSCRIBER_VIEW (self)->priv;
label_title = g_strdup_printf ("%s %d", gcal_get_month_name (self->date->month - 1), day);
gtk_label_set_text (GTK_LABEL (self->popover_title), label_title);
g_free (label_title);
/* Clean all the widgets */
gtk_container_foreach (GTK_CONTAINER (self->events_list_box), (GtkCallback) gtk_widget_destroy, NULL);
l = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (self->pressed_overflow_indicator));
/* Setup the start & end dates of the events as the begin & end of day */
if (l)
{
for (; l != NULL; l = g_list_next (l))
{
GtkWidget *cloned_event;
GDateTime *current_date;
GDateTime *dt_start;
GDateTime *dt_end;
GcalEvent *event;
GTimeZone *tz;
event = gcal_event_widget_get_event (l->data);
if (gcal_event_get_all_day (event))
tz = g_time_zone_new_utc ();
else
tz = g_time_zone_new_local ();
current_date = icaltime_to_datetime (self->date);
dt_start = g_date_time_new (tz,
g_date_time_get_year (current_date),
g_date_time_get_month (current_date),
day,
0, 0, 0);
dt_end = g_date_time_add_days (dt_start, 1);
cloned_event = gcal_event_widget_clone (l->data);
gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (cloned_event), dt_start);
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (cloned_event), dt_end);
gtk_container_add (GTK_CONTAINER (self->events_list_box), cloned_event);
_gcal_subscriber_view_setup_child (GCAL_SUBSCRIBER_VIEW (self), cloned_event);
g_clear_pointer (&current_date, g_date_time_unref);
g_clear_pointer (&dt_start, g_date_time_unref);
g_clear_pointer (&dt_end, g_date_time_unref);
g_clear_pointer (&tz, g_time_zone_unref);
}
}
/* placement calculation */
start_grid_y = get_start_grid_y (GTK_WIDGET (self));
shown_rows = ceil ((self->days_delay + icaltime_days_in_month (self->date->month, self->date->year)) / 7.0);
cell_width = gtk_widget_get_allocated_width (GTK_WIDGET (self)) / 7.0;
cell_height = (gtk_widget_get_allocated_height (GTK_WIDGET (self)) - start_grid_y) / 6.0;
context = gtk_widget_get_style_context (GTK_WIDGET (self));
state = gtk_style_context_get_state (context);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "overflow");
gtk_style_context_get (context, state, "font", &ofont_desc, "padding-bottom", &padding_bottom, NULL);
overflow_layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), NULL);
pango_layout_set_font_description (overflow_layout, ofont_desc);
pango_layout_get_pixel_size (overflow_layout, NULL, &font_height);
gtk_style_context_restore (context);
pango_font_description_free (ofont_desc);
g_object_unref (overflow_layout);
real_clicked_popover_cell = real_cell (self->pressed_overflow_indicator, self->k);
rect.y = cell_height * ((real_clicked_popover_cell / 7) + 1.0 + (6 - shown_rows) * 0.5) + start_grid_y - padding_bottom - font_height / 2;
rect.width = 1;
rect.height = 1;
if (real_clicked_popover_cell % 7 < 3)
{
rect.x = cell_width * ((real_clicked_popover_cell % 7) + 1.0);
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), self->k ? GTK_POS_LEFT : GTK_POS_RIGHT);
}
else if (real_clicked_popover_cell % 7 > 3)
{
rect.x = cell_width * ((real_clicked_popover_cell % 7));
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), self->k ? GTK_POS_RIGHT : GTK_POS_LEFT);
}
else
{
rect.x = cell_width * ((real_clicked_popover_cell % 7) + 1.0 - self->k);
gtk_popover_set_position (GTK_POPOVER (self->overflow_popover), GTK_POS_RIGHT);
}
gtk_popover_set_pointing_to (GTK_POPOVER (self->overflow_popover), &rect);
/* sizing hack */
child_widget = gtk_bin_get_child (GTK_BIN (self->overflow_popover));
gtk_widget_set_size_request (child_widget, 200, -1);
g_object_set_data (G_OBJECT (self->overflow_popover), "selected-day", GINT_TO_POINTER (day));
}
static void
overflow_popover_hide (GtkWidget *widget,
gpointer user_data)
@@ -1000,104 +915,76 @@ add_new_event_button_cb (GtkWidget *button,
g_date_time_unref (start_date);
}
static void
gcal_month_view_class_init (GcalMonthViewClass *klass)
/* GcalView Interface API */
static icaltimetype*
gcal_month_view_get_initial_date (GcalView *view)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
GcalSubscriberViewClass *subscriber_view_class;
//FIXME to retrieve the 35 days range
GcalMonthView *self;
icaltimetype *new_date;
object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gcal_month_view_set_property;
object_class->get_property = gcal_month_view_get_property;
object_class->finalize = gcal_month_view_finalize;
g_return_val_if_fail (GCAL_IS_MONTH_VIEW (view), NULL);
widget_class = GTK_WIDGET_CLASS (klass);
widget_class->realize = gcal_month_view_realize;
widget_class->unrealize = gcal_month_view_unrealize;
widget_class->map = gcal_month_view_map;
widget_class->unmap = gcal_month_view_unmap;
widget_class->size_allocate = gcal_month_view_size_allocate;
widget_class->draw = gcal_month_view_draw;
widget_class->button_press_event = gcal_month_view_button_press;
widget_class->motion_notify_event = gcal_month_view_motion_notify_event;
widget_class->button_release_event = gcal_month_view_button_release;
widget_class->direction_changed = gcal_month_view_direction_changed;
widget_class->key_press_event = gcal_month_view_key_press;
widget_class->drag_motion = gcal_month_view_drag_motion;
widget_class->drag_drop = gcal_month_view_drag_drop;
widget_class->drag_leave = gcal_month_view_drag_leave;
widget_class->scroll_event = gcal_month_view_scroll_event;
self = GCAL_MONTH_VIEW (view);
subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass);
subscriber_view_class->get_child_cell = gcal_month_view_get_child_cell;
subscriber_view_class->clear_state = gcal_month_view_clear_state;
new_date = gcal_dup_icaltime (self->date);
new_date->day = 1;
new_date->is_date = 0;
new_date->hour = 0;
new_date->minute = 0;
new_date->second = 0;
g_object_class_override_property (object_class, PROP_DATE, "active-date");
return new_date;
}
gtk_widget_class_set_css_name (widget_class, "calendar-view");
/**
* gcal_month_view_get_final_date:
*
* Since: 0.1
* Return value: the last day of the month
* Returns: (transfer full): Release with g_free()
**/
static icaltimetype*
gcal_month_view_get_final_date (GcalView *view)
{
//FIXME to retrieve the 35 days range
GcalMonthView *self;
icaltimetype *new_date;
g_return_val_if_fail (GCAL_IS_MONTH_VIEW (view), NULL);
self = GCAL_MONTH_VIEW (view);
new_date = gcal_dup_icaltime (self->date);
new_date->day = icaltime_days_in_month (self->date->month, self->date->year);
new_date->is_date = 0;
new_date->hour = 23;
new_date->minute = 59;
new_date->second = 59;
return new_date;
}
static void
gcal_month_view_init (GcalMonthView *self)
gcal_month_view_clear_marks (GcalView *view)
{
GtkWidget *grid;
GtkWidget *button;
cancel_selection (GCAL_MONTH_VIEW (view));
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
gtk_widget_queue_draw (GTK_WIDGET (view));
}
self = gcal_month_view_get_instance_private (self);
static GList*
gcal_month_view_get_children_by_uuid (GcalView *view,
const gchar *uuid)
{
GcalSubscriberViewPrivate *ppriv = GCAL_SUBSCRIBER_VIEW (view)->priv;
GList *l;
cancel_selection (self);
l = g_hash_table_lookup (ppriv->children, uuid);
if (l != NULL)
return g_list_reverse (g_list_copy (l));
self->pressed_overflow_indicator = -1;
self->hovered_overflow_indicator = -1;
self->k = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL;
self->overflow_popover = gtk_popover_new (GTK_WIDGET (self));
gtk_style_context_add_class (gtk_widget_get_style_context (self->overflow_popover), "events");
g_signal_connect_swapped (self->overflow_popover, "hide", G_CALLBACK (overflow_popover_hide), self);
g_signal_connect_swapped (self->overflow_popover,
"drag-motion",
G_CALLBACK (cancel_dnd_from_overflow_popover),
self->overflow_popover);
grid = gtk_grid_new ();
g_object_set (grid, "row-spacing", 6, "orientation", GTK_ORIENTATION_VERTICAL, NULL);
gtk_container_add (GTK_CONTAINER (self->overflow_popover), grid);
self->popover_title = gtk_label_new (NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (self->popover_title), "sidebar-header");
g_object_set (self->popover_title, "margin", 6, "halign", GTK_ALIGN_START, NULL);
self->events_list_box = gtk_list_box_new ();
gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->events_list_box), GTK_SELECTION_NONE);
gtk_list_box_set_header_func (GTK_LIST_BOX (self->events_list_box), update_list_box_headers, self, NULL);
button = gtk_button_new_with_label (_("Add Event…"));
g_object_set (button, "hexpand", TRUE, NULL);
g_signal_connect (button, "clicked", G_CALLBACK (add_new_event_button_cb), self);
gtk_container_add (GTK_CONTAINER (grid), self->popover_title);
gtk_container_add (GTK_CONTAINER (grid), self->events_list_box);
gtk_container_add (GTK_CONTAINER (grid), button);
/* Setup the month view as a drag n' drop destination */
gtk_drag_dest_set (GTK_WIDGET (self),
0,
NULL,
0,
GDK_ACTION_MOVE);
/*
* Also set the overflow popover as a drop destination, so we can hide
* it when the user starts dragging an event that is inside the overflow
* list.
*/
gtk_drag_dest_set (GTK_WIDGET (self->overflow_popover),
0,
NULL,
0,
GDK_ACTION_MOVE);
return NULL;
}
static void
@@ -2298,83 +2185,104 @@ gcal_month_view_clear_state (GcalSubscriberView *subscriber)
gtk_widget_hide (self->overflow_popover);
}
/* GcalView Interface API */
/**
* gcal_month_view_get_initial_date:
*
* Since: 0.1
* Return value: the first day of the month
* Returns: (transfer full): Release with g_free()
**/
static icaltimetype*
gcal_month_view_get_initial_date (GcalView *view)
static void
gcal_month_view_class_init (GcalMonthViewClass *klass)
{
//FIXME to retrieve the 35 days range
GcalMonthView *self;
icaltimetype *new_date;
GObjectClass *object_class;
GtkWidgetClass *widget_class;
GcalSubscriberViewClass *subscriber_view_class;
g_return_val_if_fail (GCAL_IS_MONTH_VIEW (view), NULL);
object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gcal_month_view_set_property;
object_class->get_property = gcal_month_view_get_property;
object_class->finalize = gcal_month_view_finalize;
self = GCAL_MONTH_VIEW (view);
widget_class = GTK_WIDGET_CLASS (klass);
widget_class->realize = gcal_month_view_realize;
widget_class->unrealize = gcal_month_view_unrealize;
widget_class->map = gcal_month_view_map;
widget_class->unmap = gcal_month_view_unmap;
widget_class->size_allocate = gcal_month_view_size_allocate;
widget_class->draw = gcal_month_view_draw;
widget_class->button_press_event = gcal_month_view_button_press;
widget_class->motion_notify_event = gcal_month_view_motion_notify_event;
widget_class->button_release_event = gcal_month_view_button_release;
widget_class->direction_changed = gcal_month_view_direction_changed;
widget_class->key_press_event = gcal_month_view_key_press;
widget_class->drag_motion = gcal_month_view_drag_motion;
widget_class->drag_drop = gcal_month_view_drag_drop;
widget_class->drag_leave = gcal_month_view_drag_leave;
widget_class->scroll_event = gcal_month_view_scroll_event;
new_date = gcal_dup_icaltime (self->date);
new_date->day = 1;
new_date->is_date = 0;
new_date->hour = 0;
new_date->minute = 0;
new_date->second = 0;
subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass);
subscriber_view_class->get_child_cell = gcal_month_view_get_child_cell;
subscriber_view_class->clear_state = gcal_month_view_clear_state;
return new_date;
}
g_object_class_override_property (object_class, PROP_DATE, "active-date");
/**
* gcal_month_view_get_final_date:
*
* Since: 0.1
* Return value: the last day of the month
* Returns: (transfer full): Release with g_free()
**/
static icaltimetype*
gcal_month_view_get_final_date (GcalView *view)
{
//FIXME to retrieve the 35 days range
GcalMonthView *self;
icaltimetype *new_date;
g_return_val_if_fail (GCAL_IS_MONTH_VIEW (view), NULL);
self = GCAL_MONTH_VIEW (view);
new_date = gcal_dup_icaltime (self->date);
new_date->day = icaltime_days_in_month (self->date->month, self->date->year);
new_date->is_date = 0;
new_date->hour = 23;
new_date->minute = 59;
new_date->second = 59;
return new_date;
gtk_widget_class_set_css_name (widget_class, "calendar-view");
}
static void
gcal_month_view_clear_marks (GcalView *view)
gcal_month_view_init (GcalMonthView *self)
{
cancel_selection (GCAL_MONTH_VIEW (view));
GtkWidget *grid;
GtkWidget *button;
gtk_widget_queue_draw (GTK_WIDGET (view));
}
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
static GList*
gcal_month_view_get_children_by_uuid (GcalView *view,
const gchar *uuid)
{
GcalSubscriberViewPrivate *ppriv = GCAL_SUBSCRIBER_VIEW (view)->priv;
GList *l;
self = gcal_month_view_get_instance_private (self);
l = g_hash_table_lookup (ppriv->children, uuid);
if (l != NULL)
return g_list_reverse (g_list_copy (l));
cancel_selection (self);
return NULL;
self->pressed_overflow_indicator = -1;
self->hovered_overflow_indicator = -1;
self->k = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL;
self->overflow_popover = gtk_popover_new (GTK_WIDGET (self));
gtk_style_context_add_class (gtk_widget_get_style_context (self->overflow_popover), "events");
g_signal_connect_swapped (self->overflow_popover, "hide", G_CALLBACK (overflow_popover_hide), self);
g_signal_connect_swapped (self->overflow_popover,
"drag-motion",
G_CALLBACK (cancel_dnd_from_overflow_popover),
self->overflow_popover);
grid = gtk_grid_new ();
g_object_set (grid, "row-spacing", 6, "orientation", GTK_ORIENTATION_VERTICAL, NULL);
gtk_container_add (GTK_CONTAINER (self->overflow_popover), grid);
self->popover_title = gtk_label_new (NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (self->popover_title), "sidebar-header");
g_object_set (self->popover_title, "margin", 6, "halign", GTK_ALIGN_START, NULL);
self->events_list_box = gtk_list_box_new ();
gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->events_list_box), GTK_SELECTION_NONE);
gtk_list_box_set_header_func (GTK_LIST_BOX (self->events_list_box), update_list_box_headers, self, NULL);
button = gtk_button_new_with_label (_("Add Event…"));
g_object_set (button, "hexpand", TRUE, NULL);
g_signal_connect (button, "clicked", G_CALLBACK (add_new_event_button_cb), self);
gtk_container_add (GTK_CONTAINER (grid), self->popover_title);
gtk_container_add (GTK_CONTAINER (grid), self->events_list_box);
gtk_container_add (GTK_CONTAINER (grid), button);
/* Setup the month view as a drag n' drop destination */
gtk_drag_dest_set (GTK_WIDGET (self),
0,
NULL,
0,
GDK_ACTION_MOVE);
/*
* Also set the overflow popover as a drop destination, so we can hide
* it when the user starts dragging an event that is inside the overflow
* list.
*/
gtk_drag_dest_set (GTK_WIDGET (self->overflow_popover),
0,
NULL,
0,
GDK_ACTION_MOVE);
}
/* Public API */
@@ -2382,6 +2290,8 @@ void
gcal_month_view_set_current_date (GcalMonthView *self,
icaltimetype *current_date)
{
g_return_if_fail (GCAL_IS_MONTH_VIEW (self));
self->current_date = current_date;
gtk_widget_queue_draw (GTK_WIDGET (self));
}
@@ -2398,9 +2308,12 @@ void
gcal_month_view_set_first_weekday (GcalMonthView *self,
gint day_nr)
{
g_return_if_fail (GCAL_IS_MONTH_VIEW (self));
self->first_weekday = day_nr;
/* update days_delay */
if (self->date != NULL)
if (self->date)
self->days_delay = (time_day_of_week (1, self->date->month - 1, self->date->year) - self->first_weekday + 7) % 7;
}
@@ -2422,5 +2335,7 @@ void
gcal_month_view_set_manager (GcalMonthView *self,
GcalManager *manager)
{
g_return_if_fail (GCAL_IS_MONTH_VIEW (self));
self->manager = manager;
}
+10 -8
View File
@@ -30,15 +30,17 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GcalMonthView, gcal_month_view, GCAL, MONTH_VIEW, GcalSubscriberView)
void gcal_month_view_set_current_date (GcalMonthView *month_view,
icaltimetype *current_date);
void gcal_month_view_set_first_weekday (GcalMonthView *view,
gint day_nr);
void gcal_month_view_set_use_24h_format (GcalMonthView *view,
gboolean use_24h);
void gcal_month_view_set_current_date (GcalMonthView *self,
icaltimetype *current_date);
void gcal_month_view_set_manager (GcalMonthView *view,
GcalManager *manager);
void gcal_month_view_set_first_weekday (GcalMonthView *self,
gint day_nr);
void gcal_month_view_set_use_24h_format (GcalMonthView *self,
gboolean use_24h);
void gcal_month_view_set_manager (GcalMonthView *self ,
GcalManager *manager);
G_END_DECLS
-22
View File
@@ -78,28 +78,6 @@ struct _GcalWeekHeader
GtkSizeGroup *sizegroup;
};
static void header_collapse (GcalWeekHeader *self);
static void header_expand (GcalWeekHeader *self);
static void on_expand_action_activated (GcalWeekHeader *self,
gpointer user_data);
static void gcal_week_header_finalize (GObject *object);
static void gcal_week_header_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *psec);
static void gcal_week_header_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gcal_week_header_size_allocate (GtkWidget *widget,
GtkAllocation *alloc);
typedef enum
{
UP,
+48 -82
View File
@@ -39,12 +39,6 @@ static const double dashed [] =
6.0
};
enum
{
PROP_0,
PROP_DATE
};
struct _GcalWeekView
{
GtkBox parent;
@@ -75,51 +69,23 @@ struct _GcalWeekView
gint clicked_cell;
};
static void gcal_week_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp);
static void gcal_week_view_component_modified (ECalDataModelSubscriber *subscriber,
ECalClient *client,
ECalComponent *comp);
static void gcal_week_view_component_removed (ECalDataModelSubscriber *subscriber,
ECalClient *client,
const gchar *uid,
const gchar *rid);
static void gcal_week_view_freeze (ECalDataModelSubscriber *subscriber);
static void gcal_week_view_thaw (ECalDataModelSubscriber *subscriber);
static gboolean gcal_week_view_draw_hours (GcalWeekView *self,
cairo_t *cr,
GtkWidget *widget);
static void gcal_view_interface_init (GcalViewInterface *iface);
static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface);
static void gcal_week_view_finalize (GObject *object);
static void gcal_week_view_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gcal_week_view_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static icaltimetype* gcal_week_view_get_final_date (GcalView *view);
enum
{
EVENT_ACTIVATED,
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_DATE,
NUM_PROPS
};
static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GTK_TYPE_BOX,
@@ -505,47 +471,6 @@ gcal_week_view_draw_hours (GcalWeekView *self,
return FALSE;
}
static void
gcal_week_view_class_init (GcalWeekViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->finalize = gcal_week_view_finalize;
object_class->set_property = gcal_week_view_set_property;
object_class->get_property = gcal_week_view_get_property;
g_object_class_override_property (object_class, PROP_DATE, "active-date");
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_VIEW,
G_SIGNAL_RUN_FIRST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
GCAL_TYPE_EVENT_WIDGET);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-view.ui");
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, header);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, hours_bar);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, scrolled_window);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, week_grid);
gtk_widget_class_bind_template_callback (widget_class, gcal_week_view_draw_hours);
gtk_widget_class_bind_template_callback (widget_class, on_event_activated);
gtk_widget_class_set_css_name (widget_class, "calendar-view");
}
static void
gcal_week_view_init (GcalWeekView *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
update_hours_sidebar_size (self);
}
static void
gcal_view_interface_init (GcalViewInterface *iface)
{
@@ -627,6 +552,47 @@ gcal_week_view_get_property (GObject *object,
}
}
static void
gcal_week_view_class_init (GcalWeekViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->finalize = gcal_week_view_finalize;
object_class->set_property = gcal_week_view_set_property;
object_class->get_property = gcal_week_view_get_property;
g_object_class_override_property (object_class, PROP_DATE, "active-date");
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_VIEW,
G_SIGNAL_RUN_FIRST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
GCAL_TYPE_EVENT_WIDGET);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-view.ui");
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, header);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, hours_bar);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, scrolled_window);
gtk_widget_class_bind_template_child (widget_class, GcalWeekView, week_grid);
gtk_widget_class_bind_template_callback (widget_class, gcal_week_view_draw_hours);
gtk_widget_class_bind_template_callback (widget_class, on_event_activated);
gtk_widget_class_set_css_name (widget_class, "calendar-view");
}
static void
gcal_week_view_init (GcalWeekView *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
update_hours_sidebar_size (self);
}
/* Public API */
/**
* gcal_week_view_new:
+13 -9
View File
@@ -29,15 +29,19 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GcalWeekView, gcal_week_view, GCAL, WEEK_VIEW, GtkBox)
GtkWidget* gcal_week_view_new (void);
void gcal_week_view_set_manager (GcalWeekView *view,
GcalManager *manager);
void gcal_week_view_set_first_weekday (GcalWeekView *view,
gint day_nr);
void gcal_week_view_set_use_24h_format (GcalWeekView *view,
gboolean use_24h);
void gcal_week_view_set_current_date (GcalWeekView *week_header,
icaltimetype *current_date);
GtkWidget* gcal_week_view_new (void);
void gcal_week_view_set_manager (GcalWeekView *self,
GcalManager *manager);
void gcal_week_view_set_first_weekday (GcalWeekView *self,
gint day_nr);
void gcal_week_view_set_use_24h_format (GcalWeekView *self,
gboolean use_24h);
void gcal_week_view_set_current_date (GcalWeekView *self,
icaltimetype *current_date);
G_END_DECLS
+20 -21
View File
@@ -127,7 +127,6 @@ enum
static guint signals[NUM_SIGNALS] = { 0, };
static void reset_sidebar (GcalYearView *year_view);
static void gcal_view_interface_init (GcalViewInterface *iface);
static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface);
@@ -163,26 +162,6 @@ get_last_week_of_year_dmy (gint first_weekday,
return g_date_get_iso8601_week_of_year (&day_of_year);
}
static void
update_date (GcalYearView *year_view,
icaltimetype *new_date)
{
gboolean needs_reset = FALSE;
if (year_view->date != NULL && icaltime_compare_date (year_view->date, new_date) && year_view->start_selected_date->day != 0)
needs_reset = TRUE;
g_clear_pointer (&year_view->date, g_free);
year_view->date = 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);;
year_view->last_week_of_year = get_last_week_of_year_dmy (year_view->first_weekday,
31, G_DATE_DECEMBER, year_view->date->year);
if (needs_reset)
reset_sidebar (year_view);
}
static void
event_activated (GcalEventWidget *widget,
gpointer user_data)
@@ -542,6 +521,26 @@ update_sidebar_headers (GtkListBoxRow *row,
g_clear_pointer (&row_date, g_date_time_unref);
}
static void
update_date (GcalYearView *year_view,
icaltimetype *new_date)
{
gboolean needs_reset = FALSE;
if (year_view->date != NULL && icaltime_compare_date (year_view->date, new_date) && year_view->start_selected_date->day != 0)
needs_reset = TRUE;
g_clear_pointer (&year_view->date, g_free);
year_view->date = 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);;
year_view->last_week_of_year = get_last_week_of_year_dmy (year_view->first_weekday,
31, G_DATE_DECEMBER, year_view->date->year);
if (needs_reset)
reset_sidebar (year_view);
}
static void
calculate_coord_for_date (GcalYearView *year_view,
gint day,