[evolution] Draw flat events in Calendar views



commit 9ce1a78148e89fa43d7ddcd8d9a766b4aac4ca31
Author: Milan Crha <mcrha redhat com>
Date:   Tue Sep 19 09:13:04 2017 +0200

    Draw flat events in Calendar views
    
    Drawing events as flat had been suggested in bug 749158. This change
    adds also an option, which can switch the drawing back to shaded.

 data/org.gnome.evolution.calendar.gschema.xml.in |    4 +
 src/calendar/gui/e-day-view-main-item.c          |   89 +++++++-----
 src/calendar/gui/e-day-view-top-item.c           |  110 ++++++++------
 src/calendar/gui/e-day-view.c                    |   54 +++++++-
 src/calendar/gui/e-day-view.h                    |    4 +
 src/calendar/gui/e-week-view-event-item.c        |  169 +++++++++++++---------
 src/calendar/gui/e-week-view.c                   |   52 +++++++
 src/calendar/gui/e-week-view.h                   |   10 +-
 src/modules/settings/e-settings-calendar-view.c  |   10 ++
 9 files changed, 345 insertions(+), 157 deletions(-)
---
diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in 
b/data/org.gnome.evolution.calendar.gschema.xml.in
index 5436d1a..7186101 100644
--- a/data/org.gnome.evolution.calendar.gschema.xml.in
+++ b/data/org.gnome.evolution.calendar.gschema.xml.in
@@ -465,6 +465,10 @@
       <default>false</default>
       <_summary>Create events, memos and tasks as Private by default</_summary>
     </key>
+    <key name="draw-flat-events" type="b">
+      <default>true</default>
+      <_summary>Draw events as flat, not shaded.</_summary>
+    </key>
 
     <!-- The following keys are deprecated. -->
 
diff --git a/src/calendar/gui/e-day-view-main-item.c b/src/calendar/gui/e-day-view-main-item.c
index a0bca0e..9471bcc 100644
--- a/src/calendar/gui/e-day-view-main-item.c
+++ b/src/calendar/gui/e-day-view-main-item.c
@@ -209,8 +209,10 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
        gint scroll_flag = 0;
        gint row_y;
        PangoLayout *layout;
+       gboolean draw_flat_events;
 
        day_view = e_day_view_main_item_get_day_view (main_item);
+       draw_flat_events = e_day_view_get_draw_flat_events (day_view);
 
        cal_view = E_CALENDAR_VIEW (day_view);
        model = e_calendar_view_get_model (cal_view);
@@ -270,7 +272,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
                g_object_get (event->canvas_item, "x_offset", &text_x_offset, NULL);
 
        /* Draw shadow around the event when selected */
-       if (is_editing && (gtk_widget_has_focus (day_view->main_canvas))) {
+       if (!draw_flat_events && is_editing && (gtk_widget_has_focus (day_view->main_canvas))) {
                /* For embossing Item selection */
                item_x -= 1;
                item_y -= 2;
@@ -416,51 +418,64 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
                item_y += 2;
        }
 
-       /* Draw the background of the event with white to play with transparency */
-       cairo_save (cr);
+       if (!draw_flat_events) {
+               /* Draw the background of the event with white to play with transparency */
+               cairo_save (cr);
 
-       x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1;
-       y0 = item_y + 2;
-       rect_width = MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 3, 0);
-       rect_height = item_h - 4.;
+               x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1;
+               y0 = item_y + 2;
+               rect_width = MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 3, 0);
+               rect_height = item_h - 4.;
 
-       radius = 16;
+               radius = 16;
 
-       draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+               draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
 
-       cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
-       cairo_fill (cr);
+               cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
+               cairo_fill (cr);
 
-       cairo_restore (cr);
+               cairo_restore (cr);
 
-       /* Here we draw the border in event color */
-       cairo_save (cr);
+               /* Here we draw the border in event color */
+               cairo_save (cr);
 
-       x0 = item_x + E_DAY_VIEW_BAR_WIDTH;
-       y0 = item_y + 1.;
-       rect_width = MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 1., 0);
-       rect_height = item_h - 2.;
+               x0 = item_x + E_DAY_VIEW_BAR_WIDTH;
+               y0 = item_y + 1.;
+               rect_width = MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 1., 0);
+               rect_height = item_h - 2.;
 
-       radius = 16;
+               radius = 16;
 
-       draw_curved_rectangle (cr, x0, y0, rect_width,rect_height, radius);
-       cairo_set_line_width (cr, 2.);
-       gdk_cairo_set_source_rgba (cr, &bg_rgba);
-       cairo_stroke (cr);
-       cairo_restore (cr);
+               draw_curved_rectangle (cr, x0, y0, rect_width,rect_height, radius);
+               cairo_set_line_width (cr, 2.);
+               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+               cairo_stroke (cr);
+               cairo_restore (cr);
+       }
 
        /* Fill in the Event */
 
        cairo_save (cr);
 
-       x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1.75;
-       y0 = item_y + 2.75;
-       rect_width = item_w - E_DAY_VIEW_BAR_WIDTH - 4.5;
-       rect_height = item_h - 5.5;
+       if (draw_flat_events) {
+               x0 = item_x + E_DAY_VIEW_BAR_WIDTH;
+               y0 = item_y;
+               rect_width = item_w - E_DAY_VIEW_BAR_WIDTH;
+               rect_height = item_h - 1;
 
-       radius = 14;
+               cairo_rectangle (cr, x0, y0, rect_width, rect_height);
+               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+               cairo_fill (cr);
+       } else {
+               x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1.75;
+               y0 = item_y + 2.75;
+               rect_width = item_w - E_DAY_VIEW_BAR_WIDTH - 4.5;
+               rect_height = item_h - 5.5;
 
-       draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+               radius = 14;
+
+               draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+       }
 
        date_fraction = rect_height / day_view->row_height;
        interval = event->end_minute - event->start_minute;
@@ -796,7 +811,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
                cairo_save (cr);
                cairo_rectangle (
                        cr, item_x + E_DAY_VIEW_BAR_WIDTH + 1.75, item_y + 2.75,
-                       item_w - E_DAY_VIEW_BAR_WIDTH - 4.5,
+                       item_w - E_DAY_VIEW_BAR_WIDTH - (draw_flat_events ? 0.0 : 4.5),
                        14);
 
                cairo_clip (cr);
@@ -1096,6 +1111,7 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                        if (can_draw_in_region (draw_region, day_x, 0 - y, day_w, work_day_start_y - (0 - 
y))) {
                                cairo_save (cr);
                                gdk_cairo_set_source_color (cr, 
&day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
+                               cairo_set_line_width (cr, 0.5);
                                cairo_rectangle (cr, day_x, 0 - y, day_w, work_day_start_y - (0 - y));
                                cairo_fill (cr);
                                cairo_restore (cr);
@@ -1159,7 +1175,10 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                        if (can_draw_in_region (draw_region, rect_x, rect_y, rect_width, rect_height)) {
                                cairo_save (cr);
                                gdk_cairo_set_source_color (cr, 
&day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED]);
-                               cairo_rectangle (cr, rect_x, rect_y, rect_width, rect_height);
+                               if (e_day_view_get_draw_flat_events (day_view))
+                                       cairo_rectangle (cr, rect_x, rect_y, rect_width, rect_height);
+                               else
+                                       cairo_rectangle (cr, rect_x, rect_y, rect_width, rect_height);
                                cairo_fill (cr);
                                cairo_restore (cr);
                        }
@@ -1179,9 +1198,9 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
             row < day_view->rows && row_y < height;
             row++, row_y += day_view->row_height) {
                if (row_y >= 0 && row_y < height) {
-                       cairo_set_line_width (cr, 0.7);
-                       cairo_move_to (cr, grid_x1, row_y);
-                       cairo_line_to (cr, grid_x2, row_y);
+                       cairo_set_line_width (cr, 0.5);
+                       cairo_move_to (cr, grid_x1, row_y + 0.5);
+                       cairo_line_to (cr, grid_x2, row_y + 0.5);
                        cairo_stroke (cr);
                }
        }
diff --git a/src/calendar/gui/e-day-view-top-item.c b/src/calendar/gui/e-day-view-top-item.c
index 58a8aa6..8a31a14 100644
--- a/src/calendar/gui/e-day-view-top-item.c
+++ b/src/calendar/gui/e-day-view-top-item.c
@@ -151,8 +151,10 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
        GdkRGBA bg_rgba, rgba;
        cairo_pattern_t *pat;
        gdouble x0, y0, rect_height, rect_width, radius;
