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
This commit is contained in:
Erick Pérez Castellanos
2012-05-24 00:40:27 -04:00
parent f8223e9687
commit f0158b4ada
3 changed files with 180 additions and 93 deletions
+103 -33
View File
@@ -22,10 +22,13 @@
#include <libical/icaltime.h>
#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;
}
+13 -1
View File
@@ -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__ */
+64 -59
View File
@@ -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);
}