[gnome-calendar] Changed drawing mechanic of GcalEventWidget.
- From: Erick PÃrez Castellanos <erickpc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] Changed drawing mechanic of GcalEventWidget.
- Date: Thu, 23 Aug 2012 13:45:21 +0000 (UTC)
commit e1a78d1975cb36957ac3bccfbb1a78282db853f4
Author: Erick PÃrez Castellanos <erick red gmail com>
Date: Wed Aug 22 20:33:20 2012 -0400
Changed drawing mechanic of GcalEventWidget.
Added symbolic icon for reminders event
Renamed signal to GcalEventWidget::activate
Renamed properties enums
Fixed size requisition
src/gcal-event-widget.c | 158 ++++++++++++++++++++++++++++++++---------------
src/gcal-event-widget.h | 7 ++-
2 files changed, 114 insertions(+), 51 deletions(-)
---
diff --git a/src/gcal-event-widget.c b/src/gcal-event-widget.c
index 210d6b0..f36c217 100644
--- a/src/gcal-event-widget.c
+++ b/src/gcal-event-widget.c
@@ -20,8 +20,6 @@
#include "gcal-event-widget.h"
#include "gcal-utils.h"
-#define RADIUS 3
-
struct _GcalEventWidgetPrivate
{
GdkWindow *event_window;
@@ -31,6 +29,7 @@ struct _GcalEventWidgetPrivate
GdkRGBA *color;
icaltimetype *dt_start;
gboolean all_day;
+ gboolean has_reminders;
};
enum
@@ -40,12 +39,13 @@ enum
PROP_SUMMARY,
PROP_COLOR,
PROP_DTSTART,
- PROP_ALLDAY
+ PROP_ALL_DAY,
+ PROP_HAS_REMINDERS
};
enum
{
- ACTIVATED,
+ ACTIVATE,
NUM_SIGNALS
};
@@ -149,7 +149,7 @@ gcal_event_widget_class_init(GcalEventWidgetClass *klass)
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
- PROP_ALLDAY,
+ PROP_ALL_DAY,
g_param_spec_boolean ("all-day",
"All day",
"Wheter the event is all-day or not",
@@ -157,11 +157,20 @@ gcal_event_widget_class_init(GcalEventWidgetClass *klass)
G_PARAM_CONSTRUCT |
G_PARAM_READWRITE));
- signals[ACTIVATED] = g_signal_new ("activated",
+ g_object_class_install_property (object_class,
+ PROP_HAS_REMINDERS,
+ g_param_spec_boolean ("has-reminders",
+ "Event has reminders",
+ "Wheter the event has reminders set or not",
+ FALSE,
+ G_PARAM_CONSTRUCT |
+ G_PARAM_READWRITE));
+
+ signals[ACTIVATE] = g_signal_new ("activate",
GCAL_TYPE_EVENT_WIDGET,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalEventWidgetClass,
- activated),
+ activate),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
@@ -190,6 +199,7 @@ gcal_event_widget_constructed (GObject *object)
GcalEventWidgetPrivate *priv;
priv = GCAL_EVENT_WIDGET (object)->priv;
+
if (G_OBJECT_CLASS (gcal_event_widget_parent_class)->constructed != NULL)
G_OBJECT_CLASS (gcal_event_widget_parent_class)->constructed (object);
@@ -225,6 +235,10 @@ gcal_event_widget_set_property (GObject *object,
gdk_rgba_free (priv->color);
priv->color = g_value_dup_boxed (value);
+ gtk_widget_override_background_color (
+ GTK_WIDGET (object),
+ gtk_widget_get_state_flags (GTK_WIDGET (object)),
+ priv->color);
return;
case PROP_DTSTART:
if (priv->dt_start != NULL)
@@ -232,9 +246,12 @@ gcal_event_widget_set_property (GObject *object,
priv->dt_start = g_value_dup_boxed (value);
return;
- case PROP_ALLDAY:
+ case PROP_ALL_DAY:
priv->all_day = g_value_get_boolean (value);
return;
+ case PROP_HAS_REMINDERS:
+ priv->has_reminders = g_value_get_boolean (value);
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -264,9 +281,12 @@ gcal_event_widget_get_property (GObject *object,
case PROP_DTSTART:
g_value_set_boxed (value, priv->dt_start);
return;
- case PROP_ALLDAY:
+ case PROP_ALL_DAY:
g_value_set_boolean (value, priv->all_day);
return;
+ case PROP_HAS_REMINDERS:
+ g_value_set_boolean (value, priv->has_reminders);
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -277,6 +297,7 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural)
{
+ GtkBorder margin;
GtkBorder padding;
PangoLayout *layout;
PangoRectangle logical_rect;
@@ -287,12 +308,15 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget,
pango_layout_get_extents (layout, NULL, &logical_rect);
pango_extents_to_pixels (&logical_rect, NULL);
+ gtk_style_context_get_margin (gtk_widget_get_style_context (widget),
+ gtk_widget_get_state_flags (widget),
+ &margin);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&padding);
*minimum = *natural =
- logical_rect.width + padding.left + padding.right + 2 * RADIUS;
+ logical_rect.width + padding.left + padding.right + margin.left + margin.right;
g_object_unref (layout);
}
@@ -302,6 +326,7 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural)
{
+ GtkBorder margin;
GtkBorder padding;
PangoLayout *layout;
PangoRectangle logical_rect;
@@ -312,12 +337,15 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
pango_layout_get_extents (layout, NULL, &logical_rect);
pango_extents_to_pixels (&logical_rect, NULL);
+ gtk_style_context_get_margin (gtk_widget_get_style_context (widget),
+ gtk_widget_get_state_flags (widget),
+ &margin);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&padding);
*minimum = *natural =
- logical_rect.height + padding.top + padding.bottom + 2 * RADIUS;
+ logical_rect.height + padding.top + padding.bottom + margin.top + margin.bottom;
g_object_unref (layout);
}
@@ -360,6 +388,7 @@ gcal_event_widget_realize (GtkWidget *widget)
&attributes,
attributes_mask);
gdk_window_set_user_data (priv->event_window, widget);
+ gdk_window_show (priv->event_window);
}
static void
@@ -384,10 +413,11 @@ gcal_event_widget_map (GtkWidget *widget)
GcalEventWidgetPrivate *priv;
priv = GCAL_EVENT_WIDGET (widget)->priv;
- if (priv->event_window != NULL)
- gdk_window_show (priv->event_window);
GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->map (widget);
+
+ if (priv->event_window != NULL)
+ gdk_window_show (priv->event_window);
}
static void
@@ -396,10 +426,11 @@ gcal_event_widget_unmap (GtkWidget *widget)
GcalEventWidgetPrivate *priv;
priv = GCAL_EVENT_WIDGET (widget)->priv;
- if (priv->event_window != NULL)
- gdk_window_hide (priv->event_window);
GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->unmap (widget);
+
+ if (priv->event_window != NULL)
+ gdk_window_hide (priv->event_window);
}
static void
@@ -428,11 +459,11 @@ gcal_event_widget_draw (GtkWidget *widget,
GcalEventWidgetPrivate *priv;
GtkStyleContext *context;
GtkStateFlags state;
+ GtkBorder margin;
GtkBorder padding;
gint x,y;
gint width, height;
- gdouble degrees;
PangoLayout *layout;
GdkRGBA fg_color;
@@ -442,62 +473,70 @@ gcal_event_widget_draw (GtkWidget *widget,
state = gtk_widget_get_state_flags (widget);
gtk_style_context_get_padding (context, state, &padding);
+ gtk_style_context_get_margin (context, state, &margin);
gtk_style_context_get_color (context, state, &fg_color);
- x = padding.left;
- y = padding.top;
+ x = margin.left;
+ y = margin.top;
width = gtk_widget_get_allocated_width (widget)
- - (padding.left + padding.right);
+ - (margin.left + margin.right);
height = gtk_widget_get_allocated_height (widget)
- - (padding.top + padding.bottom);
- degrees = G_PI / 180.0;
+ - (margin.top + margin.bottom);
+
+ gtk_render_background (context, cr, x, y, width, height);
+ gtk_render_frame (context, cr, x, y, width, height);
+
+ /* render icon */
+ if (priv->has_reminders)
+ {
+ GtkIconTheme *icon_theme;
+ GtkIconInfo *icon_info;
+ GdkPixbuf *pixbuf;
+ gboolean was_symbolic;
+
+ icon_theme = gtk_icon_theme_get_default ();
+ icon_info = gtk_icon_theme_lookup_icon (icon_theme,
+ "document-open-recent-symbolic",
+ height - (padding.top + padding.bottom),
+ 0);
+ pixbuf = gtk_icon_info_load_symbolic_for_context (icon_info,
+ context,
+ &was_symbolic,
+ NULL);
+
+ gdk_cairo_set_source_pixbuf (cr,
+ pixbuf,
+ x + padding.left,
+ y + padding.top);
+ g_object_unref (pixbuf);
+ cairo_paint (cr);
+
+ padding.left += height - (padding.top + padding.bottom) + padding.left;
+ }
layout = pango_cairo_create_layout (cr);
pango_layout_set_font_description (layout,
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 - (padding.left + padding.right) ) * PANGO_SCALE);
- cairo_save (cr);
-
- 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,
- 0.8);
- cairo_fill_preserve (cr);
- cairo_set_source_rgb (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));
- cairo_stroke (cr);
+ pango_layout_set_text (layout, priv->summary, -1);
+ pango_cairo_update_layout (cr, layout);
+ cairo_save (cr);
cairo_set_source_rgba (cr,
fg_color.red,
fg_color.green,
fg_color.blue,
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 + padding.left, y + padding.top);
pango_cairo_show_layout (cr, layout);
- cairo_stroke (cr);
cairo_restore (cr);
g_object_unref (layout);
- if (GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->draw != NULL)
- GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->draw (widget, cr);
-
return FALSE;
}
@@ -506,7 +545,7 @@ gcal_event_widget_button_press_event (GtkWidget *widget,
GdkEventButton *event)
{
if (event->type == GDK_2BUTTON_PRESS)
- g_signal_emit (widget, signals[ACTIVATED], 0);
+ g_signal_emit (widget, signals[ACTIVATE], 0);
return TRUE;
}
@@ -616,3 +655,22 @@ gcal_event_widget_get_all_day (GcalEventWidget *event)
g_object_get (event, "all-day", &all_day, NULL);
return all_day;
}
+
+void
+gcal_event_widget_set_has_reminders (GcalEventWidget *event,
+ gboolean has_reminders)
+{
+ g_return_if_fail (GCAL_IS_EVENT_WIDGET (event));
+
+ g_object_set (event, "has-reminders", has_reminders, NULL);
+}
+
+gboolean
+gcal_event_widget_get_has_reminders (GcalEventWidget *event)
+{
+ gboolean has_reminders;
+ g_return_val_if_fail (GCAL_IS_EVENT_WIDGET (event), FALSE);
+
+ g_object_get (event, "has-reminders", &has_reminders, NULL);
+ return has_reminders;
+}
diff --git a/src/gcal-event-widget.h b/src/gcal-event-widget.h
index 98757d8..a1b57b0 100644
--- a/src/gcal-event-widget.h
+++ b/src/gcal-event-widget.h
@@ -43,7 +43,7 @@ struct _GcalEventWidgetClass
GtkWidgetClass parent_class;
/* signals */
- void (*activated) (GcalEventWidget *event_widget);
+ void (*activate) (GcalEventWidget *event_widget);
};
struct _GcalEventWidget
@@ -82,6 +82,11 @@ void gcal_event_widget_set_all_day (GcalEventWidget *eve
gboolean gcal_event_widget_get_all_day (GcalEventWidget *event);
+void gcal_event_widget_set_has_reminders (GcalEventWidget *event,
+ gboolean has_reminders);
+
+gboolean gcal_event_widget_get_has_reminders (GcalEventWidget *event);
+
G_END_DECLS
#endif /* __GCAL_EVENT_WIDGET_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]