From f0158b4adaaab6356685268786b0d472b779e686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Thu, 24 May 2012 00:40:27 -0400 Subject: [PATCH] Fixed issue with the sources view actor getting in the middle of buttons events. Using the new API of GcalEventWidget Drawing changes in GcalEventWidget Some refactoring --- src/gcal-event-widget.c | 136 ++++++++++++++++++++++++++++++---------- src/gcal-event-widget.h | 14 ++++- src/gcal-window.c | 123 +++++++++++++++++++----------------- 3 files changed, 180 insertions(+), 93 deletions(-) diff --git a/src/gcal-event-widget.c b/src/gcal-event-widget.c index 45104ab1..dff9b9f1 100644 --- a/src/gcal-event-widget.c +++ b/src/gcal-event-widget.c @@ -22,10 +22,13 @@ #include +#define RADIUS 3 + struct _GcalEventWidgetPrivate { GdkWindow *event_window; + gchar *uuid; gchar *summary; GdkRGBA *color; icaltimetype *dt_start; @@ -34,6 +37,7 @@ struct _GcalEventWidgetPrivate enum { PROP_0, + PROP_UUID, PROP_SUMMARY, PROP_COLOR, PROP_DTSTART @@ -73,9 +77,6 @@ static void gcal_event_widget_size_allocate (GtkWidget *widget, static gboolean gcal_event_widget_draw (GtkWidget *widget, cairo_t *cr); -static gboolean gcal_event_widget_button_press (GtkWidget *widget, - GdkEventButton *event); - G_DEFINE_TYPE(GcalEventWidget, gcal_event_widget, GTK_TYPE_WIDGET) static void @@ -98,7 +99,15 @@ gcal_event_widget_class_init(GcalEventWidgetClass *klass) widget_class->unmap = gcal_event_widget_unmap; widget_class->size_allocate = gcal_event_widget_size_allocate; widget_class->draw = gcal_event_widget_draw; - widget_class->button_press_event = gcal_event_widget_button_press; + + g_object_class_install_property (object_class, + PROP_UUID, + g_param_spec_string ("uuid", + "Unique uid", + "The unique-unique id composed of source_uid:event_uid", + NULL, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_SUMMARY, @@ -164,6 +173,12 @@ gcal_event_widget_set_property (GObject *object, switch (property_id) { + case PROP_UUID: + if (priv->uuid != NULL) + g_free (priv->uuid); + + priv->uuid = g_value_dup_string (value); + return; case PROP_SUMMARY: if (priv->summary != NULL) g_free (priv->summary); @@ -199,6 +214,9 @@ gcal_event_widget_get_property (GObject *object, switch (property_id) { + case PROP_UUID: + g_value_set_string (value, priv->uuid); + return; case PROP_SUMMARY: g_value_set_string (value, priv->summary); return; @@ -232,7 +250,8 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget, gtk_widget_get_state_flags (widget), &padding); - *minimum = *natural = logical_rect.width + padding.left + padding.right; + *minimum = *natural = + logical_rect.width + padding.left + padding.right + 2 * RADIUS; g_object_unref (layout); } @@ -256,7 +275,8 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget, gtk_widget_get_state_flags (widget), &padding); - *minimum = *natural = logical_rect.height + padding.top + padding.bottom; + *minimum = *natural = + logical_rect.height + padding.top + padding.bottom + 2 * RADIUS; g_object_unref (layout); } @@ -351,11 +371,13 @@ gcal_event_widget_size_allocate (GtkWidget *widget, gtk_widget_set_allocation (widget, allocation); if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (priv->event_window, - allocation->x, - allocation->y, - allocation->width, - allocation->height); + { + gdk_window_move_resize (priv->event_window, + allocation->x, + allocation->y, + allocation->width, + allocation->height); + } } static gboolean @@ -369,7 +391,6 @@ gcal_event_widget_draw (GtkWidget *widget, gint x,y; gint width, height; - gdouble radius; gdouble degrees; PangoLayout *layout; @@ -385,10 +406,9 @@ gcal_event_widget_draw (GtkWidget *widget, x = padding.left; y = padding.top; width = gtk_widget_get_allocated_width (widget) - - padding.left - padding.right; + - (padding.left + padding.right); height = gtk_widget_get_allocated_height (widget) - - padding.top - padding.bottom; - radius = height / 10; + - (padding.top + padding.bottom); degrees = G_PI / 180.0; layout = pango_cairo_create_layout (cr); @@ -396,20 +416,29 @@ gcal_event_widget_draw (GtkWidget *widget, gtk_style_context_get_font (context, state)); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); - pango_layout_set_width (layout, (width - 2 * radius ) * PANGO_SCALE); + pango_layout_set_width (layout, (width - 2 * RADIUS ) * PANGO_SCALE); cairo_save (cr); - cairo_arc (cr, x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees); - cairo_arc (cr, x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees); - cairo_arc (cr, x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees); - cairo_arc (cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees); + cairo_new_sub_path (cr); + cairo_arc (cr, x + width - RADIUS, y + RADIUS, RADIUS, -90 * degrees, 0 * degrees); + cairo_arc (cr, x + width - RADIUS, y + height - RADIUS, RADIUS, 0 * degrees, 90 * degrees); + cairo_arc (cr, x + RADIUS, y + height - RADIUS, RADIUS, 90 * degrees, 180 * degrees); + cairo_arc (cr, x + RADIUS, y + RADIUS, RADIUS, 180 * degrees, 270 * degrees); + cairo_close_path (cr); + cairo_set_source_rgba (cr, priv->color->red, priv->color->green, priv->color->blue, - priv->color->alpha); - cairo_fill (cr); + 0.8); + cairo_fill_preserve (cr); + cairo_set_source_rgba (cr, + priv->color->red - ((1 - priv->color->red) / 2), + priv->color->green - ((1 - priv->color->green) / 2), + priv->color->blue - ((1 - priv->color->blue) / 2), + 1); + cairo_stroke (cr); cairo_set_source_rgba (cr, fg_color.red, @@ -418,7 +447,7 @@ gcal_event_widget_draw (GtkWidget *widget, fg_color.alpha); pango_layout_set_text (layout, priv->summary, -1); pango_cairo_update_layout (cr, layout); - cairo_move_to (cr, x + radius, y + radius); + cairo_move_to (cr, x + RADIUS, y + RADIUS); pango_cairo_show_layout (cr, layout); cairo_stroke (cr); @@ -432,18 +461,10 @@ gcal_event_widget_draw (GtkWidget *widget, return FALSE; } -static gboolean -gcal_event_widget_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - g_debug ("[ITW]: Called button press virtual function\n"); - return FALSE; -} - GtkWidget* -gcal_event_widget_new () +gcal_event_widget_new (gchar *uuid) { - return g_object_new (GCAL_TYPE_EVENT_WIDGET, NULL); + return g_object_new (GCAL_TYPE_EVENT_WIDGET, "uuid", uuid, NULL); } GtkWidget* @@ -458,6 +479,15 @@ gcal_event_widget_new_with_summary_and_color (const gchar *summary, NULL); } +const gchar* +gcal_event_widget_peek_uuid (GcalEventWidget *event) +{ + GcalEventWidgetPrivate *priv; + priv = event->priv; + + return priv->uuid; +} + void gcal_event_widget_set_date (GcalEventWidget *event, icaltimetype *date) @@ -477,3 +507,43 @@ gcal_event_widget_get_date (GcalEventWidget *event) g_object_get (event, "date-start", &dt, NULL); return dt; } + +void +gcal_event_widget_set_summary (GcalEventWidget *event, + gchar *summary) +{ + g_return_if_fail (GCAL_IS_EVENT_WIDGET (event)); + + g_object_set (event, "summary", summary, NULL); +} + +gchar* +gcal_event_widget_get_summary (GcalEventWidget *event) +{ + gchar *summary; + g_return_val_if_fail (GCAL_IS_EVENT_WIDGET (event), NULL); + + summary = NULL; + g_object_get (event, "summary", summary, NULL); + return summary; +} + +void +gcal_event_widget_set_color (GcalEventWidget *event, + GdkRGBA *color) +{ + g_return_if_fail (GCAL_IS_EVENT_WIDGET (event)); + + g_object_set (event, "color", color, NULL); +} + +GdkRGBA* +gcal_event_widget_get_color (GcalEventWidget *event) +{ + GdkRGBA *color; + g_return_val_if_fail (GCAL_IS_EVENT_WIDGET (event), NULL); + + color = NULL; + g_object_get (event, "color", color, NULL); + return color; +} diff --git a/src/gcal-event-widget.h b/src/gcal-event-widget.h index 64b43b3a..830f0e10 100644 --- a/src/gcal-event-widget.h +++ b/src/gcal-event-widget.h @@ -53,16 +53,28 @@ struct _GcalEventWidgetClass GType gcal_event_widget_get_type (void); -GtkWidget* gcal_event_widget_new (void); +GtkWidget* gcal_event_widget_new (gchar *uuid); GtkWidget* gcal_event_widget_new_with_summary_and_color (const gchar *summary, const GdkRGBA *color); +const gchar* gcal_event_widget_peek_uuid (GcalEventWidget *event); + void gcal_event_widget_set_date (GcalEventWidget *event, icaltimetype *date); icaltimetype* gcal_event_widget_get_date (GcalEventWidget *event); +void gcal_event_widget_set_summary (GcalEventWidget *event, + gchar *summary); + +gchar* gcal_event_widget_get_summary (GcalEventWidget *event); + +void gcal_event_widget_set_color (GcalEventWidget *event, + GdkRGBA *color); + +GdkRGBA* gcal_event_widget_get_color (GcalEventWidget *event); + G_END_DECLS #endif /* __GCAL_EVENT_WIDGET_H__ */ diff --git a/src/gcal-window.c b/src/gcal-window.c index aab3254e..07a655fb 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -36,42 +36,43 @@ struct _GcalWindowPrivate { ClutterActor *main_toolbar; + ClutterActor *contents_actor; ClutterActor *notebook_actor; ClutterActor *sources_actor; GtkWidget *notebook; GtkWidget *sources_view; GtkWidget *views [5]; + GtkWidget *add_view; GcalViewTypeEnum active_view; }; -static void gcal_window_constructed (GObject *object); +static void gcal_window_constructed (GObject *object); -GcalManager* _gcal_window_get_manager (GcalWindow *window); +GcalManager* _gcal_window_get_manager (GcalWindow *window); -static void _gcal_window_set_sources_view (GcalWindow *window); +static void _gcal_window_set_sources_view (GcalWindow *window); -static void _gcal_window_view_changed (GcalMainToolbar *main_toolbar, - GcalViewTypeEnum view_type, - gpointer user_data); +static void _gcal_window_view_changed (GcalMainToolbar *main_toolbar, + GcalViewTypeEnum view_type, + gpointer user_data); -static void _gcal_window_sources_shown (GcalMainToolbar *main_toolbar, - gboolean visible, - gpointer user_data); +static void _gcal_window_sources_shown (GcalMainToolbar *main_toolbar, + gboolean visible, + gpointer user_data); -static void _gcal_window_sources_row_activated (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data); +static void _gcal_window_add_event (GcalMainToolbar *main_toolbar, + gpointer user_data); -static void _gcal_window_view_clicked (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); +static void _gcal_window_sources_row_activated (GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + gpointer user_data); -static void _gcal_window_events_added (GcalManager *manager, - gpointer events_list, - gpointer user_data); +static void _gcal_window_events_added (GcalManager *manager, + gpointer events_list, + gpointer user_data); G_DEFINE_TYPE(GcalWindow, gcal_window, GTK_TYPE_APPLICATION_WINDOW) @@ -100,7 +101,6 @@ gcal_window_constructed (GObject *object) ClutterLayoutManager *base_layout_manager; ClutterActor *body_actor; ClutterLayoutManager *body_layout_manager; - ClutterActor *contents_actor; ClutterLayoutManager *contents_layout_manager; GtkWidget *holder; @@ -153,12 +153,14 @@ gcal_window_constructed (GObject *object) CLUTTER_BOX_ALIGNMENT_START); /* contents */ - contents_layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER, - CLUTTER_BIN_ALIGNMENT_CENTER); - contents_actor = clutter_actor_new (); - clutter_actor_set_layout_manager (contents_actor, contents_layout_manager); + contents_layout_manager = + clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER, + CLUTTER_BIN_ALIGNMENT_CENTER); + priv->contents_actor = clutter_actor_new (); + clutter_actor_set_layout_manager (priv->contents_actor, + contents_layout_manager); clutter_box_layout_pack (CLUTTER_BOX_LAYOUT (body_layout_manager), - contents_actor, + priv->contents_actor, TRUE, TRUE, TRUE, @@ -179,8 +181,9 @@ gcal_window_constructed (GObject *object) CLUTTER_BIN_ALIGNMENT_FILL); icaltimetype *date = g_new (icaltimetype, 1); - *date = icaltime_today (); + *date = icaltime_from_timet (time (NULL), 0); priv->views[GCAL_VIEW_TYPE_MONTHLY] = gcal_month_view_new (date); + g_free (date); context = gtk_widget_get_style_context (priv->views[GCAL_VIEW_TYPE_MONTHLY]); gtk_style_context_add_class (context, "views"); @@ -206,6 +209,7 @@ gcal_window_constructed (GObject *object) priv->sources_actor, CLUTTER_BIN_ALIGNMENT_START, CLUTTER_BIN_ALIGNMENT_START); + clutter_actor_hide (priv->sources_actor); /* signals connection/handling */ g_signal_connect (priv->main_toolbar, @@ -216,9 +220,9 @@ gcal_window_constructed (GObject *object) "sources-shown", G_CALLBACK (_gcal_window_sources_shown), object); - g_signal_connect (priv->views[GCAL_VIEW_TYPE_MONTHLY], - "button-press-event", - G_CALLBACK (_gcal_window_view_clicked), + g_signal_connect (priv->main_toolbar, + "add-event", + G_CALLBACK (_gcal_window_add_event), object); gtk_widget_show (embed); @@ -307,26 +311,11 @@ _gcal_window_view_changed (GcalMainToolbar *main_toolbar, gpointer user_data) { GcalWindowPrivate *priv; - GcalManager *manager; priv = GCAL_WINDOW (user_data)->priv; priv->active_view = view_type; - /* FIXME: demo code */ - icaltimetype *first_day; - icaltimetype *last_day; - first_day = g_new0 (icaltimetype, 1); - last_day = g_new0 (icaltimetype, 1); - *first_day = icaltime_from_timet (time (NULL), 0); - first_day->day = 1; - *last_day = *first_day; - last_day->day = 28; - - manager = _gcal_window_get_manager (GCAL_WINDOW (user_data)); - gcal_manager_set_new_range (manager, first_day, last_day); g_debug ("GcalViewTypeEnum in GcalWindow %d", priv->active_view); - g_free (first_day); - g_free (last_day); } static void @@ -339,6 +328,7 @@ _gcal_window_sources_shown (GcalMainToolbar *main_toolbar, if (visible) { + clutter_actor_show (priv->sources_actor); clutter_actor_animate (priv->sources_actor, CLUTTER_LINEAR, 150, "opacity", 255, @@ -349,10 +339,18 @@ _gcal_window_sources_shown (GcalMainToolbar *main_toolbar, clutter_actor_animate (priv->sources_actor, CLUTTER_LINEAR, 150, "opacity", 0, + "signal-swapped::completed", clutter_actor_hide, priv->sources_actor, NULL); } } +static void +_gcal_window_add_event (GcalMainToolbar *main_toolbar, + gpointer user_data) +{ + g_debug ("Catched signal add-event"); +} + static void _gcal_window_sources_row_activated (GtkTreeView *tree_view, GtkTreePath *path, @@ -383,14 +381,6 @@ _gcal_window_sources_row_activated (GtkTreeView *tree_view, -1); } -static void -_gcal_window_view_clicked (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data) -{ - g_debug ("View Clicked"); -} - static void _gcal_window_events_added (GcalManager *manager, gpointer events_list, @@ -412,13 +402,14 @@ _gcal_window_events_added (GcalManager *manager, for (l = events_list; l != NULL; l = l->next) { + g_debug ("Adding events in GcalWindow %d", priv->active_view); + tokens = g_strsplit ((gchar*) l->data, ":", -1); source_uid = tokens[0]; event_uid = tokens[1]; starting_date = gcal_manager_get_event_start_date (manager, source_uid, event_uid); - g_debug ("GcalViewTypeEnum in GcalWindow %d", priv->active_view); /* FIXME: here priv->views[priv->active_view] instead of hardcoding * GCAL_VIEW_TYPE_MONTHLY */ if (gcal_view_is_in_range ( @@ -431,17 +422,17 @@ _gcal_window_events_added (GcalManager *manager, color = gcal_manager_get_event_color (manager, source_uid, event_uid); - event = - gcal_event_widget_new_with_summary_and_color (summary, color); + event = gcal_event_widget_new ((gchar*) l->data); + gcal_event_widget_set_summary (GCAL_EVENT_WIDGET (event), summary); + gcal_event_widget_set_color (GCAL_EVENT_WIDGET (event), color); gcal_event_widget_set_date (GCAL_EVENT_WIDGET (event), starting_date); - gcal_view_add_event ( - GCAL_VIEW (priv->views[GCAL_VIEW_TYPE_MONTHLY]), + gtk_widget_show (event); + gtk_container_add ( + GTK_CONTAINER (priv->views[GCAL_VIEW_TYPE_MONTHLY]), event); gtk_style_context_add_class (gtk_widget_get_style_context (event), "event"); - gtk_widget_show (event); - g_debug ("Returned true call on interface function"); g_free (summary); gdk_rgba_free (color); } @@ -474,5 +465,19 @@ gcal_window_new (GcalApplication *app) G_CALLBACK (_gcal_window_events_added), win); + /* FIXME: demo code */ + GcalWindowPrivate *priv; + icaltimetype *first_day; + icaltimetype *last_day; + priv = win->priv; + first_day = gcal_month_view_get_initial_date ( + GCAL_MONTH_VIEW (priv->views[GCAL_VIEW_TYPE_MONTHLY])); + last_day = gcal_month_view_get_final_date ( + GCAL_MONTH_VIEW (priv->views[GCAL_VIEW_TYPE_MONTHLY])); + + gcal_manager_set_new_range (manager, first_day, last_day); + g_free (first_day); + g_free (last_day); + return GTK_WIDGET (win); }