+       gboolean draw_flat_events;
 
        day_view = e_day_view_top_item_get_day_view (top_item);
+       draw_flat_events = e_day_view_get_draw_flat_events (day_view);
        model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
 
        /* If the event is currently being dragged, don't draw it. It will
@@ -187,65 +189,79 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
                bg_rgba.alpha = 1.0;
        }
 
-       /* Fill the background with white to play with transparency */
-       cairo_save (cr);
-       x0 = item_x - x + 4;
-       y0 = item_y + 1 - y;
-       rect_width = item_w - 8;
-       rect_height = item_h - 2;
+       if (draw_flat_events) {
+               x0 = item_x - x;
+               y0 = item_y - y + 2;
+               rect_width = item_w;
+               rect_height = item_h - 2;
 
-       radius = 12;
+               cairo_save (cr);
+               cairo_rectangle (cr, x0, y0, rect_width, rect_height);
+               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+               cairo_fill (cr);
+               cairo_restore (cr);
+       } else {
+               /* Fill the background with white to play with transparency */
+               cairo_save (cr);
 
-       draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+               x0 = item_x - x + 4;
+               y0 = item_y + 1 - y;
+               rect_width = item_w - 8;
+               rect_height = item_h - 2;
 
-       cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
-       cairo_fill_preserve (cr);
+               radius = 12;
 
-       cairo_restore (cr);
+               draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
 
-       /* Draw the border around the event */
+               cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
+               cairo_fill_preserve (cr);
 
-       cairo_save (cr);
-       x0 = item_x - x + 4;
-       y0 = item_y + 1 - y;
-       rect_width = item_w - 8;
-       rect_height = item_h - 2;
+               cairo_restore (cr);
 
-       radius = 12;
+               /* Draw the border around the event */
 
-       draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+               cairo_save (cr);
+               x0 = item_x - x + 4;
+               y0 = item_y + 1 - y;
+               rect_width = item_w - 8;
+               rect_height = item_h - 2;
 
-       gdk_cairo_set_source_rgba (cr, &bg_rgba);
-       cairo_set_line_width (cr, 1.5);
-       cairo_stroke (cr);
-       cairo_restore (cr);
+               radius = 12;
 
-       /* Fill in with gradient */
+               draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
 
-       cairo_save (cr);
+               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+               cairo_set_line_width (cr, 1.5);
+               cairo_stroke (cr);
+               cairo_restore (cr);
 
-       x0 = item_x - x + 5.5;
-       y0 = item_y + 2.5 - y;
-       rect_width = item_w - 11;
-       rect_height = item_h - 5;
+               /* Fill in with gradient */
 
-       radius = 10;
+               cairo_save (cr);
 
-       draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+               x0 = item_x - x + 5.5;
+               y0 = item_y + 2.5 - y;
+               rect_width = item_w - 11;
+               rect_height = item_h - 5;
 
-       pat = cairo_pattern_create_linear (
-               item_x - x + 5.5, item_y + 2.5 - y,
-               item_x - x + 5, item_y - y + item_h + 7.5);
-       cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.8 * 
bg_rgba.alpha);
-       cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.4 * 
bg_rgba.alpha);
-       cairo_set_source (cr, pat);
-       cairo_fill_preserve (cr);
-       cairo_pattern_destroy (pat);
+               radius = 10;
 
-       gdk_cairo_set_source_rgba (cr, &bg_rgba);
-       cairo_set_line_width (cr, 0.5);
-       cairo_stroke (cr);
-       cairo_restore (cr);
+               draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius);
+
+               pat = cairo_pattern_create_linear (
+                       item_x - x + 5.5, item_y + 2.5 - y,
+                       item_x - x + 5, item_y - y + item_h + 7.5);
+               cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.8 * 
bg_rgba.alpha);
+               cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.4 * 
bg_rgba.alpha);
+               cairo_set_source (cr, pat);
+               cairo_fill_preserve (cr);
+               cairo_pattern_destroy (pat);
+
+               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+               cairo_set_line_width (cr, 0.5);
+               cairo_stroke (cr);
+               cairo_restore (cr);
+       }
 
        /* When resizing we don't draw the triangles.*/
        draw_start_triangle = TRUE;
