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
This commit is contained in:
committed by
Georges Basile Stavracas Neto
parent
6cc6e4f7e7
commit
26ecf3c161
+100
-50
@@ -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");
|
||||
if (get_vertical_text_height (widget) >= height)
|
||||
display_text = get_visible_text (widget, GTK_ORIENTATION_HORIZONTAL);
|
||||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user