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;
|
GDateTime *dt_end;
|
||||||
|
|
||||||
/* internal data */
|
/* internal data */
|
||||||
|
gboolean clock_format_24h : 1;
|
||||||
gboolean read_only : 1;
|
gboolean read_only : 1;
|
||||||
gchar *css_class;
|
gchar *css_class;
|
||||||
|
|
||||||
@@ -175,8 +176,18 @@ gcal_event_widget_set_event_internal (GcalEventWidget *self,
|
|||||||
static void
|
static void
|
||||||
gcal_event_widget_init(GcalEventWidget *self)
|
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_has_window (GTK_WIDGET (self), FALSE);
|
||||||
gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE);
|
gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE);
|
||||||
|
|
||||||
|
g_clear_object (&settings);
|
||||||
|
g_free (clock_format);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -418,8 +429,9 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
GtkStateFlags state;
|
GtkStateFlags state;
|
||||||
GtkBorder padding;
|
GtkBorder padding;
|
||||||
|
|
||||||
gint width, height, layout_height;
|
gint width, height, layout_height, x;
|
||||||
gint left_gap, right_gap, icon_size = 0;
|
gint end_gap, icon_size = 0;
|
||||||
|
gboolean is_ltr;
|
||||||
|
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoFontDescription *font_desc;
|
PangoFontDescription *font_desc;
|
||||||
@@ -428,6 +440,7 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
self = GCAL_EVENT_WIDGET (widget);
|
self = GCAL_EVENT_WIDGET (widget);
|
||||||
context = gtk_widget_get_style_context (widget);
|
context = gtk_widget_get_style_context (widget);
|
||||||
state = gtk_style_context_get_state (context);
|
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);
|
gtk_style_context_get_padding (context, state, &padding);
|
||||||
|
|
||||||
@@ -449,10 +462,17 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
GDateTime *local_start_time;
|
GDateTime *local_start_time;
|
||||||
gchar *start_time;
|
gchar *start_time;
|
||||||
|
|
||||||
local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event));
|
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 (&local_start_time, g_date_time_unref);
|
||||||
g_clear_pointer (&start_time, g_free);
|
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);
|
pango_layout_get_pixel_size (layout, NULL, &layout_height);
|
||||||
icon_size = 4 * (layout_height / 4);
|
icon_size = 4 * (layout_height / 4);
|
||||||
|
|
||||||
left_gap = 0;
|
end_gap = 0;
|
||||||
|
|
||||||
if (gcal_event_has_alarms (self->event))
|
if (gcal_event_has_alarms (self->event))
|
||||||
{
|
end_gap += icon_size + (is_ltr ? padding.left : padding.right);
|
||||||
left_gap = icon_size + padding.left;
|
|
||||||
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right) ) * PANGO_SCALE);
|
|
||||||
}
|
|
||||||
|
|
||||||
right_gap = 0;
|
|
||||||
if (self->read_only)
|
if (self->read_only)
|
||||||
{
|
end_gap += icon_size + (is_ltr ? padding.left : padding.right);
|
||||||
right_gap = icon_size + padding.right;
|
|
||||||
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right + right_gap) ) * PANGO_SCALE);
|
|
||||||
}
|
|
||||||
|
|
||||||
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 */
|
/* render reminder icon */
|
||||||
if (gcal_event_has_alarms (self->event))
|
if (gcal_event_has_alarms (self->event))
|
||||||
@@ -504,7 +523,10 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
&was_symbolic,
|
&was_symbolic,
|
||||||
NULL);
|
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);
|
g_object_unref (pixbuf);
|
||||||
cairo_paint (cr);
|
cairo_paint (cr);
|
||||||
}
|
}
|
||||||
@@ -527,7 +549,7 @@ gcal_event_widget_draw (GtkWidget *widget,
|
|||||||
&was_symbolic,
|
&was_symbolic,
|
||||||
NULL);
|
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);
|
g_object_unref (pixbuf);
|
||||||
cairo_paint (cr);
|
cairo_paint (cr);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user