@@ -264,16 +280,16 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
        if (draw_start_triangle
            && event->start < day_view->day_starts[start_day]) {
                day_view_top_item_draw_triangle (
-                       top_item, cr, item_x - x + 4, item_y - y,
-                       -E_DAY_VIEW_BAR_WIDTH, item_h, event_num);
+                       top_item, cr, item_x - x, item_y - y + 2,
+                       -E_DAY_VIEW_BAR_WIDTH, item_h - 1, event_num);
        }
 
        /* Similar for the event end. */
        if (draw_end_triangle
            && event->end > day_view->day_starts[end_day + 1]) {
                day_view_top_item_draw_triangle (
-                       top_item, cr, item_x + item_w - 4 - x,
-                       item_y - y, E_DAY_VIEW_BAR_WIDTH, item_h,
+                       top_item, cr, item_x + item_w - x,
+                       item_y - y + 2, E_DAY_VIEW_BAR_WIDTH, item_h - 1,
                        event_num);
        }
 
diff --git a/src/calendar/gui/e-day-view.c b/src/calendar/gui/e-day-view.c
index 69fda99..8854665 100644
--- a/src/calendar/gui/e-day-view.c
+++ b/src/calendar/gui/e-day-view.c
@@ -170,6 +170,8 @@ struct _EDayViewPrivate {
        GtkWidget *timezone_name_2_label; /* not referenced */
 
        GdkDragContext *drag_context;
+
+       gboolean draw_flat_events;
 };
 
 typedef struct {
@@ -489,6 +491,7 @@ static EDayViewEvent *tooltip_get_view_event (EDayView *day_view, gint day, gint
 
 enum {
        PROP_0,
+       PROP_DRAW_FLAT_EVENTS,
        PROP_MARCUS_BAINS_SHOW_LINE,
        PROP_MARCUS_BAINS_DAY_VIEW_COLOR,
        PROP_MARCUS_BAINS_TIME_BAR_COLOR,
@@ -888,6 +891,12 @@ day_view_set_property (GObject *object,
                        GParamSpec *pspec)
 {
        switch (property_id) {
+               case PROP_DRAW_FLAT_EVENTS:
+                       e_day_view_set_draw_flat_events (
+                               E_DAY_VIEW (object),
+                               g_value_get_boolean (value));
+                       return;
+
                case PROP_MARCUS_BAINS_SHOW_LINE:
                        e_day_view_marcus_bains_set_show_line (
                                E_DAY_VIEW (object),
@@ -917,6 +926,13 @@ day_view_get_property (GObject *object,
                        GParamSpec *pspec)
 {
        switch (property_id) {
+               case PROP_DRAW_FLAT_EVENTS:
+                       g_value_set_boolean (
+                               value,
+                               e_day_view_get_draw_flat_events (
+                               E_DAY_VIEW (object)));
+                       return;
+
                case PROP_MARCUS_BAINS_SHOW_LINE:
                        g_value_set_boolean (
                                value,
@@ -1997,7 +2013,17 @@ e_day_view_class_init (EDayViewClass *class)
        view_class->precalc_visible_time_range = e_day_view_precalc_visible_time_range;
        view_class->paste_text = day_view_paste_text;
 
-       /* XXX Should these be constructor properties? */
+       g_object_class_install_property (
+               object_class,
+               PROP_DRAW_FLAT_EVENTS,
+               g_param_spec_boolean (
+                       "draw-flat-events",
+                       "Draw Flat Events",
+                       NULL,
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
 
        g_object_class_install_property (
                object_class,
@@ -3886,6 +3912,32 @@ e_day_view_marcus_bains_set_show_line (EDayView *day_view,
        g_object_notify (G_OBJECT (day_view), "marcus-bains-show-line");
 }
 
+gboolean
+e_day_view_get_draw_flat_events (EDayView *day_view)
+{
+       g_return_val_if_fail (E_IS_DAY_VIEW (day_view), FALSE);
+
+       return day_view->priv->draw_flat_events;
+}
+
+void
+e_day_view_set_draw_flat_events (EDayView *day_view,
+                                gboolean draw_flat_events)
+{
+       g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+       if ((day_view->priv->draw_flat_events ? 1 : 0) == (draw_flat_events ? 1 : 0))
+               return;
+
+       day_view->priv->draw_flat_events = draw_flat_events;
+
+       gtk_widget_queue_draw (day_view->top_canvas);
+       gtk_widget_queue_draw (day_view->top_dates_canvas);
+       gtk_widget_queue_draw (day_view->main_canvas);
+
+       g_object_notify (G_OBJECT (day_view), "draw-flat-events");
+}
+
 const gchar *
 e_day_view_marcus_bains_get_day_view_color (EDayView *day_view)
 {
diff --git a/src/calendar/gui/e-day-view.h b/src/calendar/gui/e-day-view.h
index 6dcb141..4bf0309 100644
--- a/src/calendar/gui/e-day-view.h
+++ b/src/calendar/gui/e-day-view.h
@@ -450,6 +450,10 @@ struct _EDayViewClass {
 GType          e_day_view_get_type             (void) G_GNUC_CONST;
 ECalendarView *        e_day_view_new                  (ECalModel *model);
 
+gboolean       e_day_view_get_draw_flat_events (EDayView *day_view);
+void           e_day_view_set_draw_flat_events (EDayView *day_view,
+                                                gboolean draw_flat_events);
+
 /* Whether we are displaying a work-week, in which case the display always
  * starts on the first day of the working week. */
 gboolean       e_day_view_get_work_week_view   (EDayView *day_view);
diff --git a/src/calendar/gui/e-week-view-event-item.c b/src/calendar/gui/e-week-view-event-item.c
index 5de05c2..cab9b53 100644
--- a/src/calendar/gui/e-week-view-event-item.c
+++ b/src/calendar/gui/e-week-view-event-item.c
@@ -729,6 +729,7 @@ week_view_event_item_draw (GnomeCanvasItem *canvas_item,
        gdouble radius, cx0, cy0, rect_height, rect_width;
        cairo_region_t *draw_region;
        GdkRectangle rect;
+       gboolean draw_flat_events;
 
        event_item = E_WEEK_VIEW_EVENT_ITEM (canvas_item);
        parent = gtk_widget_get_parent (GTK_WIDGET (canvas_item->canvas));
@@ -785,6 +786,8 @@ week_view_event_item_draw (GnomeCanvasItem *canvas_item,
                return;
        }
 
+       draw_flat_events = e_week_view_get_draw_flat_events (week_view);
+
        icon_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD;
 
        /* Get the start & end times in 24-hour format. */
@@ -819,48 +822,59 @@ week_view_event_item_draw (GnomeCanvasItem *canvas_item,
                rect_x = x1 + E_WEEK_VIEW_EVENT_L_PAD;
                rect_w = x2 - x1 - E_WEEK_VIEW_EVENT_L_PAD - E_WEEK_VIEW_EVENT_R_PAD + 1;
 
-               /* Here we draw the border around the event*/
                cx0 = rect_x;
                cy0 = y1 + 1;
                rect_width = rect_w;
                rect_height = y2 - y1 - 1;
 
-               radius = 12;
-
                if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
-                       cairo_save (cr);
-                       draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius);
-                       cairo_set_line_width (cr, 2.0);
-                       gdk_cairo_set_source_rgba (cr, &bg_rgba);
-                       cairo_stroke (cr);
-                       cairo_restore (cr);
-               }
-
-               /* Fill it in the Event */
-
-               cx0 = rect_x + 1.5;
-               cy0 = y1 + 2.75;
-               rect_width = rect_w - 3.;
-               rect_height = y2 - y1 - 4.5;
-
-               radius = 8;
-
-               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
-                       cairo_save (cr);
-                       draw_curved_rectangle (
-                               cr, cx0, cy0, rect_width, rect_height, radius);
-
-                       pat = cairo_pattern_create_linear (
-                               rect_x + 2, y1 + 1, rect_x + 2, y2 - 7.25);
-                       cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.8 * bg_rgba.alpha);
-                       cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.4 * bg_rgba.alpha);
-                       cairo_set_source (cr, pat);
-                       cairo_fill_preserve (cr);
-                       cairo_pattern_destroy (pat);
-                       cairo_set_source_rgba (cr, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.2 * 
bg_rgba.alpha);
-                       cairo_set_line_width (cr, 0.5);
-                       cairo_stroke (cr);
-                       cairo_restore (cr);
+                       if (draw_flat_events) {
+                               cairo_save (cr);
+                               cairo_rectangle (cr, cx0, cy0, rect_width, rect_height);
+                               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+                               cairo_fill (cr);
+                               cairo_restore (cr);
+                       } else {
+                               /* Here we draw the border around the event*/
+
+                               radius = 12;
+
+                               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
+                                       cairo_save (cr);
+                                       draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius);
+                                       cairo_set_line_width (cr, 2.0);
+                                       gdk_cairo_set_source_rgba (cr, &bg_rgba);
+                                       cairo_stroke (cr);
+                                       cairo_restore (cr);
+                               }
+
+                               /* Fill it in the Event */
+
+                               cx0 = rect_x + 1.5;
+                               cy0 = y1 + 2.75;
+                               rect_width = rect_w - 3.;
+                               rect_height = y2 - y1 - 4.5;
+
+                               radius = 8;
+
+                               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
+                                       cairo_save (cr);
+                                       draw_curved_rectangle (
+                                               cr, cx0, cy0, rect_width, rect_height, radius);
+
+                                       pat = cairo_pattern_create_linear (
+                                               rect_x + 2, y1 + 1, rect_x + 2, y2 - 7.25);
+                                       cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, 
bg_rgba.green, bg_rgba.blue, 0.8 * bg_rgba.alpha);
+                                       cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, 
bg_rgba.green, bg_rgba.blue, 0.4 * bg_rgba.alpha);
+                                       cairo_set_source (cr, pat);
+                                       cairo_fill_preserve (cr);
+                                       cairo_pattern_destroy (pat);
+                                       cairo_set_source_rgba (cr, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.2 * bg_rgba.alpha);
+                                       cairo_set_line_width (cr, 0.5);
+                                       cairo_stroke (cr);
+                                       cairo_restore (cr);
+                               }
+                       }
                }
 
                /* Draw the start and end times, as required. */
@@ -933,48 +947,59 @@ week_view_event_item_draw (GnomeCanvasItem *canvas_item,
                        rect_w -= 2;
                }
 
-               /* Here we draw the border around the event */
-
                cx0 = rect_x;
                cy0 = y1 + 1;
                rect_width = rect_w;
                rect_height = y2 - y1 - 1;
 
-               radius = 12;
-
                if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
-                       cairo_save (cr);
-                       draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius);
-                       cairo_set_line_width (cr, 2.0);
-                       gdk_cairo_set_source_rgba (cr, &bg_rgba);
-                       cairo_stroke (cr);
-                       cairo_restore (cr);
-               }
-
-               /* Here we fill it in the event*/
-
-               cx0 = rect_x + 1.5;
-               cy0 = y1 + 2.75;
-               rect_width = rect_w - 3.;
-               rect_height = y2 - y1 - 4.5;
-
-               radius = 8;
-
-               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
-                       cairo_save (cr);
-                       draw_curved_rectangle (
-                               cr, cx0, cy0, rect_width, rect_height, radius);
-
-                       pat = cairo_pattern_create_linear (rect_x + 2, y1 + 1, rect_x + 2, y2 - 7.25);
-                       cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.8 * bg_rgba.alpha);
-                       cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.4 * bg_rgba.alpha);
-                       cairo_set_source (cr, pat);
-                       cairo_fill_preserve (cr);
-                       cairo_pattern_destroy (pat);
-                       cairo_set_source_rgba (cr, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 0.2 * 
bg_rgba.alpha);
-                       cairo_set_line_width (cr, 0.5);
-                       cairo_stroke (cr);
-                       cairo_restore (cr);
+                       if (draw_flat_events) {
+                               cairo_save (cr);
+                               gdk_cairo_set_source_rgba (cr, &bg_rgba);
+                               cairo_rectangle (cr, cx0, cy0, rect_width, rect_height);
+                               cairo_fill (cr);
+                               cairo_restore (cr);
+                       } else {
+
+                               /* Here we draw the border around the event */
+
+                               radius = 12;
+
+                               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
+                                       cairo_save (cr);
+                                       draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius);
+                                       cairo_set_line_width (cr, 2.0);
+                                       gdk_cairo_set_source_rgba (cr, &bg_rgba);
+                                       cairo_stroke (cr);
+                                       cairo_restore (cr);
+                               }
+
+                               /* Here we fill it in the event*/
+
+                               cx0 = rect_x + 1.5;
+                               cy0 = y1 + 2.75;
+                               rect_width = rect_w - 3.;
+                               rect_height = y2 - y1 - 4.5;
+
+                               radius = 8;
+
+                               if (can_draw_in_region (draw_region, cx0, cy0, rect_width, rect_height)) {
+                                       cairo_save (cr);
+                                       draw_curved_rectangle (
+                                               cr, cx0, cy0, rect_width, rect_height, radius);
+
+                                       pat = cairo_pattern_create_linear (rect_x + 2, y1 + 1, rect_x + 2, y2 
- 7.25);
+                                       cairo_pattern_add_color_stop_rgba (pat, 1, bg_rgba.red, 
bg_rgba.green, bg_rgba.blue, 0.8 * bg_rgba.alpha);
+                                       cairo_pattern_add_color_stop_rgba (pat, 0, bg_rgba.red, 
bg_rgba.green, bg_rgba.blue, 0.4 * bg_rgba.alpha);
+                                       cairo_set_source (cr, pat);
+                                       cairo_fill_preserve (cr);
+                                       cairo_pattern_destroy (pat);
+                                       cairo_set_source_rgba (cr, bg_rgba.red, bg_rgba.green, bg_rgba.blue, 
0.2 * bg_rgba.alpha);
+                                       cairo_set_line_width (cr, 0.5);
+                                       cairo_stroke (cr);
+                                       cairo_restore (cr);
+                               }
+                       }
                }
 
                if (draw_start_triangle) {
diff --git a/src/calendar/gui/e-week-view.c b/src/calendar/gui/e-week-view.c
index a5ade40..ec7a32a 100644
--- a/src/calendar/gui/e-week-view.c
+++ b/src/calendar/gui/e-week-view.c
@@ -99,6 +99,7 @@ struct _EWeekViewPrivate {
        gulong notify_week_start_day_id;
 
        gboolean show_icons_month_view;
+       gboolean draw_flat_events;
 };
 
 typedef struct {
@@ -196,6 +197,7 @@ G_DEFINE_TYPE (EWeekView, e_week_view, E_TYPE_CALENDAR_VIEW)
 enum {
        PROP_0,
        PROP_COMPRESS_WEEKEND,
+       PROP_DRAW_FLAT_EVENTS,
        PROP_SHOW_EVENT_END_TIMES,
        PROP_SHOW_ICONS_MONTH_VIEW,
        PROP_IS_EDITING
@@ -782,6 +784,12 @@ week_view_set_property (GObject *object,
                                g_value_get_boolean (value));
                        return;
 
+               case PROP_DRAW_FLAT_EVENTS:
+                       e_week_view_set_draw_flat_events (
+                               E_WEEK_VIEW (object),
+                               g_value_get_boolean (value));
+                       return;
+
                case PROP_SHOW_EVENT_END_TIMES:
                        e_week_view_set_show_event_end_times (
                                E_WEEK_VIEW (object),
@@ -812,6 +820,13 @@ week_view_get_property (GObject *object,
                                E_WEEK_VIEW (object)));
                        return;
 
+               case PROP_DRAW_FLAT_EVENTS:
+                       g_value_set_boolean (
+                               value,
+                               e_week_view_get_draw_flat_events (
+                               E_WEEK_VIEW (object)));
+                       return;
+
                case PROP_SHOW_EVENT_END_TIMES:
                        g_value_set_boolean (
                                value,
@@ -1642,6 +1657,17 @@ e_week_view_class_init (EWeekViewClass *class)
 
        g_object_class_install_property (
                object_class,
+               PROP_DRAW_FLAT_EVENTS,
+               g_param_spec_boolean (
+                       "draw-flat-events",
+                       "Draw Flat Events",
+                       NULL,
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
                PROP_SHOW_EVENT_END_TIMES,
                g_param_spec_boolean (
                        "show-event-end-times",
@@ -1682,6 +1708,7 @@ e_week_view_init (EWeekView *week_view)
        week_view->priv = E_WEEK_VIEW_GET_PRIVATE (week_view);
        week_view->priv->weeks_shown = 6;
        week_view->priv->compress_weekend = TRUE;
+       week_view->priv->draw_flat_events = TRUE;
        week_view->priv->show_event_end_times = TRUE;
        week_view->priv->update_base_date = TRUE;
        week_view->priv->display_start_day = G_DATE_MONDAY;
@@ -2474,6 +2501,31 @@ e_week_view_set_compress_weekend (EWeekView *week_view,
        g_object_notify (G_OBJECT (week_view), "compress-weekend");
 }
 
+gboolean
+e_week_view_get_draw_flat_events (EWeekView *week_view)
+{
+       g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
+
+       return week_view->priv->draw_flat_events;
+}
+
+void
+e_week_view_set_draw_flat_events (EWeekView *week_view,
+                                 gboolean draw_flat_events)
+{
+       g_return_if_fail (E_IS_WEEK_VIEW (week_view));
+
+       if ((week_view->priv->draw_flat_events ? 1 : 0) == (draw_flat_events ? 1 : 0))
+               return;
+
+       week_view->priv->draw_flat_events = draw_flat_events;
+
+       gtk_widget_queue_draw (week_view->titles_canvas);
+       gtk_widget_queue_draw (week_view->main_canvas);
+
+       g_object_notify (G_OBJECT (week_view), "draw-flat-events");
+}
+
 /* Whether we display event end times. */
 gboolean
 e_week_view_get_show_event_end_times (EWeekView *week_view)
diff --git a/src/calendar/gui/e-week-view.h b/src/calendar/gui/e-week-view.h
index 5e0a155..afb0966 100644
--- a/src/calendar/gui/e-week-view.h
+++ b/src/calendar/gui/e-week-view.h
@@ -61,7 +61,7 @@
 #define E_WEEK_VIEW_ICON_HEIGHT                16
 #define E_WEEK_VIEW_ICON_X_PAD         1
 #define E_WEEK_VIEW_ICON_Y_PAD         1
-#define E_WEEK_VIEW_ICON_R_PAD         8
+#define E_WEEK_VIEW_ICON_R_PAD         4
 
 /* The space on the left & right outside of the event. (The triangle to
  * indicate the event continues is displayed in this space). */
@@ -82,7 +82,7 @@
 #define E_WEEK_VIEW_EVENT_TIME_SPACING 2
 
 /* The space between the time and the event text or icons. */
-#define E_WEEK_VIEW_EVENT_TIME_X_PAD   8
+#define E_WEEK_VIEW_EVENT_TIME_X_PAD   4
 
 /* The space between the borders of long events and any text of icons. */
 #define E_WEEK_VIEW_EVENT_EDGE_X_PAD   2
@@ -333,6 +333,12 @@ struct _EWeekViewClass {
 GType          e_week_view_get_type            (void);
 ECalendarView *        e_week_view_new                 (ECalModel *model);
 
+gboolean       e_week_view_get_draw_flat_events
+                                               (EWeekView *week_view);
+void           e_week_view_set_draw_flat_events
+                                               (EWeekView *week_view,
+                                                gboolean draw_flat_events);
+
 /* The first day shown. Note that it will be rounded down to the start of a
  * week when set. The returned value will be invalid if no date has been set
  * yet. */
diff --git a/src/modules/settings/e-settings-calendar-view.c b/src/modules/settings/e-settings-calendar-view.c
index 4430cff..c82a599 100644
--- a/src/modules/settings/e-settings-calendar-view.c
+++ b/src/modules/settings/e-settings-calendar-view.c
@@ -62,6 +62,11 @@ settings_calendar_view_constructed (GObject *object)
                        G_SETTINGS_BIND_GET);
 
                g_settings_bind (
+                       settings, "draw-flat-events",
+                       extensible, "draw-flat-events",
+                       G_SETTINGS_BIND_GET);
+
+               g_settings_bind (
                        settings, "marcus-bains-line",
                        extensible, "marcus-bains-show-line",
                        G_SETTINGS_BIND_GET);
@@ -87,6 +92,11 @@ settings_calendar_view_constructed (GObject *object)
                        G_SETTINGS_BIND_GET);
 
                g_settings_bind (
+                       settings, "draw-flat-events",
+                       extensible, "draw-flat-events",
+                       G_SETTINGS_BIND_GET);
+
+               g_settings_bind (
                        settings, "show-event-end",
                        extensible, "show-event-end-times",
                        G_SETTINGS_BIND_GET);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]