diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c index 2aca228f..55bdbd3c 100644 --- a/src/views/gcal-week-grid.c +++ b/src/views/gcal-week-grid.c @@ -375,6 +375,8 @@ gcal_week_grid_draw (GtkWidget *widget, GtkBorder padding; GdkRGBA color; + gboolean ltr; + gdouble x, column_width; gint i, width, height, today_column; PangoLayout *layout; @@ -383,6 +385,7 @@ gcal_week_grid_draw (GtkWidget *widget, self = GCAL_WEEK_GRID (widget); context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); + ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL; gtk_style_context_add_class (context, "hours"); gtk_style_context_get_color (context, state, &color); @@ -395,6 +398,7 @@ gcal_week_grid_draw (GtkWidget *widget, width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); + column_width = width / 7.0; cairo_set_line_width (cr, 0.65); @@ -405,6 +409,7 @@ gcal_week_grid_draw (GtkWidget *widget, { g_autoptr (GDateTime) now; GtkBorder margin; + gdouble strip_width; guint minutes_from_midnight; gint min_stip_height; @@ -417,11 +422,18 @@ gcal_week_grid_draw (GtkWidget *widget, gtk_style_context_get (context, state, "min-height", &min_stip_height, NULL); gtk_style_context_get_margin (context, state, &margin); + strip_width = column_width - margin.left - margin.right; + + if (ltr) + x = today_column * column_width + margin.left; + else + x = width - (today_column * column_width + margin.right) - strip_width; + gtk_render_background (context, cr, - today_column * width / 7.0 + margin.left, + x, round (minutes_from_midnight * ((gdouble) height / MINUTES_PER_DAY) + margin.top), - width / 7.0 - margin.left - margin.right, + strip_width, MAX (1, min_stip_height - margin.top - margin.bottom)); gtk_style_context_restore (context); @@ -430,7 +442,12 @@ gcal_week_grid_draw (GtkWidget *widget, /* Vertical lines */ for (i = 0; i < 7; i++) { - cairo_move_to (cr, ALIGNED (((width) / 7.0) * i), 0); + if (ltr) + x = column_width * i; + else + x = width - column_width * i; + + cairo_move_to (cr, ALIGNED (x), 0); cairo_rel_line_to (cr, 0, height); } @@ -475,9 +492,11 @@ gcal_week_grid_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GcalWeekGrid *self = GCAL_WEEK_GRID (widget); + gboolean ltr; gdouble minutes_height; gdouble column_width; guint i; + guint x; /* No need to relayout stuff if nothing changed */ if (allocation->height == gtk_widget_get_allocated_height (widget) && @@ -490,6 +509,8 @@ gcal_week_grid_size_allocate (GtkWidget *widget, /* Allocate the widget */ gtk_widget_set_allocation (widget, allocation); + ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL; + if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (self->event_window, @@ -550,8 +571,13 @@ gcal_week_grid_size_allocate (GtkWidget *widget, width = column_width / events_at_range - margin.left - margin.right; height = MAX ((data->end - data->start) * minutes_height - margin.top - margin.bottom, natural_height); + if (ltr) + x = column_width * i + allocation->x + margin.left + 1; + else + x = allocation->width - width - (column_width * i + allocation->x + margin.left + 1); + /* Setup the child position and size */ - child_allocation.x = column_width * i + allocation->x + margin.left + 1; + child_allocation.x = x; child_allocation.y = (data->start % MINUTES_PER_DAY) * minutes_height + margin.top; child_allocation.width = width; child_allocation.height = height; diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index 73593b68..22962ba1 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -1028,19 +1028,25 @@ gcal_week_header_draw (GtkWidget *widget, gint i, font_height, current_cell, today_column; gint start_x, start_y; + gboolean ltr; + cairo_save (cr); /* Fonts and colour selection */ self = GCAL_WEEK_HEADER (widget); context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); + ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL; - start_x = gtk_widget_get_allocated_width (self->expand_button_box); + start_x = ltr ? gtk_widget_get_allocated_width (self->expand_button_box) : 0; start_y = gtk_widget_get_allocated_height (self->header_labels_box); gtk_style_context_get_padding (context, state, &padding); gtk_widget_get_allocation (widget, &alloc); + if (!ltr) + alloc.width -= gtk_widget_get_allocated_width (self->expand_button_box); + gtk_style_context_get_color (context, state, &color); gdk_cairo_set_source_rgba (cr, &color); @@ -1070,6 +1076,8 @@ gcal_week_header_draw (GtkWidget *widget, for (i = 0; i < 7; i++) { gchar *weekday_date, *weekday_abv; + gdouble x; + gint font_width; gint n_day; n_day = g_date_time_get_day_of_month (week_start) + i; @@ -1090,9 +1098,16 @@ gcal_week_header_draw (GtkWidget *widget, pango_layout_set_font_description (layout, bold_font); pango_layout_set_text (layout, weekday_date, -1); + pango_layout_get_pixel_size (layout, &font_width, NULL); + + if (ltr) + x = padding.left + cell_width * i + COLUMN_PADDING + start_x; + else + x = alloc.width - (cell_width * i + font_width + COLUMN_PADDING + start_x); + gtk_render_layout (context, cr, - padding.left + cell_width * i + COLUMN_PADDING+ start_x, + x, font_height + padding.bottom + start_y, layout); @@ -1111,9 +1126,16 @@ gcal_week_header_draw (GtkWidget *widget, pango_layout_set_font_description (layout, bold_font); pango_layout_set_text (layout, weekday_abv, -1); + pango_layout_get_pixel_size (layout, &font_width, NULL); + + if (ltr) + x = padding.left + cell_width * i + COLUMN_PADDING + start_x; + else + x = alloc.width - (cell_width * i + font_width + COLUMN_PADDING + start_x); + gtk_render_layout (context, cr, - padding.left + cell_width * i + COLUMN_PADDING + start_x, + x, start_y, layout); @@ -1129,7 +1151,7 @@ gcal_week_header_draw (GtkWidget *widget, cairo_set_line_width (cr, 0.25); cairo_move_to (cr, - ALIGNED (cell_width * i + start_x), + ALIGNED (ltr ? (cell_width * i + start_x) : (alloc.width - (cell_width * i + start_x))), font_height + padding.bottom + start_y); cairo_rel_line_to (cr, diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 93044dca..85aff04f 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -370,13 +370,16 @@ gcal_week_view_draw_hours (GcalWeekView *self, GtkBorder padding; GdkRGBA color; + gboolean ltr; gint i, width, height; + gint font_width; PangoLayout *layout; PangoFontDescription *font_desc; context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); + ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL; gtk_style_context_add_class (context, "hours"); gtk_style_context_get_color (context, state, &color); @@ -399,18 +402,21 @@ gcal_week_view_draw_hours (GcalWeekView *self, if (self->use_24h_format) { hours = g_strdup_printf ("%02d:00", i); - pango_layout_set_text (layout, hours, -1); } else { hours = g_strdup_printf ("%d %s", i % 12 == 0 ? 12 : i % 12, i > 12 ? _("PM") : _("AM")); - - pango_layout_set_text (layout, hours, -1); } - cairo_move_to (cr, padding.left, (height / 24) * i + padding.top); + pango_layout_set_text (layout, hours, -1); + pango_layout_get_pixel_size (layout, &font_width, NULL); + + cairo_move_to (cr, + ltr ? padding.left : width - font_width - padding.right, + (height / 24) * i + padding.top); + pango_cairo_show_layout (cr, layout); g_free (hours); @@ -418,6 +424,12 @@ gcal_week_view_draw_hours (GcalWeekView *self, cairo_set_line_width (cr, 0.65); + if (!ltr) + { + cairo_move_to (cr, 0.5, 0); + cairo_rel_line_to (cr, 0, height); + } + /* Draws the horizontal complete lines */ for (i = 1; i < 24; i++) {