[gnome-calendar/gnome-3-24] event-widget: assign display-text in appropriate format to event-widget
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gnome-3-24] event-widget: assign display-text in appropriate format to event-widget
- Date: Thu, 23 Mar 2017 22:59:00 +0000 (UTC)
commit 6aa413b07e6d2e15a0a3f8e812623ff000e223df
Author: Yash Singh <yashdev10p gmail com>
Date: Thu Mar 23 11:44:35 2017 +0530
event-widget: assign display-text in appropriate format to event-widget
Earlier the height of event-widget with duration of 30 mins or less exceeded
the desired space in week-grid. As height available was not checked beforehand,
this resulted in some event-widgets getting height assigned which was more
than the height available.
This patch fixes the erroneous assignment of event-widget's height by first
comparing the required height with the available height. If the required
height exceeds the available height, then the display-text is given as a
single-line for the widget to fit properly.
https://bugzilla.gnome.org/show_bug.cgi?id=778070
src/gcal-event-widget.c | 150 +++++++++++++++++++++++++++++++----------------
1 files changed, 100 insertions(+), 50 deletions(-)
---
diff --git a/src/gcal-event-widget.c b/src/gcal-event-widget.c
index 3128d60..6d9bb51 100644
--- a/src/gcal-event-widget.c
+++ b/src/gcal-event-widget.c
@@ -69,6 +69,93 @@ static guint signals[NUM_SIGNALS] = { 0, };
G_DEFINE_TYPE_WITH_CODE (GcalEventWidget, gcal_event_widget, GTK_TYPE_WIDGET,
G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL));
+static gchar*
+get_visible_text (GtkWidget *widget,
+ GtkOrientation orientation)
+{
+ GcalEventWidget *self;
+ gboolean is_ltr;
+ gchar *display_text;
+ gchar *escaped_text;
+
+ self = GCAL_EVENT_WIDGET (widget);
+ is_ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
+
+ /*
+ * Since we set markup labels, we have to escape text before
+ * using it, or we get empty event widgets.
+ */
+ escaped_text = g_markup_escape_text (gcal_event_get_summary (self->event), -1);
+
+ /*
+ * The text displayed in the widget includes the time when the event
+ * is timed, or not if the event is all day.
+ */
+ if (gcal_event_get_all_day (self->event))
+ {
+ display_text = escaped_text;
+ }
+ else
+ {
+ GDateTime *local_start_time;
+ gchar *start_time;
+ local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event));
+
+ if (self->clock_format_24h)
+ start_time = g_date_time_format (local_start_time, "%R");
+ else
+ start_time = g_date_time_format (local_start_time, "%I:%M %P");
+
+ /*
+ * When in horizontal, draw the elements sequentially; otherwise,
+ * draw the time in the first line, and the title in subsequent
+ * lines.
+ */
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ if (is_ltr)
+ display_text = g_strdup_printf ("(%s) %s", start_time, escaped_text);
+ else
+ display_text = g_strdup_printf ("%s (%s)", escaped_text, start_time);
+ }
+ else
+ {
+ display_text = g_strdup_printf ("<b>%s</b>\n%s", start_time, escaped_text);
+ }
+
+ g_clear_pointer (&local_start_time, g_date_time_unref);
+ g_clear_pointer (&escaped_text, g_free);
+ g_clear_pointer (&start_time, g_free);
+ }
+
+ return display_text;
+}
+
+static gint
+get_vertical_text_height (GtkWidget *widget)
+{
+ GcalEventWidget *self;
+ GtkBorder border, padding;
+ GtkStyleContext *context;
+ PangoLayout *layout;
+ gint layout_height;
+ gchar* display_text;
+
+ self = GCAL_EVENT_WIDGET (widget);
+ context = gtk_widget_get_style_context (widget);
+ display_text = get_visible_text (widget, GTK_ORIENTATION_VERTICAL);
+ layout = gtk_widget_create_pango_layout (widget, display_text);
+ pango_layout_get_pixel_size (layout, NULL, &layout_height);
+ g_object_unref (layout);
+
+ gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
+ gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
+
+ g_clear_pointer(&display_text, g_free);
+
+ return layout_height + padding.top + padding.bottom + border.top + border.bottom;
+}
+
static void
gcal_event_widget_update_style (GcalEventWidget *self)
{
@@ -328,23 +415,24 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
GtkStyleContext *context;
PangoLayout *layout;
gint layout_height;
- gint factor;
+ gchar* display_text;
self = GCAL_EVENT_WIDGET (widget);
context = gtk_widget_get_style_context (widget);
- layout = gtk_widget_create_pango_layout (widget, NULL);
+ display_text = get_visible_text (widget, self->orientation);
+ layout = gtk_widget_create_pango_layout (widget, display_text);
pango_layout_get_pixel_size (layout, NULL, &layout_height);
g_object_unref (layout);
gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
- factor = self->orientation == GTK_ORIENTATION_HORIZONTAL ? 1 : 2;
-
if (minimum != NULL)
- *minimum = (factor * layout_height) + padding.top + padding.bottom + border.top + border.bottom;
+ *minimum = layout_height + padding.top + padding.bottom + border.top + border.bottom;
if (natural != NULL)
- *natural = (factor * layout_height) + padding.top + padding.bottom + border.top + border.bottom;
+ *natural = layout_height + padding.top + padding.bottom + border.top + border.bottom;
+
+ g_clear_pointer(&display_text, g_free);
}
static void
@@ -475,7 +563,6 @@ gcal_event_widget_draw (GtkWidget *widget,
PangoLayout *layout;
PangoFontDescription *font_desc;
gchar *display_text;
- gchar *escaped_text;
self = GCAL_EVENT_WIDGET (widget);
context = gtk_widget_get_style_context (widget);
@@ -490,51 +577,15 @@ gcal_event_widget_draw (GtkWidget *widget,
gtk_render_background (context, cr, 0, 0, width, height);
gtk_render_frame (context, cr, 0, 0, width, height);
- /*
- * Since we set markup labels, we have to escape text before
- * using it, or we get empty event widgets.
- */
- escaped_text = g_markup_escape_text (gcal_event_get_summary (self->event), -1);
-
- /*
- * The text displayed in the widget includes the time when the event
- * is timed, or not if the event is all day.
- */
- if (gcal_event_get_all_day (self->event))
- {
- display_text = escaped_text;
- }
+ /* Set the text to be displayed */
+ if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
+ display_text = get_visible_text (widget, GTK_ORIENTATION_HORIZONTAL);
else
{
- GDateTime *local_start_time;
- gchar *start_time;
- local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event));
-
- if (self->clock_format_24h)
- start_time = g_date_time_format (local_start_time, "%R");
- else
- start_time = g_date_time_format (local_start_time, "%I:%M %P");
-
- /*
- * When in horizontal, draw the elements sequentially; otherwise,
- * draw the time in the first line, and the title in subsequent
- * lines.
- */
- if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- if (is_ltr)
- display_text = g_strdup_printf ("(%s) %s", start_time, escaped_text);
- else
- display_text = g_strdup_printf ("%s (%s)", escaped_text, start_time);
- }
+ if (get_vertical_text_height (widget) >= height)
+ display_text = get_visible_text (widget, GTK_ORIENTATION_HORIZONTAL);
else
- {
- display_text = g_strdup_printf ("<b>%s</b>\n%s", start_time, escaped_text);
- }
-
- g_clear_pointer (&local_start_time, g_date_time_unref);
- g_clear_pointer (&escaped_text, g_free);
- g_clear_pointer (&start_time, g_free);
+ display_text = get_visible_text (widget, GTK_ORIENTATION_VERTICAL);
}
/* Retrieve the font description */
@@ -662,7 +713,6 @@ gcal_event_widget_button_press_event (GtkWidget *widget,
self = GCAL_EVENT_WIDGET (widget);
self->button_pressed = TRUE;
-
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]