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_DEFINE_TYPE_WITH_CODE (GcalEventWidget, gcal_event_widget, GTK_TYPE_WIDGET,
|
||||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL));
|
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
|
static void
|
||||||
gcal_event_widget_update_style (GcalEventWidget *self)
|
gcal_event_widget_update_style (GcalEventWidget *self)
|
||||||
{
|
{
|
||||||
@@ -328,23 +415,24 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
|
|||||||
GtkStyleContext *context;
|
GtkStyleContext *context;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
gint layout_height;
|
gint layout_height;
|
||||||
gint factor;
|
gchar* display_text;
|
||||||
|
|
||||||
self = GCAL_EVENT_WIDGET (widget);
|
self = GCAL_EVENT_WIDGET (widget);
|
||||||
context = gtk_widget_get_style_context (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);
|
pango_layout_get_pixel_size (layout, NULL, &layout_height);
|
||||||
g_object_unref (layout);
|
g_object_unref (layout);
|
||||||
|
|
||||||
gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
|
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);
|
gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
|
||||||
|
|
||||||
factor = self->orientation == GTK_ORIENTATION_HORIZONTAL ? 1 : 2;
|
|
||||||
|
|
||||||
if (minimum != NULL)
|
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)
|
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
|
static void
|
||||||
@@ -475,7 +563,6 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoFontDescription *font_desc;
|
PangoFontDescription *font_desc;
|
||||||
gchar *display_text;
|
gchar *display_text;
|
||||||
gchar *escaped_text;
|
|
||||||
|
|
||||||
self = GCAL_EVENT_WIDGET (widget);
|
self = GCAL_EVENT_WIDGET (widget);
|
||||||
context = gtk_widget_get_style_context (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_background (context, cr, 0, 0, width, height);
|
||||||
gtk_render_frame (context, cr, 0, 0, width, height);
|
gtk_render_frame (context, cr, 0, 0, width, height);
|
||||||
|
|
||||||
/*
|
/* Set the text to be displayed */
|
||||||
* 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 (self->orientation == GTK_ORIENTATION_HORIZONTAL)
|
if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
{
|
display_text = get_visible_text (widget, 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
|
else
|
||||||
{
|
{
|
||||||
display_text = g_strdup_printf ("<b>%s</b>\n%s", start_time, escaped_text);
|
if (get_vertical_text_height (widget) >= height)
|
||||||
}
|
display_text = get_visible_text (widget, GTK_ORIENTATION_HORIZONTAL);
|
||||||
|
else
|
||||||
g_clear_pointer (&local_start_time, g_date_time_unref);
|
display_text = get_visible_text (widget, GTK_ORIENTATION_VERTICAL);
|
||||||
g_clear_pointer (&escaped_text, g_free);
|
|
||||||
g_clear_pointer (&start_time, g_free);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the font description */
|
/* Retrieve the font description */
|
||||||
@@ -662,7 +713,6 @@ gcal_event_widget_button_press_event (GtkWidget *widget,
|
|||||||
|
|
||||||
self = GCAL_EVENT_WIDGET (widget);
|
self = GCAL_EVENT_WIDGET (widget);
|
||||||
self->button_pressed = TRUE;
|
self->button_pressed = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user