From 6ea6096c807b2d1e5da8743a5906209d83099a71 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 25 Oct 2013 10:32:22 -0400 Subject: ESourceSelector: Add a "show-icons" property. ESourceSelector can now optionally display an icon next to each ESource matching the selector's "extension-name". Intended for non-homogeneous use cases where a variety of account types are shown in the selector. The icon set is hard-coded, but we could change that if the need arises. --- .../evolution-util/evolution-util-sections.txt | 2 + e-util/e-source-selector.c | 139 ++++++++++++++++++++- e-util/e-source-selector.h | 5 + e-util/test-source-selector.c | 12 +- 4 files changed, 156 insertions(+), 2 deletions(-) diff --git a/doc/reference/evolution-util/evolution-util-sections.txt b/doc/reference/evolution-util/evolution-util-sections.txt index 8ce000d21c..1fc18c8802 100644 --- a/doc/reference/evolution-util/evolution-util-sections.txt +++ b/doc/reference/evolution-util/evolution-util-sections.txt @@ -3207,6 +3207,8 @@ e_source_selector_get_registry e_source_selector_get_extension_name e_source_selector_get_show_colors e_source_selector_set_show_colors +e_source_selector_get_show_icons +e_source_selector_set_show_icons e_source_selector_get_show_toggles e_source_selector_set_show_toggles e_source_selector_select_source diff --git a/e-util/e-source-selector.c b/e-util/e-source-selector.c index 1e4435ea03..71c902ce38 100644 --- a/e-util/e-source-selector.c +++ b/e-util/e-source-selector.c @@ -56,6 +56,7 @@ struct _ESourceSelectorPrivate { gboolean toggled_last; gboolean select_new; gboolean show_colors; + gboolean show_icons; gboolean show_toggles; }; @@ -70,6 +71,7 @@ enum { PROP_PRIMARY_SELECTION, PROP_REGISTRY, PROP_SHOW_COLORS, + PROP_SHOW_ICONS, PROP_SHOW_TOGGLES }; @@ -85,7 +87,9 @@ enum { COLUMN_NAME, COLUMN_COLOR, COLUMN_ACTIVE, + COLUMN_ICON_NAME, COLUMN_SHOW_COLOR, + COLUMN_SHOW_ICONS, COLUMN_SHOW_TOGGLE, COLUMN_WEIGHT, COLUMN_SOURCE, @@ -237,6 +241,43 @@ source_selector_cancel_write (ESourceSelector *selector, g_hash_table_remove (pending_writes, source); } +static const gchar * +source_selector_get_icon_name (ESourceSelector *selector, + ESource *source) +{ + const gchar *extension_name; + const gchar *icon_name = NULL; + + /* XXX These are the same icons used in EShellView subclasses. + * We should really centralize these icon names somewhere. */ + + extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; + if (e_source_has_extension (source, extension_name)) + icon_name = "x-office-address-book"; + + extension_name = E_SOURCE_EXTENSION_CALENDAR; + if (e_source_has_extension (source, extension_name)) + icon_name = "x-office-calendar"; + + extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; + if (e_source_has_extension (source, extension_name)) + icon_name = "evolution-mail"; + + extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; + if (e_source_has_extension (source, extension_name)) + icon_name = "mail-send"; + + extension_name = E_SOURCE_EXTENSION_MEMO_LIST; + if (e_source_has_extension (source, extension_name)) + icon_name = "evolution-memos"; + + extension_name = E_SOURCE_EXTENSION_TASK_LIST; + if (e_source_has_extension (source, extension_name)) + icon_name = "evolution-tasks"; + + return icon_name; +} + static gboolean source_selector_traverse (GNode *node, ESourceSelector *selector) @@ -630,6 +671,12 @@ source_selector_set_property (GObject *object, g_value_get_boolean (value)); return; + case PROP_SHOW_ICONS: + e_source_selector_set_show_icons ( + E_SOURCE_SELECTOR (object), + g_value_get_boolean (value)); + return; + case PROP_SHOW_TOGGLES: e_source_selector_set_show_toggles ( E_SOURCE_SELECTOR (object), @@ -675,6 +722,13 @@ source_selector_get_property (GObject *object, E_SOURCE_SELECTOR (object))); return; + case PROP_SHOW_ICONS: + g_value_set_boolean ( + value, + e_source_selector_get_show_icons ( + E_SOURCE_SELECTOR (object))); + return; + case PROP_SHOW_TOGGLES: g_value_set_boolean ( value, @@ -1243,6 +1297,17 @@ e_source_selector_class_init (ESourceSelectorClass *class) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property ( + object_class, + PROP_SHOW_ICONS, + g_param_spec_boolean ( + "show-icons", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property ( object_class, PROP_SHOW_TOGGLES, @@ -1341,7 +1406,9 @@ e_source_selector_init (ESourceSelector *selector) G_TYPE_STRING, /* COLUMN_NAME */ GDK_TYPE_COLOR, /* COLUMN_COLOR */ G_TYPE_BOOLEAN, /* COLUMN_ACTIVE */ + G_TYPE_STRING, /* COLUMN_ICON_NAME */ G_TYPE_BOOLEAN, /* COLUMN_SHOW_COLOR */ + G_TYPE_BOOLEAN, /* COLUMN_SHOW_ICON */ G_TYPE_BOOLEAN, /* COLUMN_SHOW_TOGGLE */ G_TYPE_INT, /* COLUMN_WEIGHT */ E_TYPE_SOURCE); /* COLUMN_SOURCE */ @@ -1372,6 +1439,16 @@ e_source_selector_init (ESourceSelector *selector) renderer, "toggled", G_CALLBACK (cell_toggled_callback), selector); + renderer = gtk_cell_renderer_pixbuf_new (); + g_object_set ( + G_OBJECT (renderer), + "stock-size", GTK_ICON_SIZE_MENU, NULL); + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_add_attribute ( + column, renderer, "icon-name", COLUMN_ICON_NAME); + gtk_tree_view_column_add_attribute ( + column, renderer, "visible", COLUMN_SHOW_ICONS); + renderer = gtk_cell_renderer_text_new (); g_object_set ( G_OBJECT (renderer), @@ -1500,6 +1577,57 @@ e_source_selector_set_show_colors (ESourceSelector *selector, source_selector_build_model (selector); } +/** + * e_source_selector_get_show_icons: + * @selector: an #ESourceSelector + * + * Returns whether icons are shown next to data sources. + * + * Generally the icon shown will be based on the presence of a backend-based + * extension, such as #ESourceAddressBook or #ESourceCalendar. For #ESource + * instances with no such extension, no icon is shown. + * + * Returns: %TRUE if icons are being shown + * + * Since: 3.12 + **/ +gboolean +e_source_selector_get_show_icons (ESourceSelector *selector) +{ + g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), FALSE); + + return selector->priv->show_icons; +} + +/** + * e_source_selector_set_show_icons: + * @selector: an #ESourceSelector + * @show_icons: whether to show icons + * + * Sets whether to show icons next to data sources. + * + * Generally the icon shown will be based on the presence of a backend-based + * extension, such as #ESourceAddressBook or #ESourceCalendar. For #ESource + * instances with no such extension, no icon is shown. + * + * Since: 3.12 + **/ +void +e_source_selector_set_show_icons (ESourceSelector *selector, + gboolean show_icons) +{ + g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); + + if (show_icons == selector->priv->show_icons) + return; + + selector->priv->show_icons = show_icons; + + g_object_notify (G_OBJECT (selector), "show-icons"); + + source_selector_build_model (selector); +} + /** * e_source_selector_get_show_toggles: * @selector: an #ESourceSelector @@ -2130,7 +2258,9 @@ e_source_selector_update_row (ESourceSelector *selector, if (extension != NULL) { GdkColor color; const gchar *color_spec = NULL; - gboolean show_color = FALSE; + const gchar *icon_name; + gboolean show_color; + gboolean show_icons; gboolean show_toggle; show_color = @@ -2144,6 +2274,9 @@ e_source_selector_update_row (ESourceSelector *selector, if (color_spec != NULL && *color_spec != '\0') show_color = gdk_color_parse (color_spec, &color); + show_icons = e_source_selector_get_show_icons (selector); + icon_name = source_selector_get_icon_name (selector, source); + show_toggle = e_source_selector_get_show_toggles (selector); gtk_tree_store_set ( @@ -2151,7 +2284,9 @@ e_source_selector_update_row (ESourceSelector *selector, COLUMN_NAME, display_name, COLUMN_COLOR, show_color ? &color : NULL, COLUMN_ACTIVE, selected, + COLUMN_ICON_NAME, icon_name, COLUMN_SHOW_COLOR, show_color, + COLUMN_SHOW_ICONS, show_icons, COLUMN_SHOW_TOGGLE, show_toggle, COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL, COLUMN_SOURCE, source, @@ -2162,7 +2297,9 @@ e_source_selector_update_row (ESourceSelector *selector, COLUMN_NAME, display_name, COLUMN_COLOR, NULL, COLUMN_ACTIVE, FALSE, + COLUMN_ICON_NAME, NULL, COLUMN_SHOW_COLOR, FALSE, + COLUMN_SHOW_ICONS, FALSE, COLUMN_SHOW_TOGGLE, FALSE, COLUMN_WEIGHT, PANGO_WEIGHT_BOLD, COLUMN_SOURCE, source, diff --git a/e-util/e-source-selector.h b/e-util/e-source-selector.h index f0e56573b5..29d981510e 100644 --- a/e-util/e-source-selector.h +++ b/e-util/e-source-selector.h @@ -101,6 +101,11 @@ gboolean e_source_selector_get_show_colors void e_source_selector_set_show_colors (ESourceSelector *selector, gboolean show_colors); +gboolean e_source_selector_get_show_icons + (ESourceSelector *selector); +void e_source_selector_set_show_icons + (ESourceSelector *selector, + gboolean show_icons); gboolean e_source_selector_get_show_toggles (ESourceSelector *selector); void e_source_selector_set_show_toggles diff --git a/e-util/test-source-selector.c b/e-util/test-source-selector.c index 7a46fa5a07..f89c480520 100644 --- a/e-util/test-source-selector.c +++ b/e-util/test-source-selector.c @@ -69,7 +69,7 @@ on_idle_create_widget (ESourceRegistry *registry) GtkWidget *check; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (window), 200, 300); + gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); g_signal_connect ( window, "delete-event", @@ -111,6 +111,16 @@ on_idle_create_widget (ESourceRegistry *registry) G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + check = gtk_check_button_new_with_label ("Show icons"); + gtk_widget_set_halign (check, GTK_ALIGN_FILL); + gtk_container_add (GTK_CONTAINER (vgrid), check); + + g_object_bind_property ( + selector, "show-icons", + check, "active", + G_BINDING_BIDIRECTIONAL | + G_BINDING_SYNC_CREATE); + check = gtk_check_button_new_with_label ("Show toggles"); gtk_widget_set_halign (check, GTK_ALIGN_FILL); gtk_container_add (GTK_CONTAINER (vgrid), check); -- cgit v1.2.3