From ad3e37606d6d7fa4ac800b9dc4d405345516af64 Mon Sep 17 00:00:00 2001 From: Abdullahi Usman Date: Fri, 19 May 2017 21:01:07 +0100 Subject: [PATCH] month-view : adjust overflow layout and set it ellipsized at end. The overflow layout used to display "Other X events" text when there is no enough space to accomodate more events. This used to get mixed-up/overlapped with the date label because the overflow label uses whole cell width as width. We can fix this by substracting date label width from overflow label width to accomodate the date label. https://bugzilla.gnome.com/show_bug.cgi?id=7771581 https://bugzilla.gnome.org/show_bug.cgi?id=771581 --- src/views/gcal-month-view.c | 101 ++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c index b8a4f42d..1aba53d7 100644 --- a/src/views/gcal-month-view.c +++ b/src/views/gcal-month-view.c @@ -1625,56 +1625,6 @@ gcal_month_view_draw (GtkWidget *widget, nr_day = g_strdup_printf ("%d", j); - if (g_hash_table_contains (ppriv->overflow_cells, GINT_TO_POINTER (real_i))) - { - GList *l; - PangoLayout *overflow_layout; - PangoFontDescription *ofont_desc; - gchar *overflow_str; - gdouble y_value; - - l = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (real_i)); - - /* TODO: Warning: in some languages this string can be too long and may overlap with the number */ - overflow_str = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "Other event", "Other %d events", g_list_length (l)), - g_list_length (l)); - - gtk_style_context_save (context); - gtk_style_context_add_class (context, "overflow"); - if (self->hovered_overflow_indicator == real_i) - { - gtk_style_context_set_state (context, GTK_STATE_FLAG_PRELIGHT); - gtk_style_context_get (context, GTK_STATE_FLAG_PRELIGHT, "font", &ofont_desc, NULL); - } - else - { - gtk_style_context_get (context, state, "font", &ofont_desc, NULL); - } - - overflow_layout = gtk_widget_create_pango_layout (widget, overflow_str); - - pango_layout_set_font_description (overflow_layout, ofont_desc); - pango_layout_set_width (overflow_layout, pango_units_from_double (cell_width)); - pango_layout_set_alignment (overflow_layout, PANGO_ALIGN_CENTER); - pango_layout_get_pixel_size (overflow_layout, &font_width, &font_height); - y_value = cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y; - - if ((!gtk_widget_is_visible (self->overflow_popover) && self->hovered_overflow_indicator == real_i) || - gtk_widget_is_visible (self->overflow_popover)) - { - gtk_render_background (context, cr, cell_width * column, y_value - padding.bottom, - cell_width, font_height + padding.bottom * 2); - } - - gtk_render_layout (context, cr, cell_width * column + padding.left, y_value, overflow_layout); - - gtk_style_context_remove_class (context, "overflow"); - gtk_style_context_restore (context); - g_free (overflow_str); - pango_font_description_free (ofont_desc); - g_object_unref (overflow_layout); - } - if (self->date->year == g_date_time_get_year (today) && self->date->month == g_date_time_get_month (today) && j == g_date_time_get_day_of_month (today)) @@ -1741,6 +1691,57 @@ gcal_month_view_draw (GtkWidget *widget, } g_free (nr_day); + + if (g_hash_table_contains (ppriv->overflow_cells, GINT_TO_POINTER (real_i))) + { + GList *l; + PangoLayout *overflow_layout; + PangoFontDescription *ofont_desc; + gchar *overflow_str; + gdouble y_value; + + l = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (real_i)); + + /* TODO: Warning: in some languages this string can be too long and may overlap with the number */ + overflow_str = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "Other event", "Other %d events", g_list_length (l)), + g_list_length (l)); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, "overflow"); + if (self->hovered_overflow_indicator == real_i) + { + gtk_style_context_set_state (context, GTK_STATE_FLAG_PRELIGHT); + gtk_style_context_get (context, GTK_STATE_FLAG_PRELIGHT, "font", &ofont_desc, NULL); + } + else + { + gtk_style_context_get (context, state, "font", &ofont_desc, NULL); + } + + overflow_layout = gtk_widget_create_pango_layout (widget, overflow_str); + + pango_layout_set_font_description (overflow_layout, ofont_desc); + pango_layout_set_width (overflow_layout, pango_units_from_double (cell_width - (font_width + padding.right))); + pango_layout_set_alignment (overflow_layout, PANGO_ALIGN_CENTER); + pango_layout_set_ellipsize (overflow_layout, PANGO_ELLIPSIZE_END); + pango_layout_get_pixel_size (overflow_layout, &font_width, &font_height); + y_value = cell_height * (row + 1 + first_row_gap) - font_height - padding.bottom + start_grid_y; + + if ((!gtk_widget_is_visible (self->overflow_popover) && self->hovered_overflow_indicator == real_i) || + gtk_widget_is_visible (self->overflow_popover)) + { + gtk_render_background (context, cr, cell_width * column, y_value - padding.bottom, + cell_width, font_height + padding.bottom * 2); + } + + gtk_render_layout (context, cr, cell_width * column, y_value, overflow_layout); + + gtk_style_context_remove_class (context, "overflow"); + gtk_style_context_restore (context); + g_free (overflow_str); + pango_font_description_free (ofont_desc); + g_object_unref (overflow_layout); + } } pango_font_description_free (sfont_desc); pango_font_description_free (font_desc);