From 63351c17f7ebba7dfafd17be824212c0c6d2e583 Mon Sep 17 00:00:00 2001 From: Srinivasa Ragavan Date: Mon, 24 Apr 2006 10:39:20 +0000 Subject: Added Cairo support for Evolution. svn path=/trunk/; revision=31880 --- calendar/gui/apps_evolution_calendar.schemas.in.in | 12 + calendar/gui/e-calendar-view.c | 50 ++- calendar/gui/e-day-view-main-item.c | 474 ++++++++++++++------- calendar/gui/e-day-view-time-item.c | 102 +++-- calendar/gui/e-day-view-top-item.c | 320 +++++++++----- calendar/gui/e-day-view.c | 21 +- calendar/gui/e-day-view.h | 1 + calendar/gui/e-week-view-event-item.c | 261 ++++++++---- calendar/gui/e-week-view-main-item.c | 104 +++-- 9 files changed, 937 insertions(+), 408 deletions(-) (limited to 'calendar/gui') diff --git a/calendar/gui/apps_evolution_calendar.schemas.in.in b/calendar/gui/apps_evolution_calendar.schemas.in.in index 4b2c39b29a..768c7c42a8 100644 --- a/calendar/gui/apps_evolution_calendar.schemas.in.in +++ b/calendar/gui/apps_evolution_calendar.schemas.in.in @@ -317,6 +317,18 @@ + + /schemas/apps/evolution/calendar/display/events_transparency + /apps/evolution/calendar/display/events_transparency + evolution-calendar + float + 1.0 + + Event Transparency + Transparency of the events in calendar views (A value between 0 and 10, opaque by default). + + + diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 3b9c0758de..f405cd80b4 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -2261,4 +2261,52 @@ e_calendar_view_get_tooltips (ECalendarViewEventData *data) return FALSE; } - +void +draw_curved_rectangle (cairo_t *cr, double x0, double y0, + double rect_width, double rect_height, + double radius) +{ + double x1, y1; + + x1 = x0 + rect_width; + y1 = y0 + rect_height; + + if (!rect_width || !rect_height) + return; + if (rect_width / 2 < radius) { + if (rect_height / 2 < radius) { + cairo_move_to (cr, x0, (y0 + y1)/2); + cairo_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1)/2, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1)/2); + cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0)/2, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1)/2); + } else { + cairo_move_to (cr, x0, y0 + radius); + cairo_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1)/2, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); + cairo_line_to (cr, x1 , y1 - radius); + cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0)/2, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, y1- radius); + } + } else { + if (rect_height / 2 < radius) { + cairo_move_to (cr, x0, (y0 + y1)/2); + cairo_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0); + cairo_line_to (cr, x1 - radius, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1)/2); + cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); + cairo_line_to (cr, x0 + radius, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1)/2); + } else { + cairo_move_to (cr, x0, y0 + radius); + cairo_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0); + cairo_line_to (cr, x1 - radius, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); + cairo_line_to (cr, x1 , y1 - radius); + cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); + cairo_line_to (cr, x0 + radius, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, y1- radius); + } + } + cairo_close_path (cr); +} diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c index 0522db2ce7..caa7a882cc 100644 --- a/calendar/gui/e-day-view-main-item.c +++ b/calendar/gui/e-day-view-main-item.c @@ -35,9 +35,11 @@ #include "e-day-view-layout.h" #include "e-day-view-main-item.h" #include "ea-calendar.h" +#include "e-calendar-view.h" #include +#include -static void e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg, +static void e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg , guint arg_id); static void e_day_view_main_item_update (GnomeCanvasItem *item, double *affine, @@ -167,7 +169,9 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, gint start_row, end_row, rect_x, rect_y, rect_width, rect_height; struct icaltimetype day_start_tt; gint weekday; + cairo_t *cr; + cr = gdk_cairo_create (drawable); #if 0 g_print ("In e_day_view_main_item_draw %i,%i %ix%i\n", x, y, width, height); @@ -179,8 +183,8 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, style = gtk_widget_get_style (GTK_WIDGET (day_view)); /* Paint the background colors. */ - gc = day_view->main_gc; work_day_start_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute) - y; + gc = day_view->main_gc; work_day_end_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_end_hour, day_view->work_day_end_minute) - y; for (day = 0; day < day_view->days_shown; day++) { @@ -194,23 +198,37 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, day_w = day_view->day_widths[day]; if (work_day) { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); - gdk_draw_rectangle (drawable, gc, TRUE, - day_x, 0 - y, - day_w, work_day_start_y - (0 - y)); - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]); - gdk_draw_rectangle (drawable, gc, TRUE, - day_x, work_day_start_y, - day_w, work_day_end_y - work_day_start_y); - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); - gdk_draw_rectangle (drawable, gc, TRUE, - day_x, work_day_end_y, - day_w, height - work_day_end_y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); + + cairo_rectangle (cr, day_x, 0 - y, day_w, + work_day_start_y - (0 - y)); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]); + + cairo_rectangle (cr, day_x, work_day_start_y, day_w, + work_day_end_y - work_day_start_y); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); + + cairo_rectangle (cr, day_x, work_day_end_y, day_w, + height - work_day_end_y); + cairo_fill (cr); + cairo_restore (cr); + } else { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); - gdk_draw_rectangle (drawable, gc, TRUE, - day_x, 0, - day_w, height); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); + + cairo_rectangle (cr, day_x, 0, day_w, height); + cairo_fill (cr); + cairo_restore (cr); } } @@ -236,13 +254,23 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, rect_y = start_row * day_view->row_height - y; rect_height = (end_row - start_row + 1) * day_view->row_height; - if (GTK_WIDGET_HAS_FOCUS(day_view)) - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED]); - else - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]); - gdk_draw_rectangle (drawable, gc, TRUE, - rect_x, rect_y, - rect_width, rect_height); + if (GTK_WIDGET_HAS_FOCUS(day_view)) { + 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); + cairo_fill (cr); + cairo_restore (cr); + } else { + cairo_save (cr); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]); + cairo_rectangle (cr, rect_x, rect_y, rect_width, + rect_height); + cairo_fill (cr); + cairo_restore (cr); + } } } @@ -250,14 +278,21 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, grid_x1 = day_view->day_offsets[0] - x; grid_x2 = day_view->day_offsets[day_view->days_shown] - x; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); + cairo_save(cr); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); + for (row = 0, row_y = 0 - y; row < day_view->rows && row_y < height; row++, row_y += day_view->row_height) { - if (row_y >= 0 && row_y < height) - gdk_draw_line (drawable, gc, - grid_x1, row_y, grid_x2, row_y); + 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_stroke (cr); + } } + cairo_restore (cr); /* Draw the vertical bars down the left of each column. */ grid_y1 = 0; @@ -269,15 +304,30 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, if (grid_x1 >= width || grid_x1 + E_DAY_VIEW_BAR_WIDTH <= 0) continue; - gdk_draw_line (drawable, style->black_gc, - grid_x1, grid_y1, - grid_x1, grid_y2); - gdk_draw_line (drawable, style->black_gc, - grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y1, - grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y2); - gdk_draw_rectangle (drawable, style->white_gc, TRUE, - grid_x1 + 1, grid_y1, + cairo_save (cr); + + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); + cairo_move_to (cr, grid_x1, grid_y1); + cairo_line_to (cr, grid_x1, grid_y2); + cairo_stroke (cr); + + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); + + cairo_move_to (cr, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y1); + cairo_line_to (cr, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y2); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 1, 1, 1); + + cairo_rectangle (cr, grid_x1 + 1, grid_y1, E_DAY_VIEW_BAR_WIDTH - 2, grid_y2 - grid_y1); + + cairo_fill (cr); + + cairo_restore (cr); + /* Fill in the bars when the user is busy. */ e_day_view_main_item_draw_events_in_vbars (dvmitem, drawable, @@ -306,15 +356,16 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, int marcus_bains_y; GdkColor mb_color; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE]); + cairo_save (cr); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE]); if (day_view->marcus_bains_day_view_color && gdk_color_parse (day_view->marcus_bains_day_view_color, &mb_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); - if (gdk_colormap_alloc_color (colormap, &mb_color, TRUE, TRUE)) { - gdk_gc_set_foreground (gc, &mb_color); - } + if (gdk_colormap_alloc_color (colormap, &mb_color, TRUE, TRUE)) + gdk_cairo_set_source_color (cr, &mb_color); } zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)); @@ -330,12 +381,15 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, grid_x1 = day_view->day_offsets[day] - x + E_DAY_VIEW_BAR_WIDTH; grid_x2 = day_view->day_offsets[day + 1] - x - 1; marcus_bains_y = (time_now.hour * 60 + time_now.minute) * day_view->row_height / day_view->mins_per_row - y; - gdk_draw_line (drawable, gc, grid_x1, marcus_bains_y, grid_x2, marcus_bains_y); + cairo_set_line_width (cr, 1.5); + cairo_move_to (cr, grid_x1, marcus_bains_y); + cairo_line_to (cr, grid_x2, marcus_bains_y); + cairo_stroke (cr); } } + cairo_restore (cr); } - - + cairo_destroy (cr); } @@ -348,14 +402,19 @@ e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem, { EDayView *day_view; EDayViewEvent *event; - GdkGC *gc; gint grid_x, event_num, bar_y, bar_h; ECalComponentTransparency transparency; - + cairo_t *cr; + GdkColor bg_color; day_view = dvmitem->day_view; - gc = day_view->main_gc; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + cr = gdk_cairo_create (drawable); + cairo_save (cr); +// gdk_cairo_set_source_color (cr, +// &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]); grid_x = day_view->day_offsets[day] + 1 - x; @@ -366,6 +425,17 @@ e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem, event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); + if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), + &bg_color)) { + GdkColormap *colormap; + + colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + gdk_cairo_set_source_color (cr, + &bg_color); + } + } + comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); @@ -388,12 +458,15 @@ e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem, if (bar_y >= height || bar_y + bar_h <= 0) continue; - gdk_draw_rectangle (drawable, gc, TRUE, - grid_x, bar_y, - E_DAY_VIEW_BAR_WIDTH - 2, bar_h); + cairo_rectangle (cr, grid_x, bar_y, + E_DAY_VIEW_BAR_WIDTH - 2, bar_h); + + cairo_fill (cr); g_object_unref (comp); } + cairo_restore (cr); + cairo_destroy (cr); } @@ -406,13 +479,17 @@ e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem, EDayView *day_view; EDayViewEvent *event; gint event_num, start_day, end_day, day, bar_y1, bar_y2, grid_x; - GdkGC *gc; ECalComponentTransparency transparency; + cairo_t *cr; + GdkColor *bg_color; day_view = dvmitem->day_view; - gc = day_view->main_gc; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + cr = gdk_cairo_create (drawable); + cairo_save (cr); + + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]); for (event_num = 0; event_num < day_view->long_events->len; event_num++) { @@ -420,6 +497,16 @@ e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem, event = &g_array_index (day_view->long_events, EDayViewEvent, event_num); + if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), + &bg_color)) { + GdkColormap *colormap; + + colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + gdk_cairo_set_source_color (cr, + &bg_color); + } + } comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); @@ -456,16 +543,16 @@ e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem, } if (bar_y1 < height && bar_y2 > 0 && bar_y2 > bar_y1) { - gdk_draw_rectangle (drawable, gc, TRUE, - grid_x, bar_y1, - E_DAY_VIEW_BAR_WIDTH - 2, - bar_y2 - bar_y1); + cairo_rectangle (cr, grid_x, bar_y1, + E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1); + + cairo_fill (cr); } } - - g_object_unref (comp); } + cairo_restore (cr); + cairo_destroy (cr); } @@ -488,7 +575,6 @@ e_day_view_main_item_draw_day_events (EDayViewMainItem *dvmitem, } } - static void e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, GdkDrawable *drawable, @@ -507,17 +593,31 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, gboolean draw_attach_icon; GSList *categories_list, *elem; ECalComponentTransparency transparency; - + cairo_t *cr; + cairo_pattern_t *pat; + guint16 red, green, blue; + gint i; + gdouble radius, x0, y0, rect_height, rect_width; + gfloat alpha; + gdouble cc = 65535.0; day_view = dvmitem->day_view; + cr = gdk_cairo_create (drawable); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + + gc = day_view->main_gc; + + alpha = gconf_client_get_float (gconf_client_get_default (), + "/apps/evolution/calendar/display/events_transparency", + NULL); + /* If the event is currently being dragged, don't draw it. It will be drawn in the special drag items. */ if (day_view->drag_event_day == day && day_view->drag_event_num == event_num) return; - gc = day_view->main_gc; - /* Get the position of the event. If it is not shown skip it.*/ if (!e_day_view_get_event_position (day_view, day, event_num, &item_x, &item_y, @@ -533,40 +633,108 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, /* Fill in the event background. Note that for events in the first column of the day, we might not want to paint over the vertical bar, since that is used for multiple events. But then you can't see - where the event in the first column finishes. */ + where the event in the first column finishes. The border is drawn + along with the event using cairo*/ - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]); + red = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].red; + green = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].blue; if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), &bg_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + red = bg_color.red; + green = bg_color.green; + blue = bg_color.blue; + } } -#if 1 - if (event->start_row_or_col == 0) - gdk_draw_rectangle (drawable, gc, TRUE, - item_x + E_DAY_VIEW_BAR_WIDTH, item_y + 1, - MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 1, 0), - item_h - 2); - else -#endif - gdk_draw_rectangle (drawable, gc, TRUE, - item_x + 1, item_y + 1, - MAX (item_w - 2, 0), item_h - 2); + /* Draw the background of the event with white to play with transparency */ + 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.; + + radius = 16; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + + cairo_set_source_rgba (cr, 1, 1, 1, alpha); + cairo_fill (cr); + + cairo_restore (cr); + + /* second inner border */ + cairo_save (cr); + + x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1.; + y0 = item_y + 2.; + rect_width = item_w - E_DAY_VIEW_BAR_WIDTH - 3.; + rect_height = item_h - 4.; + + radius = 12; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + cairo_set_source_rgba (cr, red/cc, green/cc, blue/cc, 0); + cairo_set_line_width (cr, 0.6); + cairo_stroke (cr); + cairo_restore (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.; + + radius = 16; + + draw_curved_rectangle (cr, x0, y0, rect_width,rect_height, radius); + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, red/cc, green/cc, blue/cc); + cairo_stroke (cr); + cairo_restore (cr); + + /* Fill in the Event */ + + cairo_save (cr); - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + x0 = item_x + E_DAY_VIEW_BAR_WIDTH + 1.5; + y0 = item_y + 2.5; + rect_width = item_w - E_DAY_VIEW_BAR_WIDTH - 4.; + rect_height = item_h - 5.; + radius = 14; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + + pat = cairo_pattern_create_linear (item_x + E_DAY_VIEW_BAR_WIDTH + 2.5, item_y + 3.5, + item_x + E_DAY_VIEW_BAR_WIDTH + 2.5, item_y + item_h - 4); + cairo_pattern_add_color_stop_rgba (pat, 1, red/cc, green/cc, blue/cc, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0, red/cc, green/cc, blue/cc, 0.4); + cairo_set_source (cr, pat); + cairo_fill (cr); + cairo_pattern_destroy (pat); + cairo_restore (cr); + /* Draw the right edge of the vertical bar. */ - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER]); - gdk_draw_line (drawable, gc, - item_x + E_DAY_VIEW_BAR_WIDTH - 1, - item_y + 1, - item_x + E_DAY_VIEW_BAR_WIDTH - 1, - item_y + item_h - 2); + cairo_save (cr); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, item_x + E_DAY_VIEW_BAR_WIDTH - 1, item_y + 1); + cairo_line_to (cr, item_x + E_DAY_VIEW_BAR_WIDTH - 1, item_y + item_h - 2); + cairo_stroke (cr); + cairo_restore (cr); + + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); /* Draw the vertical colored bar showing when the appointment begins & ends. */ @@ -589,36 +757,53 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, /* Only fill it in if the event isn't TRANSPARENT. */ e_cal_component_get_transparency (comp, &transparency); if (transparency != E_CAL_COMPONENT_TRANSP_TRANSPARENT) { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); - gdk_draw_rectangle (drawable, gc, TRUE, - item_x + 1, bar_y1, - E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1); + cairo_save (cr); + pat = cairo_pattern_create_linear (item_x + E_DAY_VIEW_BAR_WIDTH, item_y + 1, + item_x + E_DAY_VIEW_BAR_WIDTH, item_y + item_h - 1); + cairo_pattern_add_color_stop_rgba (pat, 1, red/cc, green/cc, blue/cc, 0.7); + cairo_pattern_add_color_stop_rgba (pat, 0.5, red/cc, green/cc, blue/cc, 0.7); + cairo_pattern_add_color_stop_rgba (pat, 0, red/cc, green/cc, blue/cc, 0.2); + + cairo_rectangle (cr, item_x + 1, bar_y1, + E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1); + + cairo_set_source (cr, pat); + cairo_fill (cr); + cairo_pattern_destroy (pat); + cairo_restore (cr); + + /* This is for achieving the white stripes in vbar across event color */ + for (i = 0; i <= (bar_y2 - bar_y1) ; i+=4) { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_set_line_width (cr, 0.3); + cairo_move_to (cr, item_x + 1, bar_y1 + i); + cairo_line_to (cr, item_x + E_DAY_VIEW_BAR_WIDTH - 1, bar_y1 + i); + cairo_stroke (cr); + } } - /* Draw the box around the entire event. Do this after drawing - the colored bar so we don't have to worry about being 1 - pixel out. */ - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER]); - gdk_draw_rectangle (drawable, gc, FALSE, - item_x, item_y, MAX (item_w - 1, 0), item_h - 1); - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); + gdk_cairo_set_source_color (cr, + &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); #if 0 /* Draw the horizontal bars above and beneath the event if it is currently being edited. */ if (day_view->editing_event_day == day && day_view->editing_event_num == event_num) { - gdk_draw_rectangle (drawable, gc, TRUE, - item_x, - item_y - E_DAY_VIEW_BAR_HEIGHT, - item_w, - E_DAY_VIEW_BAR_HEIGHT); - gdk_draw_rectangle (drawable, gc, TRUE, - item_x, item_y + item_h, - item_w, E_DAY_VIEW_BAR_HEIGHT); + cairo_save (cr); + cairo_rectangle (cr, item_x, item_y - E_DAY_VIEW_BAR_HEIGHT, + item_w, E_DAY_VIEW_BAR_HEIGHT); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_rectangle (cr, item_x, item_y + item_h, + item_w, E_DAY_VIEW_BAR_HEIGHT); + cairo_fill (cr); + cairo_restore (cr); } #endif - + /* Draw the reminder & recurrence icons, if needed. */ num_icons = 0; draw_reminder_icon = FALSE; @@ -684,16 +869,11 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->reminder_icon, - 0, 0, icon_x, icon_y, - MIN (E_DAY_VIEW_ICON_WIDTH, - max_icon_w), - MIN (E_DAY_VIEW_ICON_HEIGHT, - max_icon_h), - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->reminder_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; icon_y += icon_y_inc; } @@ -703,17 +883,12 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; - - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->recurrence_icon, - 0, 0, icon_x, icon_y, - MIN (E_DAY_VIEW_ICON_WIDTH, - max_icon_w), - MIN (E_DAY_VIEW_ICON_HEIGHT, - max_icon_h), - GDK_RGB_DITHER_NORMAL, - 0, 0); + + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->recurrence_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; icon_y += icon_y_inc; } @@ -723,16 +898,10 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->attach_icon, - 0, 0, icon_x, icon_y, - MIN (E_DAY_VIEW_ICON_WIDTH, - max_icon_w), - MIN (E_DAY_VIEW_ICON_HEIGHT, - max_icon_h), - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->attach_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); icon_x += icon_x_inc; icon_y += icon_y_inc; } @@ -742,16 +911,11 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->timezone_icon, - 0, 0, icon_x, icon_y, - MIN (E_DAY_VIEW_ICON_WIDTH, - max_icon_w), - MIN (E_DAY_VIEW_ICON_HEIGHT, - max_icon_h), - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->timezone_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; icon_y += icon_y_inc; } @@ -763,16 +927,11 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->meeting_icon, - 0, 0, icon_x, icon_y, - MIN (E_DAY_VIEW_ICON_WIDTH, - max_icon_w), - MIN (E_DAY_VIEW_ICON_HEIGHT, - max_icon_h), - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->meeting_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; icon_y += icon_y_inc; } @@ -817,6 +976,7 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, /* free memory */ e_cal_component_free_categories_list (categories_list); g_object_unref (comp); + cairo_destroy (cr); } diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c index 4c2ed4d63c..015356af6f 100644 --- a/calendar/gui/e-day-view-time-item.c +++ b/calendar/gui/e-day-view-time-item.c @@ -178,6 +178,7 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem) gint digit, large_digit_width, max_large_digit_width = 0; gint max_suffix_width, max_minute_or_suffix_width; gint column_width_default, column_width_60_min_rows; + cairo_t *cr; day_view = dvtmitem->day_view; g_return_val_if_fail (day_view != NULL, 0); @@ -198,6 +199,7 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem) layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), digit_str); pango_layout_set_font_description (layout, day_view->large_font_desc); pango_layout_get_pixel_size (layout, &large_digit_width, NULL); + g_object_unref (layout); max_large_digit_width = MAX (max_large_digit_width, @@ -228,7 +230,6 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem) dvtmitem->column_width = MAX (column_width_default, column_width_60_min_rows); - return dvtmitem->column_width; } @@ -248,7 +249,6 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, EDayView *day_view; EDayViewTimeItem *dvtmitem; GtkStyle *style; - GdkGC *gc, *fg_gc, *dark_gc; gchar buffer[64], *suffix; gint hour, display_hour, minute, row; gint row_y, start_y, large_hour_y_offset, small_font_y_offset; @@ -260,6 +260,10 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, PangoContext *context; PangoFontDescription *small_font_desc; PangoFontMetrics *large_font_metrics, *small_font_metrics; + cairo_t *cr; + GdkColor fg, dark; + + cr = gdk_cairo_create (drawable); dvtmitem = E_DAY_VIEW_TIME_ITEM (canvas_item); day_view = dvtmitem->day_view; @@ -274,9 +278,8 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, small_font_metrics = pango_context_get_metrics (context, small_font_desc, pango_context_get_language (context)); - gc = day_view->main_gc; - fg_gc = style->fg_gc[GTK_STATE_NORMAL]; - dark_gc = style->dark_gc[GTK_STATE_NORMAL]; + fg = style->fg[GTK_STATE_NORMAL]; + dark = style->dark[GTK_STATE_NORMAL]; /* The start and end of the long horizontal line between hours. */ long_line_x1 = E_DVTMI_TIME_GRID_X_PAD - x; @@ -334,22 +337,25 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, int marcus_bains_y; GdkColor mb_color; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE]); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE]); if (day_view->marcus_bains_time_bar_color && gdk_color_parse (day_view->marcus_bains_time_bar_color, &mb_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); if (gdk_colormap_alloc_color (colormap, &mb_color, TRUE, TRUE)) { - gdk_gc_set_foreground (gc, &mb_color); + gdk_cairo_set_source_color (cr, &mb_color); } } time_now = icaltime_current_time_with_zone (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); marcus_bains_y = (time_now.hour * 60 + time_now.minute) * day_view->row_height / day_view->mins_per_row - y; - gdk_draw_line (drawable, gc, - long_line_x1, marcus_bains_y, - long_line_x2, marcus_bains_y); + cairo_set_line_width (cr, 1.5); + cairo_move_to (cr, long_line_x1, marcus_bains_y); + cairo_line_to (cr, long_line_x2, marcus_bains_y); + cairo_stroke (cr); + cairo_restore (cr); } /* Step through each row, drawing the times and the horizontal lines @@ -376,9 +382,14 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, /* 60 minute intervals - draw a long horizontal line between hours and display as one long string, e.g. "14:00" or "2 pm". */ - gdk_draw_line (drawable, dark_gc, - long_line_x1, row_y, - long_line_x2, row_y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &dark); + cairo_save (cr); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, long_line_x1, row_y); + cairo_line_to (cr, long_line_x2, row_y); + cairo_stroke (cr); + cairo_restore (cr); if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) { g_snprintf (buffer, sizeof (buffer), "%i:%02i", @@ -388,12 +399,16 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, display_hour, suffix); } - layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &fg); + layout = pango_cairo_create_layout (cr); + pango_layout_set_text (layout, buffer, -1); pango_layout_get_pixel_size (layout, &minute_width, NULL); - gdk_draw_layout (drawable, fg_gc, - minute_x2 - minute_width, - row_y + small_font_y_offset, - layout); + cairo_translate (cr, minute_x2 - minute_width, row_y + small_font_y_offset); + pango_cairo_update_layout (cr, layout); + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); + g_object_unref (layout); } else { /* 5/10/15/30 minute intervals. */ @@ -402,27 +417,40 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, /* On the hour - draw a long horizontal line before the hour and display the hour in the large font. */ - gdk_draw_line (drawable, dark_gc, - long_line_x1, row_y, - long_line_x2, row_y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &dark); g_snprintf (buffer, sizeof (buffer), "%i", display_hour); - layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, long_line_x1, row_y); + cairo_line_to (cr, long_line_x2, row_y); + cairo_stroke (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &fg); + layout = pango_cairo_create_layout (cr); + pango_layout_set_text (layout, buffer, -1); pango_layout_set_font_description (layout, day_view->large_font_desc); pango_layout_get_pixel_size (layout, &hour_width, NULL); - gdk_draw_layout (drawable, fg_gc, - large_hour_x2 - hour_width, - row_y + large_hour_y_offset, - layout); + cairo_translate (cr, large_hour_x2 - hour_width, row_y + large_hour_y_offset); + pango_cairo_update_layout (cr, layout); + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); + g_object_unref (layout); } else { /* Within the hour - draw a short line before the time. */ - gdk_draw_line (drawable, dark_gc, - short_line_x1, row_y, - long_line_x2, row_y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &dark); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, short_line_x1, row_y); + cairo_line_to (cr, long_line_x2, row_y); + cairo_stroke (cr); + cairo_restore (cr); } /* Normally we display the minute in each @@ -439,12 +467,17 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, "%02i", minute); } - layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &fg); + layout = pango_cairo_create_layout (cr); + pango_layout_set_text (layout, buffer, -1); + pango_layout_set_font_description (layout, day_view->small_font_desc); pango_layout_get_pixel_size (layout, &minute_width, NULL); - gdk_draw_layout (drawable, fg_gc, - minute_x2 - minute_width, - row_y + small_font_y_offset, - layout); + cairo_translate (cr, minute_x2 - minute_width, row_y + small_font_y_offset); + pango_cairo_update_layout (cr, layout); + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); + g_object_unref (layout); } } @@ -455,6 +488,7 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, pango_font_metrics_unref (large_font_metrics); pango_font_metrics_unref (small_font_metrics); + cairo_destroy (cr); } diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c index bfdc31bbd9..f953c605f9 100644 --- a/calendar/gui/e-day-view-top-item.c +++ b/calendar/gui/e-day-view-top-item.c @@ -34,6 +34,7 @@ #include "e-util/e-categories-config.h" #include #include +#include "e-calendar-view.h" #include "e-day-view-top-item.h" static void e_day_view_top_item_set_arg (GtkObject *o, @@ -164,6 +165,8 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, gint canvas_width, canvas_height, left_edge, day, date_width, date_x; gint item_height, event_num; PangoLayout *layout; + cairo_t *cr; + GdkColor fg, bg, light, dark; #if 0 g_print ("In e_day_view_top_item_draw %i,%i %ix%i\n", @@ -173,6 +176,8 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, day_view = dvtitem->day_view; g_return_if_fail (day_view != NULL); + cr = gdk_cairo_create (drawable); + style = gtk_widget_get_style (GTK_WIDGET (day_view)); gc = day_view->main_gc; fg_gc = style->fg_gc[GTK_STATE_NORMAL]; @@ -184,32 +189,47 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, left_edge = 0; item_height = day_view->top_row_height - E_DAY_VIEW_TOP_CANVAS_Y_GAP; + fg = style->fg[GTK_STATE_NORMAL]; + bg = style->bg[GTK_STATE_NORMAL]; + light = style->light[GTK_STATE_NORMAL]; + dark = style->dark[GTK_STATE_NORMAL]; + /* Draw the shadow around the dates. */ - gdk_draw_line (drawable, light_gc, - left_edge - x, 1 - y, - canvas_width - 2 - x, 1 - y); - gdk_draw_line (drawable, light_gc, - left_edge - x, 2 - y, - left_edge - x, item_height - 2 - y); - gdk_draw_line (drawable, dark_gc, - left_edge - x, item_height - 1 - y, - canvas_width - 1 - x, item_height - 1 - y); - gdk_draw_line (drawable, dark_gc, - canvas_width - 1 - x, 1 - y, - canvas_width - 1 - x, item_height - 1 - y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &light); + cairo_move_to (cr, left_edge - x, 1 - y); + cairo_line_to (cr, canvas_width - 2 - x, 1 - y); + cairo_move_to (cr, left_edge - x, 2 - y); + cairo_line_to (cr, left_edge - x, item_height - 2 - y); + cairo_stroke (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &dark); + cairo_move_to (cr, left_edge - x, item_height - 1 - y); + cairo_line_to (cr, canvas_width - 1 - x, item_height - 1 - y); + cairo_move_to (cr, canvas_width - 1 - x, 1 - y); + cairo_line_to (cr, canvas_width - 1 - x, item_height - 1 - y); + cairo_stroke (cr); + cairo_restore (cr); /* Draw the background for the dates. */ - gdk_draw_rectangle (drawable, bg_gc, TRUE, - left_edge + 2 - x, 2 - y, + cairo_save (cr); + gdk_cairo_set_source_color (cr, &bg); + cairo_rectangle (cr, left_edge + 2 - x, 2 - y, canvas_width - left_edge - 3, item_height - 3); + cairo_fill (cr); + cairo_restore (cr); /* Clear the main area background. */ - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS]); - gdk_draw_rectangle (drawable, gc, TRUE, - left_edge - x, item_height - y, + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS]); + cairo_rectangle (cr, left_edge - x, item_height - y, canvas_width - left_edge, canvas_height - item_height); + cairo_fill (cr); + cairo_restore (cr); /* Draw the selection background. */ if (GTK_WIDGET_HAS_FOCUS (day_view) @@ -227,10 +247,12 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, rect_w = day_view->day_offsets[end_col + 1] - rect_x; rect_h = canvas_height - 1 - rect_y; - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED]); - gdk_draw_rectangle (drawable, gc, TRUE, - rect_x - x, rect_y - y, + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED]); + cairo_rectangle (cr, rect_x - x, rect_y - y, rect_w, rect_h); + cairo_fill (cr); + cairo_restore (cr); } } @@ -243,6 +265,7 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, clip_rect.y = 2 - y; clip_rect.width = day_view->day_widths[day]; clip_rect.height = item_height - 2; + gdk_gc_set_clip_rectangle (fg_gc, &clip_rect); layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); @@ -259,27 +282,32 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, /* Draw the lines down the left and right of the date cols. */ if (day != 0) { - gdk_draw_line (drawable, light_gc, - day_view->day_offsets[day] - x, - 4 - y, - day_view->day_offsets[day] - x, + cairo_save (cr); + gdk_cairo_set_source_color (cr, &light); + cairo_move_to (cr, day_view->day_offsets[day] - x, + 4 - y); + cairo_line_to (cr, day_view->day_offsets[day] - x, item_height - 4 - y); - - gdk_draw_line (drawable, dark_gc, - day_view->day_offsets[day] - 1 - x, - 4 - y, - day_view->day_offsets[day] - 1 - x, + cairo_stroke (cr); + gdk_cairo_set_source_color (cr, &dark); + cairo_move_to (cr, day_view->day_offsets[day] - 1 - x, + 4 - y); + cairo_line_to (cr, day_view->day_offsets[day] - 1 - x, item_height - 4 - y); + cairo_stroke (cr); + cairo_restore (cr); } /* Draw the lines between each column. */ if (day != 0) { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID]); - gdk_draw_line (drawable, gc, - day_view->day_offsets[day] - x, - item_height - y, - day_view->day_offsets[day] - x, + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID]); + cairo_move_to (cr, day_view->day_offsets[day] - x, + item_height - y); + cairo_line_to (cr, day_view->day_offsets[day] - x, canvas_height - y); + cairo_stroke (cr); + cairo_restore (cr); } } @@ -290,9 +318,9 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, drawable, x, y, width, height); } + cairo_destroy (cr); } - /* This draws one event in the top canvas. */ static void e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, @@ -320,8 +348,20 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, GSList *categories_list, *elem; PangoLayout *layout; GdkColor bg_color; + cairo_t *cr; + cairo_pattern_t *pat; + guint16 red, green, blue; + GdkColor fg; + gdouble cc = 65535.0; + gfloat alpha; + gdouble x0, y0, rect_height, rect_width, radius; day_view = dvtitem->day_view; + cr = gdk_cairo_create (drawable); + + alpha = gconf_client_get_float (gconf_client_get_default (), + "/apps/evolution/calendar/display/events_transparency", + NULL); /* If the event is currently being dragged, don't draw it. It will be drawn in the special drag items. */ @@ -341,34 +381,102 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, style = gtk_widget_get_style (GTK_WIDGET (day_view)); gc = day_view->main_gc; fg_gc = style->fg_gc[GTK_STATE_NORMAL]; + fg = style->fg[GTK_STATE_NORMAL]; comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); /* Draw the lines across the top & bottom of the entire event. */ - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); - gdk_draw_line (drawable, gc, - item_x - x, item_y - y, - item_x + item_w - 1 - x, item_y - y); - gdk_draw_line (drawable, gc, - item_x - x, item_y + item_h - 1 - y, - item_x + item_w - 1 - x, item_y + item_h - 1 - y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + cairo_move_to (cr, item_x - x, item_y + item_h - 1 - y); + cairo_line_to (cr, item_x + item_w - 1 - x, item_y - y); + cairo_move_to (cr, item_x - x, item_y + item_h - 1 - y); + cairo_line_to (cr, item_x + item_w - 1 - x, item_y + item_h - 1 - y); + cairo_stroke (cr); + cairo_restore (cr); - /* Fill it in. */ if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), &bg_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); - else - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); - } else - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); - gdk_draw_rectangle (drawable, gc, TRUE, - item_x - x, item_y + 1 - y, - item_w, item_h - 2); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)){ + red = bg_color.red; + green = bg_color.green; + blue = bg_color.blue; + } else { + red = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].red; + green = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].green; + blue = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].blue; + } + } else { + red = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].red; + green = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].green; + blue = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].blue; + } + + /* Fill the background with white to play with transparency */ + cairo_save (cr); + x0 = item_x - x + 2; + y0 = item_y + 1 - y; + rect_width = item_w - 5; + rect_height = item_h - 2; + + radius = 12; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + + cairo_set_source_rgba (cr, 1, 1, 1, alpha); + cairo_fill_preserve (cr); + + cairo_restore (cr); + + /* Draw the border around the event */ + + cairo_save (cr); + x0 = item_x - x + 2; + y0 = item_y + 1 - y; + rect_width = item_w - 5; + rect_height = item_h - 2; + + radius = 12; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + + cairo_set_source_rgba (cr, 1, 1, 1, alpha); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, red/cc, green/cc, blue/cc); + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + cairo_restore (cr); + + /* Fill in with gradient */ + + cairo_save (cr); + + x0 = item_x - x + 3.75; + y0 = item_y + 2.75 - y; + rect_width = item_w - 8.5; + rect_height = item_h - 5.5; + + radius = 6; + + draw_curved_rectangle (cr, x0, y0, rect_width, rect_height, radius); + + pat = cairo_pattern_create_linear (item_x - x, item_y + 1 - y, + item_x - x , item_y - y + item_h - 1); + cairo_pattern_add_color_stop_rgba (pat, 1, red/cc, green/cc, blue/cc, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0, red/cc, green/cc, blue/cc, 0.4); + cairo_set_source (cr, pat); + cairo_fill_preserve (cr); + cairo_pattern_destroy (pat); + + cairo_set_source_rgba (cr, red/cc, green/cc, blue/cc, 0); + 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; @@ -392,10 +500,12 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, -E_DAY_VIEW_BAR_WIDTH, item_h, event_num); } else { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); - gdk_draw_line (drawable, gc, - item_x - x, item_y - y, - item_x - x, item_y + item_h - 1 - y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + cairo_move_to (cr, item_x - x, item_y - y); + cairo_line_to (cr, item_x - x, item_y + item_h - 1 - y); + cairo_stroke (cr); + cairo_restore (cr); } /* Similar for the event end. */ @@ -407,12 +517,12 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, E_DAY_VIEW_BAR_WIDTH, item_h, event_num); } else { - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); - gdk_draw_line (drawable, gc, - item_x + item_w - 1 - x, - item_y - y, - item_x + item_w - 1 - x, - item_y + item_h - 1 - y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + cairo_move_to (cr, item_x + item_w - 1 - x, item_y - y); + cairo_line_to (cr, item_x + item_w - 1 - x, item_y + item_h - 1 - y); + cairo_stroke (cr); + cairo_restore (cr); } /* If we are editing the event we don't show the icons or the start @@ -521,41 +631,32 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, + E_DAY_VIEW_ICON_Y_PAD - y; if (icon_x <= max_icon_x && (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp))) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->recurrence_icon, - 0, 0, icon_x, icon_y, - E_DAY_VIEW_ICON_WIDTH, - E_DAY_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->recurrence_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x -= icon_x_inc; } if (icon_x <= max_icon_x && e_cal_component_has_attachments (comp)) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->attach_icon, - 0, 0, icon_x, icon_y, - E_DAY_VIEW_ICON_WIDTH, - E_DAY_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->attach_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x -= icon_x_inc; } if (icon_x <= max_icon_x && e_cal_component_has_alarms (comp)) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - day_view->reminder_icon, - 0, 0, icon_x, icon_y, - E_DAY_VIEW_ICON_WIDTH, - E_DAY_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, day_view->reminder_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x -= icon_x_inc; } - /* draw categories icons */ + /* draw categories icons */ /* categories alone - yet to be cairo - ified */ e_cal_component_get_categories_list (comp, &categories_list); for (elem = categories_list; elem; elem = elem->next) { char *category; @@ -586,7 +687,7 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, e_cal_component_free_categories_list (categories_list); g_object_unref (comp); - + cairo_destroy (cr); gdk_gc_set_clip_mask (gc, NULL); } @@ -608,6 +709,9 @@ e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem, GdkColor bg_color; GdkPoint points[3]; gint c1, c2; + cairo_t *cr; + + cr = gdk_cairo_create (drawable); day_view = dvtitem->day_view; @@ -628,7 +732,7 @@ e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem, event = &g_array_index (day_view->long_events, EDayViewEvent, event_num); - + cairo_save (cr); /* Fill it in. */ if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), @@ -636,18 +740,32 @@ e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem, GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); - else - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); - } else - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); - - gdk_draw_polygon (drawable, gc, TRUE, points, 3); - - gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); - gdk_draw_line (drawable, gc, x, y, x + w, c1); - gdk_draw_line (drawable, gc, x, y + h - 1, x + w, c2); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + gdk_cairo_set_source_color (cr, &bg_color); + } else { + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); + } + } else { + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); + } + + cairo_move_to (cr, points[0].x, points[0].y); + cairo_line_to (cr, points[1].x, points[1].y); + cairo_line_to (cr, points[2].x, points[2].y); + cairo_line_to (cr, points[0].x, points[0].y); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x + w, c1); + cairo_move_to (cr, x, y + h - 1); + cairo_line_to (cr, x + w, c2); + cairo_stroke (cr); + cairo_restore (cr); + + cairo_destroy (cr); } diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index f58502946d..75744d2347 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -1,5 +1,4 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - /* * Authors : * Damon Chaplin @@ -78,6 +77,7 @@ #define E_DAY_VIEW_DATE_X_PAD 4 #define E_DAY_VIEW_LARGE_FONT_PTSIZE 18 +#define E_DAY_VIEW_SMALL_FONT_PTSIZE 10 /* The offset from the top/bottom of the canvas before auto-scrolling starts.*/ #define E_DAY_VIEW_AUTO_SCROLL_OFFSET 16 @@ -739,6 +739,7 @@ e_day_view_init (EDayView *day_view) day_view->auto_scroll_timeout_id = 0; day_view->large_font_desc = NULL; + day_view->small_font_desc = NULL; /* String to use in 12-hour time format for times in the morning. */ day_view->am_string = _("am"); @@ -893,7 +894,7 @@ e_day_view_init (EDayView *day_view) day_view->drag_rect_item = gnome_canvas_item_new (canvas_group, - gnome_canvas_rect_get_type (), + gnome_canvas_rect_get_type (), "width_pixels", 1, NULL); gnome_canvas_item_hide (day_view->drag_rect_item); @@ -1033,6 +1034,11 @@ e_day_view_destroy (GtkObject *object) day_view->large_font_desc = NULL; } + if (day_view->small_font_desc) { + pango_font_description_free (day_view->small_font_desc); + day_view->small_font_desc = NULL; + } + if (day_view->normal_cursor) { gdk_cursor_unref (day_view->normal_cursor); day_view->normal_cursor = NULL; @@ -1254,6 +1260,14 @@ e_day_view_style_set (GtkWidget *widget, day_view->large_font_desc = pango_font_description_copy (font_desc); pango_font_description_set_size (day_view->large_font_desc, E_DAY_VIEW_LARGE_FONT_PTSIZE * PANGO_SCALE); + + /* Create the small fonts. */ + if (day_view->small_font_desc != NULL) + pango_font_description_free (day_view->small_font_desc); + + day_view->small_font_desc = pango_font_description_copy (font_desc); + pango_font_description_set_size (day_view->small_font_desc, + E_DAY_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE); /* Recalculate the height of each row based on the font size. */ day_view->row_height = @@ -4671,6 +4685,7 @@ e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view) "x2", x + w - 1, "y2", y + h + E_DAY_VIEW_BAR_HEIGHT - 1, NULL); + gnome_canvas_item_show (day_view->main_canvas_bottom_resize_bar_item); } @@ -7788,5 +7803,3 @@ e_day_view_get_num_events_selected (EDayView *day_view) return (day_view->editing_event_day != -1) ? 1 : 0; } - - diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index d137332a88..351bcd1039 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -325,6 +325,7 @@ struct _EDayView /* The large font used to display the hours. I don't think we need a fontset since we only display numbers. */ PangoFontDescription *large_font_desc; + PangoFontDescription *small_font_desc; /* The GC used for painting in different colors. */ GdkGC *main_gc; diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c index d671b2e876..0aa69c3530 100644 --- a/calendar/gui/e-week-view-event-item.c +++ b/calendar/gui/e-week-view-event-item.c @@ -36,6 +36,8 @@ #include "e-week-view-event-item.h" #include +#include "e-calendar-view.h" + #include static void e_week_view_event_item_set_arg (GtkObject *o, @@ -202,7 +204,6 @@ e_week_view_event_item_update (GnomeCanvasItem *item, } } - /* * DRAWING ROUTINES - functions to paint the canvas item. */ @@ -229,6 +230,11 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, gboolean draw_start_triangle = FALSE, draw_end_triangle = FALSE; GdkRectangle clip_rect; GdkColor bg_color; + cairo_t *cr; + cairo_pattern_t *pat; + guint16 red, green, blue; + gdouble radius, cx0, cy0, rect_height, rect_width; + gdouble cc = 65535.0; #if 0 g_print ("In e_week_view_event_item_draw %i,%i %ix%i\n", @@ -239,6 +245,8 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, week_view = E_WEEK_VIEW (GTK_WIDGET (canvas_item->canvas)->parent); g_return_if_fail (E_IS_WEEK_VIEW (week_view)); + cr = gdk_cairo_create (drawable); + if (wveitem->event_num == -1 || wveitem->span_num == -1) return; @@ -284,26 +292,66 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD + 1; 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; - + if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), event->comp_data), &bg_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); - else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); - } else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); - gdk_draw_rectangle (drawable, gc, TRUE, rect_x, y1 + 1, rect_w, y2 - y1 - 1); - - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); - gdk_draw_line (drawable, gc, rect_x, y1 + 1, rect_x + rect_w, y1 + 1); - gdk_draw_line (drawable, gc, rect_x, y2, rect_x + rect_w, y2); - gdk_draw_line (drawable, gc, rect_x, y1 + 1, rect_x, y1 + (y2 - (y1 + 1))); - gdk_draw_line (drawable, gc, rect_x + rect_w, y1 + 1, rect_x + rect_w, y1 + (y2 - (y1 + 1))); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + red = bg_color.red; + green = bg_color.green; + blue = bg_color.blue; + } else { + red = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].red; + green = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].blue; + } + } else { + red = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + green = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + } + + /* Here we draw the border around the event*/ + cairo_save (cr); + + cx0 = rect_x; + cy0 = y1 + 1; + rect_width = rect_w; + rect_height = y2 - y1 - 1; + + radius = 12; + + draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, red/cc, green/cc, blue/cc); + cairo_stroke (cr); + cairo_restore (cr); + + /* Fill it in the Event */ + + cairo_save (cr); + + cx0 = rect_x + 2; + cy0 = y1 + 2.75; + rect_width = rect_w - 3.5; + rect_height = y2 - y1 - 4.5; + + radius = 6; + + 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, red/cc, green/cc, blue/cc, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0, red/cc, green/cc, blue/cc, 0.4); + cairo_set_source (cr, pat); + cairo_fill (cr); + cairo_pattern_destroy (pat); + cairo_restore (cr); /* Draw the start and end times, as required. */ switch (week_view->time_format) { @@ -375,35 +423,94 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, rect_w -= 2; } + cairo_save (cr); if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), event->comp_data), &bg_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); - else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); - } else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); - gdk_draw_rectangle (drawable, gc, TRUE, rect_x, y1 + 1, rect_w, y2 - y1 - 1); - - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + red = bg_color.red; + green = bg_color.green; + blue = bg_color.blue; + } else { + red = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].red; + green = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].blue; + } + } else { + red = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + green = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green; + } + + /* 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; + + draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, red/cc, green/cc, blue/cc); + cairo_stroke (cr); + cairo_restore (cr); + + /* Here we fill it in the event*/ + + cairo_save (cr); + cx0 = rect_x + 2; + cy0 = y1 + 2.75; + rect_width = rect_w - 3.5; + rect_height = y2 - y1 - 4.5; + + radius = 6; + + draw_curved_rectangle (cr, cx0, cy0, rect_width, rect_height, radius); + + pat = cairo_pattern_create_linear (rect_x + 1, y1 + 1, + rect_x + 1, y2); + cairo_pattern_add_color_stop_rgba (pat, 1, red/cc, green/cc, blue/cc, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0, red/cc, green/cc, blue/cc, 0.4); + cairo_set_source (cr, pat); + cairo_fill_preserve (cr); + cairo_pattern_destroy (pat); + cairo_restore (cr); + + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); rect_x2 = rect_x + rect_w - 1; - gdk_draw_line (drawable, gc, rect_x, y1, rect_x2, y1); - gdk_draw_line (drawable, gc, rect_x, y2, rect_x2, y2); + cairo_move_to (cr, rect_x, y1); + cairo_line_to (cr, rect_x2, y1); + cairo_move_to (cr, rect_x, y2); + cairo_line_to (cr, rect_x2, y2); if (draw_start_triangle) { e_week_view_event_item_draw_triangle (wveitem, drawable, x1 + E_WEEK_VIEW_EVENT_L_PAD + 2, y1, -3, y2 - y1 + 1); } else { - gdk_draw_line (drawable, gc, rect_x, y1, rect_x, y2); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, rect_x, y1); + cairo_line_to (cr, rect_x, y2); + cairo_stroke (cr); + cairo_restore (cr); } if (draw_end_triangle) { e_week_view_event_item_draw_triangle (wveitem, drawable, x2 - E_WEEK_VIEW_EVENT_R_PAD - 2, y1, 3, y2 - y1 + 1); } else { - gdk_draw_line (drawable, gc, rect_x2, y1, rect_x2, y2); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, rect_x2, y2); + cairo_line_to (cr, rect_x2, y2); + cairo_stroke (cr); + cairo_restore (cr); } if (span->text_item && E_TEXT (span->text_item)->editing) @@ -480,6 +587,7 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, max_icon_x, TRUE); } } + cairo_destroy (cr); } @@ -542,7 +650,7 @@ e_week_view_draw_time (EWeekView *week_view, time_x, time_y_small_font, layout); - + pango_layout_set_font_description (layout, style->font_desc); time_x += week_view->small_digit_width * 2; @@ -550,6 +658,7 @@ e_week_view_draw_time (EWeekView *week_view, /* Draw the 'am'/'pm' suffix, if 12-hour format. */ if (!e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (week_view))) { pango_layout_set_text (layout, suffix, -1); + gdk_draw_layout (drawable, gc, time_x, time_y_normal_font, @@ -574,7 +683,6 @@ e_week_view_draw_time (EWeekView *week_view, } } - g_object_unref (layout); } @@ -595,6 +703,7 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE; gboolean draw_timezone_icon = FALSE, draw_attach_icon = FALSE; GSList *categories_list, *elem; + cairo_t *cr; week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent); @@ -604,6 +713,7 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); gc = week_view->main_gc; + cr = gdk_cairo_create (drawable); if (e_cal_component_has_alarms (comp)) { draw_reminder_icon = TRUE; @@ -642,50 +752,36 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, icon_x -= icon_x_inc * num_icons; if (draw_reminder_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - week_view->reminder_icon, - 0, 0, icon_x, icon_y, - E_WEEK_VIEW_ICON_WIDTH, - E_WEEK_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, week_view->reminder_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; } if (draw_attach_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - week_view->attach_icon, - 0, 0, icon_x, icon_y, - E_WEEK_VIEW_ICON_WIDTH, - E_WEEK_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, week_view->attach_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); + icon_x += icon_x_inc; } if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - week_view->recurrence_icon, - 0, 0, icon_x, icon_y, - E_WEEK_VIEW_ICON_WIDTH, - E_WEEK_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, week_view->recurrence_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); icon_x += icon_x_inc; } if (draw_timezone_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { - gdk_gc_set_clip_mask (gc, NULL); - gdk_draw_pixbuf (drawable, gc, - week_view->timezone_icon, - 0, 0, icon_x, icon_y, - E_WEEK_VIEW_ICON_WIDTH, - E_WEEK_VIEW_ICON_HEIGHT, - GDK_RGB_DITHER_NORMAL, - 0, 0); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, week_view->timezone_icon, icon_x, icon_y); + cairo_paint (cr); + cairo_restore (cr); icon_x += icon_x_inc; } @@ -738,6 +834,7 @@ e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem, GdkColor bg_color; GdkPoint points[3]; gint c1, c2; + cairo_t *cr; week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent); @@ -745,6 +842,7 @@ e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem, wveitem->event_num); gc = week_view->main_gc; + cr = gdk_cairo_create (drawable); points[0].x = x; points[0].y = y; @@ -759,16 +857,29 @@ e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem, GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) - gdk_gc_set_foreground (gc, &bg_color); - else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); - } else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + gdk_cairo_set_source_color (cr, &bg_color); + } + else { + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); + + } + } else { + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]); + } - gdk_draw_polygon (drawable, gc, TRUE, points, 3); + cairo_save (cr); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, points[0].x, points[0].y); + cairo_line_to (cr, points[1].x, points[1].y); + cairo_line_to (cr, points[2].x, points[2].y); + cairo_line_to (cr, points[0].x, points[0].y); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]); /* If the height is odd we can use the same central point for both lines. If it is even we use different end-points. */ @@ -776,8 +887,14 @@ e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem, if (h % 2 == 0) c1--; - gdk_draw_line (drawable, gc, x, y, x + w, c1); - gdk_draw_line (drawable, gc, x, y + h - 1, x + w, c2); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x + w, c1); + cairo_move_to (cr, x, y + h - 1); + cairo_line_to (cr, x + w, c2); + cairo_restore (cr); + + cairo_destroy (cr); } diff --git a/calendar/gui/e-week-view-main-item.c b/calendar/gui/e-week-view-main-item.c index ca6812b463..32ac8546aa 100644 --- a/calendar/gui/e-week-view-main-item.c +++ b/calendar/gui/e-week-view-main-item.c @@ -210,6 +210,7 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, PangoFontMetrics *font_metrics; PangoLayout *layout; gboolean today = FALSE; + cairo_t *cr; #if 0 g_print ("Drawing Day:%i at %i,%i\n", day, x, y); @@ -217,6 +218,7 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, week_view = wvmitem->week_view; style = gtk_widget_get_style (GTK_WIDGET (week_view)); gc = week_view->main_gc; + cr = gdk_cairo_create (drawable); /* Set up Pango prerequisites */ font_desc = style->font_desc; @@ -238,13 +240,16 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, month starts (defaults are white for odd - January, March, ... and light gray for even). In the week view the background is always the same color, the color used for the odd months in the month view. */ - if (week_view->multi_week_view && (month % 2 == 0)) + if (week_view->multi_week_view && (month % 2 == 0)) bg_color = &week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS]; - else + else bg_color = &week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS]; - gdk_gc_set_foreground (gc, bg_color); - gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height); + cairo_save (cr); + gdk_cairo_set_source_color (cr, bg_color); + cairo_rectangle (cr, x, y, width, height); + cairo_fill (cr); + cairo_restore (cr); /* Draw the lines on the right and bottom of the cell. The canvas is sized so that the lines on the right & bottom edges will be off the @@ -252,37 +257,44 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, right_edge = x + width - 1; bottom_edge = y + height - 1; - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); - gdk_draw_line (drawable, gc, - right_edge, y, right_edge, bottom_edge); - gdk_draw_line (drawable, gc, - x, bottom_edge, right_edge, bottom_edge); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, right_edge, y); + cairo_line_to (cr, right_edge, bottom_edge); + cairo_move_to (cr, x, bottom_edge); + cairo_line_to (cr, right_edge, bottom_edge); + cairo_stroke (cr); + cairo_restore (cr); /* If the day is selected, draw the blue background. */ + cairo_save (cr); selected = TRUE; if (week_view->selection_start_day == -1 || week_view->selection_start_day > day || week_view->selection_end_day < day) selected = FALSE; if (selected) { - if (GTK_WIDGET_HAS_FOCUS (week_view)) - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED]); - else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED_UNFOCUSSED]); - - if (week_view->multi_week_view) { - gdk_draw_rectangle (drawable, gc, TRUE, - x + 2, y + 1, + if (GTK_WIDGET_HAS_FOCUS (week_view)) { + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED]); + } else { + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED]); + } + + if (week_view->multi_week_view) { + cairo_rectangle (cr, x + 2, y + 1, width - 5, E_WEEK_VIEW_DATE_T_PAD - 1 + - PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) + - PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics))); + PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) + + PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics))); + cairo_fill (cr); } else { - gdk_draw_rectangle (drawable, gc, TRUE, - x + 2, y + 1, - width - 5, line_y - y); + cairo_rectangle (cr, x + 2, y + 1, + width - 5, line_y - y); + cairo_fill (cr); } - } + } + cairo_restore (cr); /* Display the date in the top of the cell. In the week view, display the long format "10 January" in all cells, @@ -335,8 +347,9 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, format_string = _("%d %b"); } + cairo_save (cr); if (selected) { - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]); } else if (week_view->multi_week_view) { struct icaltimetype tt; @@ -346,45 +359,58 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, if (g_date_year (date) == tt.year && g_date_month (date) == tt.month && g_date_day (date) == tt.day) { - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_TODAY]); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_TODAY]); today = TRUE; } - else - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); + else { + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); + + } } else { - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); } if (today) { g_date_strftime (buffer, sizeof (buffer), format_string ? format_string : "%d", date); - layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), buffer); + pango_cairo_update_context (cr, pango_context); + layout = pango_cairo_create_layout (cr); + pango_font_description_set_size (font_desc, 10 * PANGO_SCALE); + pango_layout_set_font_description (layout, font_desc); + pango_layout_set_text (layout, buffer, -1); pango_layout_set_markup (layout, buffer, strlen(buffer)); } else { g_date_strftime (buffer, sizeof (buffer), format_string ? format_string : "%d", date); - layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), buffer); + pango_cairo_update_context (cr, pango_context); + layout = pango_cairo_create_layout (cr); + pango_font_description_set_size (font_desc, 10 * PANGO_SCALE); + pango_layout_set_font_description (layout, font_desc); + pango_layout_set_text (layout, buffer, -1); } pango_layout_get_pixel_size (layout, &date_width, NULL); date_x = x + width - date_width - E_WEEK_VIEW_DATE_R_PAD; date_x = MAX (date_x, x + 1); - gdk_draw_layout (drawable, gc, - date_x, - y + E_WEEK_VIEW_DATE_T_PAD, - layout); + cairo_translate (cr, date_x, y + E_WEEK_VIEW_DATE_T_PAD); + pango_cairo_update_layout (cr, layout); + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); g_object_unref (layout); /* Draw the line under the date. */ if (!week_view->multi_week_view) { - gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); - gdk_draw_line (drawable, gc, - x + E_WEEK_VIEW_DATE_LINE_L_PAD, line_y, - right_edge, line_y); + cairo_save (cr); + gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); + cairo_set_line_width (cr, 0.7); + cairo_move_to (cr, x + E_WEEK_VIEW_DATE_LINE_L_PAD, line_y); + cairo_line_to (cr, right_edge, line_y); + cairo_stroke (cr); + cairo_restore (cr); } - pango_font_metrics_unref (font_metrics); + cairo_destroy (cr); } -- cgit v1.2.3