[evolution/clutter-calendar-v2] Paint Marcus bains & selection in different layers. It helps to avoid redraw. Its fast now.
- From: Srinivasa Ragavan <sragavan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/clutter-calendar-v2] Paint Marcus bains & selection in different layers. It helps to avoid redraw. Its fast now.
- Date: Tue, 31 Aug 2010 12:55:32 +0000 (UTC)
commit 50909bc6793170d2b949b80e1acce2334d159192
Author: Srinivasa Ragavan <sragavan gnome org>
Date: Tue Aug 31 18:22:22 2010 +0530
Paint Marcus bains & selection in different layers. It helps to avoid
redraw. Its fast now.
calendar/gui/e-day-view-clutter-main-item.c | 275 ++++++++++++++++++++-------
calendar/gui/e-day-view-clutter-time-item.c | 6 +-
calendar/gui/e-day-view.c | 30 ++--
3 files changed, 223 insertions(+), 88 deletions(-)
---
diff --git a/calendar/gui/e-day-view-clutter-main-item.c b/calendar/gui/e-day-view-clutter-main-item.c
index 31d99dd..a7bc785 100644
--- a/calendar/gui/e-day-view-clutter-main-item.c
+++ b/calendar/gui/e-day-view-clutter-main-item.c
@@ -49,6 +49,10 @@
struct _EDayViewClutterMainItemPrivate {
EDayView *day_view;
+#if HAVE_CLUTTER
+ ClutterActor *mb_line;
+ ClutterActor *selection_actor;
+#endif
};
enum {
@@ -997,6 +1001,146 @@ day_view_clutter_main_item_update (GnomeCanvasItem *item,
}
static void
+day_view_clutter_main_item_draw_marcus_bains (EDayViewClutterMainItem *canvas_item)
+{
+ EDayViewClutterMainItem *main_item;
+ EDayView *day_view;
+ cairo_t *cr;
+ gint grid_x1, grid_x2;
+ gint day;
+ gint x=0, y=0;
+
+ main_item = E_DAY_VIEW_CLUTTER_MAIN_ITEM (canvas_item);
+ day_view = e_day_view_clutter_main_item_get_day_view (main_item);
+
+
+ if (e_day_view_marcus_bains_get_show_line (day_view)) {
+ icaltimezone *zone;
+ struct icaltimetype time_now, day_start;
+ gint marcus_bains_y;
+ GdkColor mb_color;
+
+ zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
+ time_now = icaltime_current_time_with_zone (zone);
+
+ for (day = 0; day < day_view->days_shown; day++) {
+ day_start = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, zone);
+
+ if ((day_start.year == time_now.year) &&
+ (day_start.month == time_now.month) &&
+ (day_start.day == time_now.day)) {
+
+ grid_x1 = day_view->day_offsets[day] - x + E_DAY_VIEW_BAR_WIDTH;
+ grid_x2 = day_view->day_offsets[day + 1] - x - 1;
+
+ if (grid_x2-grid_x1 <= 0)
+ continue;
+ if (!main_item->priv->mb_line) {
+ main_item->priv->mb_line = clutter_cairo_texture_new (grid_x2-grid_x1, 5);
+ clutter_container_add_actor (day_view->main_canvas_stage, main_item->priv->mb_line);
+ }
+ clutter_cairo_texture_clear (main_item->priv->mb_line);
+ cr = clutter_cairo_texture_create (main_item->priv->mb_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_cairo_set_source_color (cr, &mb_color);
+ }
+
+ marcus_bains_y = (time_now.hour * 60 + time_now.minute) * day_view->row_height / day_view->mins_per_row - y;
+ cairo_set_line_width (cr, 1.5);
+ cairo_move_to (cr, 1, 1);
+ cairo_line_to (cr, grid_x2-grid_x1, 1);
+ cairo_stroke (cr);
+
+ cairo_restore (cr);
+ cairo_destroy (cr);
+ clutter_actor_set_position (main_item->priv->mb_line, grid_x1, marcus_bains_y);
+ clutter_actor_show (main_item->priv->mb_line);
+ }
+ }
+
+
+ }
+}
+
+static void
+day_view_clutter_main_item_draw_selection (EDayViewClutterMainItem *canvas_item)
+{
+ EDayViewClutterMainItem *main_item;
+ EDayView *day_view;
+ gint day;
+ gint start_row, end_row, rect_x, rect_y, rect_width, rect_height;
+ cairo_t *cr;
+ GdkRectangle rect;
+ guint width, height;
+ int x=0, y=0;
+ GdkRegion *draw_region;
+
+ main_item = E_DAY_VIEW_CLUTTER_MAIN_ITEM (canvas_item);
+ day_view = e_day_view_clutter_main_item_get_day_view (main_item);
+
+ clutter_cairo_texture_get_surface_size ((ClutterCairoTexture *)canvas_item, &width, &height);
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = width;
+ rect.height = height;
+ draw_region = gdk_region_rectangle (&rect);
+
+ if (!main_item->priv->selection_actor) {
+ main_item->priv->selection_actor = clutter_cairo_texture_new (width, height);
+ clutter_actor_set_opacity (main_item->priv->selection_actor, 155);
+ clutter_container_add_actor (day_view->main_canvas_stage, main_item->priv->selection_actor);
+ clutter_actor_show (main_item->priv->selection_actor);
+ clutter_actor_raise (main_item->priv->selection_actor, (ClutterActor *)canvas_item);
+ }
+
+ clutter_cairo_texture_clear (main_item->priv->selection_actor);
+ cr = clutter_cairo_texture_create (main_item->priv->selection_actor);
+
+ /* Paint the selection background. */
+ if (day_view->selection_start_day != -1
+ && !day_view->selection_in_top_canvas) {
+ for (day = day_view->selection_start_day;
+ day <= day_view->selection_end_day;
+ day++) {
+ if (day == day_view->selection_start_day
+ && day_view->selection_start_row != -1)
+ start_row = day_view->selection_start_row;
+ else
+ start_row = 0;
+ if (day == day_view->selection_end_day
+ && day_view->selection_end_row != -1)
+ end_row = day_view->selection_end_row;
+ else
+ end_row = day_view->rows - 1;
+
+ rect_x = day_view->day_offsets[day] - x;
+ rect_width = day_view->day_widths[day];
+ rect_y = start_row * day_view->row_height - y;
+ rect_height = (end_row - start_row + 1) * day_view->row_height;
+
+ 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[gtk_widget_has_focus (GTK_WIDGET (day_view)) ? E_DAY_VIEW_COLOR_BG_SELECTED : E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]);
+ cairo_rectangle (cr, rect_x, rect_y, rect_width, rect_height);
+ cairo_fill (cr);
+ cairo_restore (cr);
+ }
+ }
+ }
+
+ cairo_destroy (cr);
+ gdk_region_destroy (draw_region);
+}
+
+static void
day_view_clutter_main_item_draw (EDayViewClutterMainItem *canvas_item)
{
EDayViewClutterMainItem *main_item;
@@ -1087,37 +1231,8 @@ day_view_clutter_main_item_draw (EDayViewClutterMainItem *canvas_item)
}
}
- /* Paint the selection background. */
- if (day_view->selection_start_day != -1
- && !day_view->selection_in_top_canvas) {
- for (day = day_view->selection_start_day;
- day <= day_view->selection_end_day;
- day++) {
- if (day == day_view->selection_start_day
- && day_view->selection_start_row != -1)
- start_row = day_view->selection_start_row;
- else
- start_row = 0;
- if (day == day_view->selection_end_day
- && day_view->selection_end_row != -1)
- end_row = day_view->selection_end_row;
- else
- end_row = day_view->rows - 1;
-
- rect_x = day_view->day_offsets[day] - x;
- rect_width = day_view->day_widths[day];
- rect_y = start_row * day_view->row_height - y;
- rect_height = (end_row - start_row + 1) * day_view->row_height;
-
- 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[gtk_widget_has_focus (GTK_WIDGET (day_view)) ? E_DAY_VIEW_COLOR_BG_SELECTED : E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]);
- cairo_rectangle (cr, rect_x, rect_y, rect_width, rect_height);
- cairo_fill (cr);
- cairo_restore (cr);
- }
- }
- }
+ /* Draw the selection */
+ day_view_clutter_main_item_draw_selection (canvas_item);
/* Drawing the horizontal grid lines. */
grid_x1 = day_view->day_offsets[0] - x;
@@ -1192,44 +1307,9 @@ day_view_clutter_main_item_draw (EDayViewClutterMainItem *canvas_item)
width, height, day, draw_region);
#endif
- if (e_day_view_marcus_bains_get_show_line (day_view)) {
- icaltimezone *zone;
- struct icaltimetype time_now, day_start;
- gint marcus_bains_y;
- GdkColor mb_color;
-
- 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;
+ /* Draw the Marcus bains lines */
+ day_view_clutter_main_item_draw_marcus_bains (canvas_item);
- colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
- 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));
- time_now = icaltime_current_time_with_zone (zone);
-
- for (day = 0; day < day_view->days_shown; day++) {
- day_start = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, zone);
-
- if ((day_start.year == time_now.year) &&
- (day_start.month == time_now.month) &&
- (day_start.day == time_now.day)) {
-
- 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;
- 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);
gdk_region_destroy (draw_region);
}
@@ -1346,6 +1426,14 @@ e_day_view_clutter_main_item_set_day_view (EDayViewClutterMainItem *main_item,
void
e_day_view_clutter_main_item_set_size (EDayViewClutterMainItem *item, int width, int height)
{
+ if (item->priv->mb_line) {
+ clutter_actor_destroy(item->priv->mb_line);
+ item->priv->mb_line = NULL;
+ }
+ if (item->priv->selection_actor) {
+ clutter_actor_destroy (item->priv->selection_actor);
+ item->priv->selection_actor = NULL;
+ }
clutter_cairo_texture_set_surface_size ((ClutterCairoTexture *)item, width, height);
clutter_cairo_texture_clear ((ClutterCairoTexture *)item);
day_view_clutter_main_item_draw (item);
@@ -1354,6 +1442,14 @@ e_day_view_clutter_main_item_set_size (EDayViewClutterMainItem *item, int width,
void
e_day_view_clutter_main_item_redraw (EDayViewClutterMainItem *item)
{
+ if (item->priv->mb_line) {
+ clutter_actor_destroy(item->priv->mb_line);
+ item->priv->mb_line = NULL;
+ }
+ if (item->priv->selection_actor) {
+ clutter_actor_destroy (item->priv->selection_actor);
+ item->priv->selection_actor = NULL;
+ }
clutter_cairo_texture_clear ((ClutterCairoTexture *)item);
day_view_clutter_main_item_draw (item);
}
@@ -1361,11 +1457,52 @@ e_day_view_clutter_main_item_redraw (EDayViewClutterMainItem *item)
void
e_day_view_clutter_main_item_update_marcus_bains (EDayViewClutterMainItem *item)
{
+ EDayViewClutterMainItem *main_item;
+ EDayView *day_view;
+ cairo_t *cr;
+ gint grid_x1, grid_x2;
+ gint day;
+ gint x=0, y=0;
+
+ main_item = E_DAY_VIEW_CLUTTER_MAIN_ITEM (item);
+ day_view = e_day_view_clutter_main_item_get_day_view (main_item);
+
+ if (e_day_view_marcus_bains_get_show_line (day_view)) {
+ icaltimezone *zone;
+ struct icaltimetype time_now, day_start;
+ gint marcus_bains_y;
+
+ zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
+ time_now = icaltime_current_time_with_zone (zone);
+
+ for (day = 0; day < day_view->days_shown; day++) {
+ day_start = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, zone);
+
+ if ((day_start.year == time_now.year) &&
+ (day_start.month == time_now.month) &&
+ (day_start.day == time_now.day)) {
+
+ grid_x1 = day_view->day_offsets[day] - x + E_DAY_VIEW_BAR_WIDTH;
+
+ if (grid_x2-grid_x1 <= 0)
+ continue;
+
+ marcus_bains_y = (time_now.hour * 60 + time_now.minute) * day_view->row_height / day_view->mins_per_row - y;
+ clutter_actor_animate (main_item->priv->mb_line,
+ CLUTTER_LINEAR, 200,
+ "y", (float) marcus_bains_y,
+ "x", (float) grid_x1,
+ NULL);
+ }
+ }
+
+
+ }
}
void
e_day_view_clutter_main_item_update_selection (EDayViewClutterMainItem *item)
{
-
+ day_view_clutter_main_item_draw_selection (item);
}
diff --git a/calendar/gui/e-day-view-clutter-time-item.c b/calendar/gui/e-day-view-clutter-time-item.c
index d045979..e2cbea8 100644
--- a/calendar/gui/e-day-view-clutter-time-item.c
+++ b/calendar/gui/e-day-view-clutter-time-item.c
@@ -69,10 +69,10 @@ struct _EDayViewClutterTimeItemPrivate {
/* The second timezone if shown, or else NULL. */
guint second_zone_changed_id;
icaltimezone *second_zone;
-
- gdouble line_width;
+#if HAVE_CLUTTER
ClutterActor *mb_line;
ClutterActor *mb_line_alt;
+#endif
};
static void e_day_view_clutter_time_item_draw (ClutterActor *item);
@@ -369,8 +369,6 @@ edvti_draw_zone (ClutterActor *canvas_item,
day_view = e_day_view_clutter_time_item_get_day_view (time_item);
g_return_if_fail (day_view != NULL);
- time_item->priv->line_width = 2;
-
model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
style = gtk_widget_get_style (GTK_WIDGET (day_view));
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index b37eedc..cda4f93 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -2088,7 +2088,7 @@ e_day_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
return FALSE;
@@ -2118,7 +2118,7 @@ e_day_view_focus_out (GtkWidget *widget, GdkEventFocus *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
return FALSE;
@@ -3192,7 +3192,7 @@ e_day_view_marcus_bains_update (EDayView *day_view)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_marcus_bains ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
e_day_view_clutter_time_item_update ((EDayViewClutterTimeItem *)day_view->time_canvas_actor);
}
#endif
@@ -4482,7 +4482,7 @@ e_day_view_start_selection (EDayView *day_view,
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -4534,7 +4534,7 @@ e_day_view_update_selection (EDayView *day_view,
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -5904,7 +5904,7 @@ e_day_view_change_duration_to_start_of_work_day (EDayView *day_view)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -5947,7 +5947,7 @@ e_day_view_change_duration_to_end_of_work_day (EDayView *day_view)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -5984,7 +5984,7 @@ e_day_view_cursor_key_up_shifted (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6274,7 +6274,7 @@ e_day_view_cursor_key_down_shifted (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6306,7 +6306,7 @@ e_day_view_cursor_key_left_shifted (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6338,7 +6338,7 @@ e_day_view_cursor_key_right_shifted (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6378,7 +6378,7 @@ e_day_view_cursor_key_up (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6418,7 +6418,7 @@ e_day_view_cursor_key_down (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6442,7 +6442,7 @@ e_day_view_cursor_key_left (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
@@ -6468,7 +6468,7 @@ e_day_view_cursor_key_right (EDayView *day_view, GdkEventKey *event)
gtk_widget_queue_draw (day_view->main_canvas);
#if HAVE_CLUTTER
} else {
- e_day_view_clutter_main_item_redraw ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
+ e_day_view_clutter_main_item_update_selection ((EDayViewClutterMainItem *)day_view->main_canvas_actor);
}
#endif
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]