From 780bebf8719fbb154e79d7499c565746784beac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Thu, 18 Dec 2014 19:58:13 -0500 Subject: [PATCH] month-view: optimize text direction query By keeping the value of the direction factor k around we save code and function calling every time we need to use it. --- src/gcal-month-view.c | 150 ++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 93 deletions(-) diff --git a/src/gcal-month-view.c b/src/gcal-month-view.c index 3dabf6d3..181349ce 100644 --- a/src/gcal-month-view.c +++ b/src/gcal-month-view.c @@ -79,6 +79,9 @@ typedef struct gint start_mark_cell; gint end_mark_cell; + /* text direction factors */ + gint k; + /* property */ icaltimetype *date; GcalManager *manager; /* weak reference */ @@ -150,6 +153,9 @@ static gboolean gcal_month_view_motion_notify_event (GtkWidget *wid static gboolean gcal_month_view_button_release (GtkWidget *widget, GdkEventButton *event); +static void gcal_month_view_direction_changed (GtkWidget *widget, + GtkTextDirection previous_direction); + static void gcal_month_view_add (GtkContainer *constainer, GtkWidget *widget); @@ -344,6 +350,7 @@ gcal_month_view_class_init (GcalMonthViewClass *klass) widget_class->button_press_event = gcal_month_view_button_press; widget_class->motion_notify_event = gcal_month_view_motion_notify_event; widget_class->button_release_event = gcal_month_view_button_release; + widget_class->direction_changed = gcal_month_view_direction_changed; container_class = GTK_CONTAINER_CLASS (klass); container_class->add = gcal_month_view_add; @@ -377,6 +384,11 @@ gcal_month_view_init (GcalMonthView *self) gtk_style_context_add_class ( gtk_widget_get_style_context (GTK_WIDGET (self)), "calendar-view"); + + if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_LTR) + priv->k = 0; + else if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL) + priv->k = 1; } static void @@ -575,8 +587,7 @@ gcal_month_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GcalMonthViewPrivate *priv; - gint i, j; - gint sw, k; + gint i, j, sw; gint padding_bottom; PangoLayout *layout; @@ -640,18 +651,7 @@ gcal_month_view_size_allocate (GtkWidget *widget, size_left[i] = vertical_cell_space; shown_rows = ceil ((priv->days_delay + icaltime_days_in_month (priv->date->month, priv->date->year)) / 7.0); - - /* orientation factors */ /* FIXME: replace with direction-changed signal handler */ - if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR) - { - sw = 1; - k = 0; - } - else if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) - { - sw = -1; - k = 1; - } + sw = 1 - 2 * priv->k; /* allocate multidays events */ for (l = priv->multiday_children; l != NULL; l = g_list_next (l)) @@ -675,14 +675,14 @@ gcal_month_view_size_allocate (GtkWidget *widget, if (date->month == priv->date->month) j = date->day; j += priv->days_delay; - first_cell = 7 * ((j - 1) / 7)+ 6 * k + sw * ((j - 1) % 7); + first_cell = 7 * ((j - 1) / 7)+ 6 * priv->k + sw * ((j - 1) % 7); j = icaltime_days_in_month (priv->date->month, priv->date->year); date = gcal_event_widget_peek_end_date (GCAL_EVENT_WIDGET (child_widget)); if (date->month == priv->date->month) j = date->day; j += priv->days_delay; - last_cell = 7 * ((j - 1) / 7)+ 6 * k + sw * ((j - 1) % 7); + last_cell = 7 * ((j - 1) / 7)+ 6 * priv->k + sw * ((j - 1) % 7); /* FIXME missing mark widgets with continuos tags */ @@ -693,8 +693,8 @@ gcal_month_view_size_allocate (GtkWidget *widget, lengths = g_array_sized_new (TRUE, TRUE, sizeof (gint), 16); for (i = first_row; i <= last_row && visible; i++) { - start = i * 7 + k * 6; - end = i * 7 + (1 - k) * 6; + start = i * 7 + priv->k * 6; + end = i * 7 + (1 - priv->k) * 6; if (i == first_row) { @@ -765,7 +765,7 @@ gcal_month_view_size_allocate (GtkWidget *widget, { j = GPOINTER_TO_INT (key); j += priv->days_delay; - i = 7 * ((j - 1) / 7)+ 6 * k + sw * ((j - 1) % 7); + i = 7 * ((j - 1) / 7)+ 6 * priv->k + sw * ((j - 1) % 7); l = (GList*) value; for (aux = l; aux != NULL; aux = g_list_next (aux)) @@ -838,9 +838,7 @@ gcal_month_view_draw (GtkWidget *widget, gint shown_rows; gdouble first_row_gap = 0.0; - gint i, j; - gint sw; - gint k; + gint i, j, sw; gint lower_mark = 43; gint upper_mark = -2; @@ -867,24 +865,13 @@ gcal_month_view_draw (GtkWidget *widget, shown_rows = ceil (days / 7.0); first_row_gap = (6 - shown_rows) * 0.5; /* invalid area before the actual rows */ - - /* orientation factors */ - if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR) - { - sw = 1; - k = 0; - } - else if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) - { - sw = -1; - k = 1; - } + sw = 1 - 2 * priv->k; /* active cells */ if (priv->start_mark_cell != -1 && priv->end_mark_cell != -1) { - lower_mark = 7 * ((priv->start_mark_cell + 7 * k) / 7) + sw * (priv->start_mark_cell % 7) + (1 - k); - upper_mark = 7 * ((priv->end_mark_cell + 7 * k) / 7) + sw * (priv->end_mark_cell % 7) + (1 - k); + lower_mark = 7 * ((priv->start_mark_cell + 7 * priv->k) / 7) + sw * (priv->start_mark_cell % 7) + (1 - priv->k); + upper_mark = 7 * ((priv->end_mark_cell + 7 * priv->k) / 7) + sw * (priv->end_mark_cell % 7) + (1 - priv->k); if (lower_mark > upper_mark) { gint cell; @@ -907,13 +894,13 @@ gcal_month_view_draw (GtkWidget *widget, { gchar *upcased_day; - j = 6 * k + sw * i; + j = 6 * priv->k + sw * i; upcased_day = g_utf8_strup (gcal_get_weekday ((j + priv->first_weekday) % 7), -1); pango_layout_set_text (layout, upcased_day, -1); pango_layout_get_pixel_size (layout, &font_width, &font_height); gtk_render_layout (context, cr, - cell_width * (i + k) + (sw * padding.left) - k * font_width, + cell_width * (i + priv->k) + (sw * padding.left) - priv->k * font_width, start_grid_y - padding.bottom - font_height, layout); g_free (upcased_day); @@ -931,7 +918,7 @@ gcal_month_view_draw (GtkWidget *widget, gint column = i % 7; gint row = i / 7; - j = 7 * ((i + 7 * k) / 7) + sw * (i % 7) + (1 - k); + j = 7 * ((i + 7 * priv->k) / 7) + sw * (i % 7) + (1 - priv->k); if (j <= priv->days_delay) continue; else if (j > days) @@ -955,11 +942,11 @@ gcal_month_view_draw (GtkWidget *widget, /* FIXME: hardcoded padding of the number background */ gtk_render_background (context, cr, - cell_width * (column + 1 - k) - sw * padding.right + (k - 1) * font_width - 2.0, + cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) * font_width - 2.0, cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y, font_width + 4, font_height + 2); gtk_render_layout (context, cr, - cell_width * (column + 1 - k) - sw * padding.right + (k - 1) * font_width, + cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) * font_width, cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y, clayout); @@ -978,7 +965,7 @@ gcal_month_view_draw (GtkWidget *widget, pango_layout_get_pixel_size (layout, &font_width, &font_height); gtk_render_layout (context, cr, - cell_width * (column + 1 - k) - sw * padding.right + (k - 1) * font_width, + cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) * font_width, cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y, layout); @@ -991,7 +978,7 @@ gcal_month_view_draw (GtkWidget *widget, pango_layout_get_pixel_size (layout, &font_width, &font_height); gtk_render_layout (context, cr, - cell_width * (column + 1 - k) - sw * padding.right + (k - 1) * font_width, + cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) * font_width, cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y, layout); } @@ -1096,13 +1083,13 @@ gcal_month_view_draw (GtkWidget *widget, { if (i == first_row) { - pos_x = cell_width * (first_column + k); - end = (alloc.width * (1 - k)) - pos_x; + pos_x = cell_width * (first_column + priv->k); + end = (alloc.width * (1 - priv->k)) - pos_x; } else if (i == last_row) { - pos_x = cell_width * (last_column + 1 - k); - end = (alloc.width * k) - pos_x; + pos_x = cell_width * (last_column + 1 - priv->k); + end = (alloc.width * priv->k) - pos_x; } else { @@ -1135,28 +1122,16 @@ gcal_month_view_button_press (GtkWidget *widget, gint days; - gint j; - gint sw, k; + gint j, sw; priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (widget)); days = priv->days_delay + icaltime_days_in_month (priv->date->month, priv->date->year); - - /* orientation factors */ - if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR) - { - sw = 1; - k = 0; - } - else if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) - { - sw = -1; - k = 1; - } + sw = 1 - 2 * priv->k; priv->clicked_cell = get_cell_and_center_from_position (GCAL_MONTH_VIEW (widget), event->x, event->y, NULL, NULL); - j = 7 * ((priv->clicked_cell + 7 * k) / 7) + sw * (priv->clicked_cell % 7) + (1 - k); + j = 7 * ((priv->clicked_cell + 7 * priv->k) / 7) + sw * (priv->clicked_cell % 7) + (1 - priv->k); if (j > priv->days_delay && j <= days) priv->start_mark_cell = priv->clicked_cell; @@ -1185,8 +1160,7 @@ gcal_month_view_motion_notify_event (GtkWidget *widget, gint days; - gint j; - gint sw, k; + gint j, sw; gint new_end_cell; priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (widget)); @@ -1196,22 +1170,11 @@ gcal_month_view_motion_notify_event (GtkWidget *widget, return FALSE; days = priv->days_delay + icaltime_days_in_month (priv->date->month, priv->date->year); - - /* orientation factors */ - if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR) - { - sw = 1; - k = 0; - } - else if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) - { - sw = -1; - k = 1; - } + sw = 1 - 2 * priv->k; new_end_cell = get_cell_and_center_from_position (GCAL_MONTH_VIEW (widget), event->x, event->y, NULL, NULL); - j = 7 * ((new_end_cell + 7 * k) / 7) + sw * (new_end_cell % 7) + (1 - k); + j = 7 * ((new_end_cell + 7 * priv->k) / 7) + sw * (new_end_cell % 7) + (1 - priv->k); if (j > priv->days_delay && j <= days) { @@ -1233,8 +1196,7 @@ gcal_month_view_button_release (GtkWidget *widget, gint days; - gint j; - gint sw, k; + gint j, sw; gint released; gdouble x,y; @@ -1248,22 +1210,11 @@ gcal_month_view_button_release (GtkWidget *widget, return FALSE; days = priv->days_delay + icaltime_days_in_month (priv->date->month, priv->date->year); - - /* orientation factors */ - if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR) - { - sw = 1; - k = 0; - } - else if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) - { - sw = -1; - k = 1; - } + sw = 1 - 2 * priv->k; released = get_cell_and_center_from_position (GCAL_MONTH_VIEW (widget), event->x, event->y, &x, &y); - j = 7 * ((released + 7 * k) / 7) + sw * (released % 7) + (1 - k); + j = 7 * ((released + 7 * priv->k) / 7) + sw * (released % 7) + (1 - priv->k); if (j <= priv->days_delay || j > days) { @@ -1281,7 +1232,7 @@ gcal_month_view_button_release (GtkWidget *widget, gtk_widget_queue_draw (widget); start_date = gcal_dup_icaltime (priv->date); - start_date->day = 7 * ((priv->start_mark_cell + 7 * k) / 7) + sw * (priv->start_mark_cell % 7) + (1 - k); + start_date->day = 7 * ((priv->start_mark_cell + 7 * priv->k) / 7) + sw * (priv->start_mark_cell % 7) + (1 - priv->k); start_date->day -= priv->days_delay; start_date->is_date = 1; @@ -1312,6 +1263,19 @@ gcal_month_view_button_release (GtkWidget *widget, return TRUE; } +static void +gcal_month_view_direction_changed (GtkWidget *widget, + GtkTextDirection previous_direction) +{ + GcalMonthViewPrivate *priv; + priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (widget)); + + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) + priv->k = 0; + else if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) + priv->k = 1; +} + /** * gcal_month_view_add: * @container: