Changed drawing mechanic of GcalEventWidget.
Added symbolic icon for reminders event Renamed signal to GcalEventWidget::activate Renamed properties enums Fixed size requisition
This commit is contained in:
+108
-50
@@ -20,8 +20,6 @@
|
|||||||
#include "gcal-event-widget.h"
|
#include "gcal-event-widget.h"
|
||||||
#include "gcal-utils.h"
|
#include "gcal-utils.h"
|
||||||
|
|
||||||
#define RADIUS 3
|
|
||||||
|
|
||||||
struct _GcalEventWidgetPrivate
|
struct _GcalEventWidgetPrivate
|
||||||
{
|
{
|
||||||
GdkWindow *event_window;
|
GdkWindow *event_window;
|
||||||
@@ -31,6 +29,7 @@ struct _GcalEventWidgetPrivate
|
|||||||
GdkRGBA *color;
|
GdkRGBA *color;
|
||||||
icaltimetype *dt_start;
|
icaltimetype *dt_start;
|
||||||
gboolean all_day;
|
gboolean all_day;
|
||||||
|
gboolean has_reminders;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -40,12 +39,13 @@ enum
|
|||||||
PROP_SUMMARY,
|
PROP_SUMMARY,
|
||||||
PROP_COLOR,
|
PROP_COLOR,
|
||||||
PROP_DTSTART,
|
PROP_DTSTART,
|
||||||
PROP_ALLDAY
|
PROP_ALL_DAY,
|
||||||
|
PROP_HAS_REMINDERS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ACTIVATED,
|
ACTIVATE,
|
||||||
NUM_SIGNALS
|
NUM_SIGNALS
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ gcal_event_widget_class_init(GcalEventWidgetClass *klass)
|
|||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_ALLDAY,
|
PROP_ALL_DAY,
|
||||||
g_param_spec_boolean ("all-day",
|
g_param_spec_boolean ("all-day",
|
||||||
"All day",
|
"All day",
|
||||||
"Wheter the event is all-day or not",
|
"Wheter the event is all-day or not",
|
||||||
@@ -157,11 +157,20 @@ gcal_event_widget_class_init(GcalEventWidgetClass *klass)
|
|||||||
G_PARAM_CONSTRUCT |
|
G_PARAM_CONSTRUCT |
|
||||||
G_PARAM_READWRITE));
|
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,
|
GCAL_TYPE_EVENT_WIDGET,
|
||||||
G_SIGNAL_RUN_LAST,
|
G_SIGNAL_RUN_LAST,
|
||||||
G_STRUCT_OFFSET (GcalEventWidgetClass,
|
G_STRUCT_OFFSET (GcalEventWidgetClass,
|
||||||
activated),
|
activate),
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
g_cclosure_marshal_VOID__VOID,
|
g_cclosure_marshal_VOID__VOID,
|
||||||
G_TYPE_NONE,
|
G_TYPE_NONE,
|
||||||
@@ -190,6 +199,7 @@ gcal_event_widget_constructed (GObject *object)
|
|||||||
GcalEventWidgetPrivate *priv;
|
GcalEventWidgetPrivate *priv;
|
||||||
|
|
||||||
priv = GCAL_EVENT_WIDGET (object)->priv;
|
priv = GCAL_EVENT_WIDGET (object)->priv;
|
||||||
|
|
||||||
if (G_OBJECT_CLASS (gcal_event_widget_parent_class)->constructed != NULL)
|
if (G_OBJECT_CLASS (gcal_event_widget_parent_class)->constructed != NULL)
|
||||||
G_OBJECT_CLASS (gcal_event_widget_parent_class)->constructed (object);
|
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);
|
gdk_rgba_free (priv->color);
|
||||||
|
|
||||||
priv->color = g_value_dup_boxed (value);
|
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;
|
return;
|
||||||
case PROP_DTSTART:
|
case PROP_DTSTART:
|
||||||
if (priv->dt_start != NULL)
|
if (priv->dt_start != NULL)
|
||||||
@@ -232,9 +246,12 @@ gcal_event_widget_set_property (GObject *object,
|
|||||||
|
|
||||||
priv->dt_start = g_value_dup_boxed (value);
|
priv->dt_start = g_value_dup_boxed (value);
|
||||||
return;
|
return;
|
||||||
case PROP_ALLDAY:
|
case PROP_ALL_DAY:
|
||||||
priv->all_day = g_value_get_boolean (value);
|
priv->all_day = g_value_get_boolean (value);
|
||||||
return;
|
return;
|
||||||
|
case PROP_HAS_REMINDERS:
|
||||||
|
priv->has_reminders = g_value_get_boolean (value);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
@@ -264,9 +281,12 @@ gcal_event_widget_get_property (GObject *object,
|
|||||||
case PROP_DTSTART:
|
case PROP_DTSTART:
|
||||||
g_value_set_boxed (value, priv->dt_start);
|
g_value_set_boxed (value, priv->dt_start);
|
||||||
return;
|
return;
|
||||||
case PROP_ALLDAY:
|
case PROP_ALL_DAY:
|
||||||
g_value_set_boolean (value, priv->all_day);
|
g_value_set_boolean (value, priv->all_day);
|
||||||
return;
|
return;
|
||||||
|
case PROP_HAS_REMINDERS:
|
||||||
|
g_value_set_boolean (value, priv->has_reminders);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
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 *minimum,
|
||||||
gint *natural)
|
gint *natural)
|
||||||
{
|
{
|
||||||
|
GtkBorder margin;
|
||||||
GtkBorder padding;
|
GtkBorder padding;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle logical_rect;
|
PangoRectangle logical_rect;
|
||||||
@@ -287,12 +308,15 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget,
|
|||||||
pango_layout_get_extents (layout, NULL, &logical_rect);
|
pango_layout_get_extents (layout, NULL, &logical_rect);
|
||||||
pango_extents_to_pixels (&logical_rect, NULL);
|
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_style_context_get_padding (gtk_widget_get_style_context (widget),
|
||||||
gtk_widget_get_state_flags (widget),
|
gtk_widget_get_state_flags (widget),
|
||||||
&padding);
|
&padding);
|
||||||
|
|
||||||
*minimum = *natural =
|
*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);
|
g_object_unref (layout);
|
||||||
}
|
}
|
||||||
@@ -302,6 +326,7 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
|
|||||||
gint *minimum,
|
gint *minimum,
|
||||||
gint *natural)
|
gint *natural)
|
||||||
{
|
{
|
||||||
|
GtkBorder margin;
|
||||||
GtkBorder padding;
|
GtkBorder padding;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle logical_rect;
|
PangoRectangle logical_rect;
|
||||||
@@ -312,12 +337,15 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
|
|||||||
pango_layout_get_extents (layout, NULL, &logical_rect);
|
pango_layout_get_extents (layout, NULL, &logical_rect);
|
||||||
pango_extents_to_pixels (&logical_rect, NULL);
|
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_style_context_get_padding (gtk_widget_get_style_context (widget),
|
||||||
gtk_widget_get_state_flags (widget),
|
gtk_widget_get_state_flags (widget),
|
||||||
&padding);
|
&padding);
|
||||||
|
|
||||||
*minimum = *natural =
|
*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);
|
g_object_unref (layout);
|
||||||
}
|
}
|
||||||
@@ -360,6 +388,7 @@ gcal_event_widget_realize (GtkWidget *widget)
|
|||||||
&attributes,
|
&attributes,
|
||||||
attributes_mask);
|
attributes_mask);
|
||||||
gdk_window_set_user_data (priv->event_window, widget);
|
gdk_window_set_user_data (priv->event_window, widget);
|
||||||
|
gdk_window_show (priv->event_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -384,10 +413,11 @@ gcal_event_widget_map (GtkWidget *widget)
|
|||||||
GcalEventWidgetPrivate *priv;
|
GcalEventWidgetPrivate *priv;
|
||||||
|
|
||||||
priv = GCAL_EVENT_WIDGET (widget)->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);
|
GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->map (widget);
|
||||||
|
|
||||||
|
if (priv->event_window != NULL)
|
||||||
|
gdk_window_show (priv->event_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -396,10 +426,11 @@ gcal_event_widget_unmap (GtkWidget *widget)
|
|||||||
GcalEventWidgetPrivate *priv;
|
GcalEventWidgetPrivate *priv;
|
||||||
|
|
||||||
priv = GCAL_EVENT_WIDGET (widget)->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);
|
GTK_WIDGET_CLASS (gcal_event_widget_parent_class)->unmap (widget);
|
||||||
|
|
||||||
|
if (priv->event_window != NULL)
|
||||||
|
gdk_window_hide (priv->event_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -428,11 +459,11 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
GcalEventWidgetPrivate *priv;
|
GcalEventWidgetPrivate *priv;
|
||||||
GtkStyleContext *context;
|
GtkStyleContext *context;
|
||||||
GtkStateFlags state;
|
GtkStateFlags state;
|
||||||
|
GtkBorder margin;
|
||||||
GtkBorder padding;
|
GtkBorder padding;
|
||||||
|
|
||||||
gint x,y;
|
gint x,y;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
gdouble degrees;
|
|
||||||
|
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
GdkRGBA fg_color;
|
GdkRGBA fg_color;
|
||||||
@@ -442,62 +473,70 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
state = gtk_widget_get_state_flags (widget);
|
state = gtk_widget_get_state_flags (widget);
|
||||||
|
|
||||||
gtk_style_context_get_padding (context, state, &padding);
|
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);
|
gtk_style_context_get_color (context, state, &fg_color);
|
||||||
|
|
||||||
x = padding.left;
|
x = margin.left;
|
||||||
y = padding.top;
|
y = margin.top;
|
||||||
width = gtk_widget_get_allocated_width (widget)
|
width = gtk_widget_get_allocated_width (widget)
|
||||||
- (padding.left + padding.right);
|
- (margin.left + margin.right);
|
||||||
height = gtk_widget_get_allocated_height (widget)
|
height = gtk_widget_get_allocated_height (widget)
|
||||||
- (padding.top + padding.bottom);
|
- (margin.top + margin.bottom);
|
||||||
degrees = G_PI / 180.0;
|
|
||||||
|
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);
|
layout = pango_cairo_create_layout (cr);
|
||||||
pango_layout_set_font_description (layout,
|
pango_layout_set_font_description (layout,
|
||||||
gtk_style_context_get_font (context,
|
gtk_style_context_get_font (context,
|
||||||
state));
|
state));
|
||||||
pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
|
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);
|
||||||
|
|
||||||
|
pango_layout_set_text (layout, priv->summary, -1);
|
||||||
|
pango_cairo_update_layout (cr, layout);
|
||||||
|
|
||||||
cairo_save (cr);
|
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);
|
|
||||||
|
|
||||||
cairo_set_source_rgba (cr,
|
cairo_set_source_rgba (cr,
|
||||||
fg_color.red,
|
fg_color.red,
|
||||||
fg_color.green,
|
fg_color.green,
|
||||||
fg_color.blue,
|
fg_color.blue,
|
||||||
fg_color.alpha);
|
fg_color.alpha);
|
||||||
pango_layout_set_text (layout, priv->summary, -1);
|
cairo_move_to (cr, x + padding.left, y + padding.top);
|
||||||
pango_cairo_update_layout (cr, layout);
|
|
||||||
cairo_move_to (cr, x + RADIUS, y + RADIUS);
|
|
||||||
pango_cairo_show_layout (cr, layout);
|
pango_cairo_show_layout (cr, layout);
|
||||||
cairo_stroke (cr);
|
|
||||||
|
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
|
|
||||||
g_object_unref (layout);
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,7 +545,7 @@ gcal_event_widget_button_press_event (GtkWidget *widget,
|
|||||||
GdkEventButton *event)
|
GdkEventButton *event)
|
||||||
{
|
{
|
||||||
if (event->type == GDK_2BUTTON_PRESS)
|
if (event->type == GDK_2BUTTON_PRESS)
|
||||||
g_signal_emit (widget, signals[ACTIVATED], 0);
|
g_signal_emit (widget, signals[ACTIVATE], 0);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -616,3 +655,22 @@ gcal_event_widget_get_all_day (GcalEventWidget *event)
|
|||||||
g_object_get (event, "all-day", &all_day, NULL);
|
g_object_get (event, "all-day", &all_day, NULL);
|
||||||
return all_day;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ struct _GcalEventWidgetClass
|
|||||||
GtkWidgetClass parent_class;
|
GtkWidgetClass parent_class;
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
void (*activated) (GcalEventWidget *event_widget);
|
void (*activate) (GcalEventWidget *event_widget);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GcalEventWidget
|
struct _GcalEventWidget
|
||||||
@@ -82,6 +82,11 @@ void gcal_event_widget_set_all_day (GcalEventWidget *eve
|
|||||||
|
|
||||||
gboolean gcal_event_widget_get_all_day (GcalEventWidget *event);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GCAL_EVENT_WIDGET_H__ */
|
#endif /* __GCAL_EVENT_WIDGET_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user