event-widget: draw icons at the end of the widget
Instead of breaking the vertical alignment of events by drawing icons both at the start and end of the widget, only draw them by the end. This commit also improves drawing for RTL locales.
This commit is contained in:
+40
-18
@@ -31,6 +31,7 @@ struct _GcalEventWidget
|
||||
GDateTime *dt_end;
|
||||
|
||||
/* internal data */
|
||||
gboolean clock_format_24h : 1;
|
||||
gboolean read_only : 1;
|
||||
gchar *css_class;
|
||||
|
||||
@@ -175,8 +176,18 @@ gcal_event_widget_set_event_internal (GcalEventWidget *self,
|
||||
static void
|
||||
gcal_event_widget_init(GcalEventWidget *self)
|
||||
{
|
||||
GSettings *settings;
|
||||
gchar *clock_format;
|
||||
|
||||
settings = g_settings_new ("org.gnome.desktop.interface");
|
||||
clock_format = g_settings_get_string (settings, "clock-format");
|
||||
self->clock_format_24h = g_strcmp0 (clock_format, "24h") == 0;
|
||||
|
||||
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
|
||||
gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE);
|
||||
|
||||
g_clear_object (&settings);
|
||||
g_free (clock_format);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -418,8 +429,9 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
|
||||
gint width, height, layout_height;
|
||||
gint left_gap, right_gap, icon_size = 0;
|
||||
gint width, height, layout_height, x;
|
||||
gint end_gap, icon_size = 0;
|
||||
gboolean is_ltr;
|
||||
|
||||
PangoLayout *layout;
|
||||
PangoFontDescription *font_desc;
|
||||
@@ -428,6 +440,7 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
self = GCAL_EVENT_WIDGET (widget);
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_style_context_get_state (context);
|
||||
is_ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
|
||||
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
|
||||
@@ -449,10 +462,17 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
{
|
||||
GDateTime *local_start_time;
|
||||
gchar *start_time;
|
||||
|
||||
local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event));
|
||||
start_time = g_date_time_format (local_start_time, "%R%p");
|
||||
display_text = g_strdup_printf ("(%s) %s", start_time, gcal_event_get_summary (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");
|
||||
|
||||
if (is_ltr)
|
||||
display_text = g_strdup_printf ("(%s) %s", start_time, gcal_event_get_summary (self->event));
|
||||
else
|
||||
display_text = g_strdup_printf ("%s (%s)", gcal_event_get_summary (self->event), start_time);
|
||||
|
||||
g_clear_pointer (&local_start_time, g_date_time_unref);
|
||||
g_clear_pointer (&start_time, g_free);
|
||||
@@ -470,21 +490,20 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
pango_layout_get_pixel_size (layout, NULL, &layout_height);
|
||||
icon_size = 4 * (layout_height / 4);
|
||||
|
||||
left_gap = 0;
|
||||
end_gap = 0;
|
||||
|
||||
if (gcal_event_has_alarms (self->event))
|
||||
{
|
||||
left_gap = icon_size + padding.left;
|
||||
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right) ) * PANGO_SCALE);
|
||||
}
|
||||
end_gap += icon_size + (is_ltr ? padding.left : padding.right);
|
||||
|
||||
right_gap = 0;
|
||||
if (self->read_only)
|
||||
{
|
||||
right_gap = icon_size + padding.right;
|
||||
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right + right_gap) ) * PANGO_SCALE);
|
||||
}
|
||||
end_gap += icon_size + (is_ltr ? padding.left : padding.right);
|
||||
|
||||
gtk_render_layout (context, cr, padding.left + left_gap, padding.top, layout);
|
||||
x = is_ltr ? padding.left : padding.left + end_gap;
|
||||
|
||||
pango_layout_set_width (layout, (width - (padding.left + padding.right + end_gap)) * PANGO_SCALE);
|
||||
gtk_render_layout (context, cr, x, padding.top, layout);
|
||||
|
||||
x += is_ltr ? (width - end_gap - padding.left - padding.right) : (- padding.right - padding.left - icon_size);
|
||||
|
||||
/* render reminder icon */
|
||||
if (gcal_event_has_alarms (self->event))
|
||||
@@ -504,7 +523,10 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
&was_symbolic,
|
||||
NULL);
|
||||
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, padding.left, padding.top);
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, x + padding.left, padding.top);
|
||||
|
||||
x += is_ltr ? (padding.left + icon_size) : (- padding.right - icon_size);
|
||||
|
||||
g_object_unref (pixbuf);
|
||||
cairo_paint (cr);
|
||||
}
|
||||
@@ -527,7 +549,7 @@ gcal_event_widget_draw (GtkWidget *widget,
|
||||
&was_symbolic,
|
||||
NULL);
|
||||
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, width - right_gap, padding.top);
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, x + padding.left, padding.top);
|
||||
g_object_unref (pixbuf);
|
||||
cairo_paint (cr);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user