Menus items icons - Patch v2 for #525845
- From: Pierre Wieser <pwieser trychlos org>
- To: nautilus-list <nautilus-list gnome org>
- Cc: pwieser <pwieser trychlos org>
- Subject: Menus items icons - Patch v2 for #525845
- Date: Tue, 24 Nov 2009 21:53:30 +0100 (CET)
Hi all,
I am coming with a new patch for displaying path-based icons
in contextual menus and in the toolbar.
As seen with Alex last week, it doesn't modify the
nautilus_icon_info_lookup_from_name() function, but introduces
a new and very similar nautilus_icon_info_lookup_from_path().
Then, this new function is called from
- [fm-directory-view.c] add_extension_action_for_files()
- [nautilus-ui-utilities.c] nautilus_action_from_menu_item()
- [nautilus-ui-utilities.c] nautilus_toolbar_action_from_menu_item().
Patch is attached to this mail, and is also available online at
http://gist.github.com/242181.
Hope that these will be better than the previous ;)
Regards
Pierre
diff --git a/libnautilus-private/nautilus-icon-info.c b/libnautilus-private/nautilus-icon-info.c
index f1ddd7c..467378a 100644
--- a/libnautilus-private/nautilus-icon-info.c
+++ b/libnautilus-private/nautilus-icon-info.c
@@ -435,13 +435,28 @@ nautilus_icon_info_lookup_from_name (const char *name,
{
GIcon *icon;
NautilusIconInfo *info;
-
+
icon = g_themed_icon_new (name);
info = nautilus_icon_info_lookup (icon, size);
g_object_unref (icon);
return info;
}
+NautilusIconInfo *
+nautilus_icon_info_lookup_from_path (const char *path,
+ int size)
+{
+ GFile *icon_file;
+ GIcon *icon;
+ NautilusIconInfo *info;
+
+ icon_file = g_file_new_for_path (path);
+ icon = g_file_icon_new (icon_file);
+ info = nautilus_icon_info_lookup (icon, size);
+ g_object_unref (icon);
+ g_object_unref (icon_file);
+ return info;
+}
GdkPixbuf *
nautilus_icon_info_get_pixbuf_nodefault (NautilusIconInfo *icon)
diff --git a/libnautilus-private/nautilus-icon-info.h b/libnautilus-private/nautilus-icon-info.h
index d6f5b2f..5ef6cd2 100644
--- a/libnautilus-private/nautilus-icon-info.h
+++ b/libnautilus-private/nautilus-icon-info.h
@@ -58,6 +58,8 @@ NautilusIconInfo * nautilus_icon_info_lookup (GIcon
int size);
NautilusIconInfo * nautilus_icon_info_lookup_from_name (const char *name,
int size);
+NautilusIconInfo * nautilus_icon_info_lookup_from_path (const char *path,
+ int size);
gboolean nautilus_icon_info_is_fallback (NautilusIconInfo *icon);
GdkPixbuf * nautilus_icon_info_get_pixbuf (NautilusIconInfo *icon);
GdkPixbuf * nautilus_icon_info_get_pixbuf_nodefault (NautilusIconInfo *icon);
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index abecc08..7ef7e60 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -4653,11 +4653,15 @@ get_menu_icon (const char *icon_name)
int size;
size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
-
- info = nautilus_icon_info_lookup_from_name (icon_name, size);
+
+ if (g_path_is_absolute (icon_name)) {
+ info = nautilus_icon_info_lookup_from_path (icon_name, size);
+ } else {
+ info = nautilus_icon_info_lookup_from_name (icon_name, size);
+ }
pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
g_object_unref (info);
-
+
return pixbuf;
}
@@ -4700,8 +4704,6 @@ add_extension_action_for_files (FMDirectoryView *view,
tip,
icon);
- /* TODO: This should really use themed icons, but that
- doesn't work here yet */
if (icon != NULL) {
pixbuf = get_menu_icon (icon);
if (pixbuf != NULL) {
diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c
index 5b7bccb..eb6cb98 100644
--- a/libnautilus-private/nautilus-ui-utilities.c
+++ b/libnautilus-private/nautilus-ui-utilities.c
@@ -128,6 +128,23 @@ extension_action_sensitive_callback (NautilusMenuItem *item,
gtk_action_set_sensitive (GTK_ACTION (user_data), value);
}
+static GdkPixbuf *
+get_action_icon (const char *icon_name, int size)
+{
+ NautilusIconInfo *info;
+ GdkPixbuf *pixbuf;
+
+ if (g_path_is_absolute (icon_name)) {
+ info = nautilus_icon_info_lookup_from_path (icon_name, size);
+ } else {
+ info = nautilus_icon_info_lookup_from_name (icon_name, size);
+ }
+ pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
+ g_object_unref (info);
+
+ return pixbuf;
+}
+
GtkAction *
nautilus_action_from_menu_item (NautilusMenuItem *item)
{
@@ -135,47 +152,42 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
gboolean sensitive, priority;
GtkAction *action;
GdkPixbuf *pixbuf;
- NautilusIconInfo *info;
-
- g_object_get (G_OBJECT (item),
- "name", &name, "label", &label,
+
+ g_object_get (G_OBJECT (item),
+ "name", &name, "label", &label,
"tip", &tip, "icon", &icon_name,
"sensitive", &sensitive,
"priority", &priority,
NULL);
-
+
action = gtk_action_new (name,
label,
tip,
icon_name);
-
- if (icon_name != NULL) {
- info = nautilus_icon_info_lookup_from_name (icon_name,
- nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU));
- pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info,
- nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU));
+ if (icon_name != NULL) {
+ pixbuf = get_action_icon (icon_name,
+ nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU));
if (pixbuf != NULL) {
g_object_set_data_full (G_OBJECT (action), "menu-icon",
pixbuf,
g_object_unref);
}
- g_object_unref (info);
}
-
+
gtk_action_set_sensitive (action, sensitive);
g_object_set (action, "is-important", priority, NULL);
-
+
g_signal_connect_data (action, "activate",
G_CALLBACK (extension_action_callback),
- g_object_ref (item),
+ g_object_ref (item),
(GClosureNotify)g_object_unref, 0);
-
+
g_free (name);
g_free (label);
g_free (tip);
g_free (icon_name);
-
+
return action;
}
@@ -186,40 +198,35 @@ nautilus_toolbar_action_from_menu_item (NautilusMenuItem *item)
gboolean sensitive, priority;
GtkAction *action;
GdkPixbuf *pixbuf;
- NautilusIconInfo *info;
- int icon_size;
-
- g_object_get (G_OBJECT (item),
- "name", &name, "label", &label,
+
+ g_object_get (G_OBJECT (item),
+ "name", &name, "label", &label,
"tip", &tip, "icon", &icon_name,
"sensitive", &sensitive,
"priority", &priority,
NULL);
-
+
action = gtk_action_new (name,
label,
tip,
icon_name);
-
- if (icon_name != NULL) {
- icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_LARGE_TOOLBAR);
- info = nautilus_icon_info_lookup_from_name (icon_name, icon_size);
- pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, icon_size);
+ if (icon_name != NULL) {
+ pixbuf = get_action_icon (icon_name,
+ nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_LARGE_TOOLBAR));
if (pixbuf != NULL) {
g_object_set_data_full (G_OBJECT (action), "toolbar-icon",
pixbuf,
g_object_unref);
}
- g_object_unref (info);
}
-
+
gtk_action_set_sensitive (action, sensitive);
g_object_set (action, "is-important", priority, NULL);
-
+
g_signal_connect_data (action, "activate",
G_CALLBACK (extension_action_callback),
- g_object_ref (item),
+ g_object_ref (item),
(GClosureNotify)g_object_unref, 0);
g_signal_connect_object (item, "notify::sensitive",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]