From ec60f89bde965c61f186f9363b47b2581371bbd5 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 3 Sep 2012 13:19:58 +0200 Subject: im-source-menu-item: refactor setting detail string --- src/im-source-menu-item.c | 61 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 15 deletions(-) (limited to 'src/im-source-menu-item.c') diff --git a/src/im-source-menu-item.c b/src/im-source-menu-item.c index 5aebb68..0973567 100644 --- a/src/im-source-menu-item.c +++ b/src/im-source-menu-item.c @@ -63,7 +63,7 @@ im_source_menu_item_constructed (GObject *object) priv->detail = g_object_ref (gtk_label_new ("")); gtk_widget_set_halign (priv->detail, GTK_ALIGN_END); gtk_widget_set_hexpand (priv->detail, TRUE); - gtk_misc_set_alignment (GTK_MISC (priv->label), 1.0, 0.5); + gtk_widget_set_halign (priv->detail, GTK_ALIGN_END); gtk_style_context_add_class (gtk_widget_get_style_context (priv->detail), "accelerator"); grid = gtk_grid_new (); @@ -146,16 +146,54 @@ im_source_menu_item_time_span_string (gint64 timestamp) return str; } +static void +im_source_menu_item_set_detail_count (ImSourceMenuItem *self, + guint32 count) +{ + ImSourceMenuItemPrivate *priv = self->priv; + gchar *str; + + str = g_strdup_printf ("%d", count); + gtk_label_set_text (GTK_LABEL (priv->detail), str); + + g_free (str); +} + +static void +im_source_menu_item_set_detail_time (ImSourceMenuItem *self, + gint64 time) +{ + ImSourceMenuItemPrivate *priv = self->priv; + gchar *str; + + priv->time = time; + + str = im_source_menu_item_time_span_string (priv->time); + gtk_label_set_text (GTK_LABEL (priv->detail), str); + + g_free (str); +} + +static void +im_source_menu_item_set_detail (ImSourceMenuItem *self, + const gchar *detail) +{ + ImSourceMenuItemPrivate *priv = self->priv; + gchar *str; + + str = collapse_whitespace (detail); + gtk_label_set_text (GTK_LABEL (priv->detail), str); + + g_free (str); +} + static gboolean im_source_menu_item_update_time (gpointer data) { ImSourceMenuItem *self = data; - gchar *str; - str = im_source_menu_item_time_span_string (self->priv->time); - gtk_label_set_text (GTK_LABEL (self->priv->detail), str); + im_source_menu_item_set_detail_time (self, self->priv->time); - g_free (str); return TRUE; } @@ -167,7 +205,6 @@ im_source_menu_item_set_state (ImSourceMenuItem *self, guint32 count; gint64 time; const gchar *str; - gchar *detail; if (priv->timer_id != 0) { @@ -180,21 +217,15 @@ im_source_menu_item_set_state (ImSourceMenuItem *self, g_variant_get (state, "(ux&sb)", &count, &time, &str, NULL); if (count != 0) - detail = g_strdup_printf ("%d", count); + im_source_menu_item_set_detail_count (self, count); else if (time != 0) { - priv->time = time; - detail = im_source_menu_item_time_span_string (time); + im_source_menu_item_set_detail_time (self, time); priv->timer_id = g_timeout_add_seconds (59, im_source_menu_item_update_time, self); } else if (str != NULL && *str) - detail = collapse_whitespace (str); - else - detail = NULL; - - gtk_label_set_text (GTK_LABEL (priv->detail), detail ? detail : ""); + im_source_menu_item_set_detail (self, str); - g_free (detail); return TRUE; } -- cgit v1.2.3 From 641cda4f3387597e297afee9429d89be2d79893b Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 3 Sep 2012 15:37:23 +0200 Subject: im-source-menu-item: draw lozenges around counts A new widget class IdoDetailLabel is introduced, which can display either a string or a count. Counts are drawn as lozenges. --- src/im-source-menu-item.c | 79 +++-------------------------------------------- 1 file changed, 5 insertions(+), 74 deletions(-) (limited to 'src/im-source-menu-item.c') diff --git a/src/im-source-menu-item.c b/src/im-source-menu-item.c index 0973567..5f89d07 100644 --- a/src/im-source-menu-item.c +++ b/src/im-source-menu-item.c @@ -20,6 +20,7 @@ #include "im-source-menu-item.h" #include +#include "ido-detail-label.h" struct _ImSourceMenuItemPrivate { @@ -60,10 +61,9 @@ im_source_menu_item_constructed (GObject *object) priv->label = g_object_ref (gtk_label_new ("")); - priv->detail = g_object_ref (gtk_label_new ("")); + priv->detail = g_object_ref (ido_detail_label_new ("")); gtk_widget_set_halign (priv->detail, GTK_ALIGN_END); gtk_widget_set_hexpand (priv->detail, TRUE); - gtk_widget_set_halign (priv->detail, GTK_ALIGN_END); gtk_style_context_add_class (gtk_widget_get_style_context (priv->detail), "accelerator"); grid = gtk_grid_new (); @@ -77,49 +77,6 @@ im_source_menu_item_constructed (GObject *object) G_OBJECT_CLASS (im_source_menu_item_parent_class)->constructed (object); } -/* collapse_whitespace: - * @str: the source string - * - * Collapses all occurences of consecutive whitespace charactes in @str - * into a single space. - * - * Returns: (transfer full): a newly-allocated string - */ -static gchar * -collapse_whitespace (const gchar *str) -{ - GString *result; - gboolean in_space = FALSE; - - if (str == NULL) - return NULL; - - result = g_string_new (""); - - while (*str) - { - gunichar c = g_utf8_get_char_validated (str, -1); - - if (c < 0) - break; - - if (!g_unichar_isspace (c)) - { - g_string_append_unichar (result, c); - in_space = FALSE; - } - else if (!in_space) - { - g_string_append_c (result, ' '); - in_space = TRUE; - } - - str = g_utf8_next_char (str); - } - - return g_string_free (result, FALSE); -} - static gchar * im_source_menu_item_time_span_string (gint64 timestamp) { @@ -146,19 +103,6 @@ im_source_menu_item_time_span_string (gint64 timestamp) return str; } -static void -im_source_menu_item_set_detail_count (ImSourceMenuItem *self, - guint32 count) -{ - ImSourceMenuItemPrivate *priv = self->priv; - gchar *str; - - str = g_strdup_printf ("%d", count); - gtk_label_set_text (GTK_LABEL (priv->detail), str); - - g_free (str); -} - static void im_source_menu_item_set_detail_time (ImSourceMenuItem *self, gint64 time) @@ -169,20 +113,7 @@ im_source_menu_item_set_detail_time (ImSourceMenuItem *self, priv->time = time; str = im_source_menu_item_time_span_string (priv->time); - gtk_label_set_text (GTK_LABEL (priv->detail), str); - - g_free (str); -} - -static void -im_source_menu_item_set_detail (ImSourceMenuItem *self, - const gchar *detail) -{ - ImSourceMenuItemPrivate *priv = self->priv; - gchar *str; - - str = collapse_whitespace (detail); - gtk_label_set_text (GTK_LABEL (priv->detail), str); + ido_detail_label_set_text (IDO_DETAIL_LABEL (priv->detail), str); g_free (str); } @@ -217,14 +148,14 @@ im_source_menu_item_set_state (ImSourceMenuItem *self, g_variant_get (state, "(ux&sb)", &count, &time, &str, NULL); if (count != 0) - im_source_menu_item_set_detail_count (self, count); + ido_detail_label_set_count (IDO_DETAIL_LABEL (priv->detail), count); else if (time != 0) { im_source_menu_item_set_detail_time (self, time); priv->timer_id = g_timeout_add_seconds (59, im_source_menu_item_update_time, self); } else if (str != NULL && *str) - im_source_menu_item_set_detail (self, str); + ido_detail_label_set_text (IDO_DETAIL_LABEL (priv->detail), str); return TRUE; } -- cgit v1.2.3 From a83f13375bc72d0d96523295bd9e76ab75af9255 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 3 Sep 2012 15:45:33 +0200 Subject: im-source-menu-item: ellipsize label when it's longer than 40 em Also make sure that the label is left-aligned when ellipsized. --- src/im-source-menu-item.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/im-source-menu-item.c') diff --git a/src/im-source-menu-item.c b/src/im-source-menu-item.c index 5f89d07..775fa91 100644 --- a/src/im-source-menu-item.c +++ b/src/im-source-menu-item.c @@ -60,6 +60,9 @@ im_source_menu_item_constructed (GObject *object) gtk_widget_set_margin_left (priv->icon, icon_width + 6); priv->label = g_object_ref (gtk_label_new ("")); + gtk_label_set_max_width_chars (GTK_LABEL (priv->label), 40); + gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END); + gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5); priv->detail = g_object_ref (ido_detail_label_new ("")); gtk_widget_set_halign (priv->detail, GTK_ALIGN_END); -- cgit v1.2.3