views: cleanup code
This commit is contained in:
+131
-164
@@ -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
@@ -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 (¤t_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 (¤t_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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user