[nautilus] file: refactor icon loading
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] file: refactor icon loading
- Date: Tue, 9 Sep 2014 22:52:12 +0000 (UTC)
commit 060d9903869470a17afe6d86a331e86a78db01c3
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Tue Sep 9 13:51:10 2014 -0700
file: refactor icon loading
Separate things out in different functions, and avoid exposing emblems
as public API.
libnautilus-private/nautilus-file.c | 414 ++++++++++++++++++----------------
libnautilus-private/nautilus-file.h | 1 -
2 files changed, 219 insertions(+), 196 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index c63105d..29882c9 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -3950,6 +3950,23 @@ get_custom_icon_metadata_name (NautilusFile *file)
}
static GIcon *
+get_mount_icon (NautilusFile *file)
+{
+ GMount *mount;
+ GIcon *mount_icon;
+
+ mount = nautilus_file_get_mount (file);
+ mount_icon = NULL;
+
+ if (mount != NULL) {
+ mount_icon = g_mount_get_icon (mount);
+ g_object_unref (mount);
+ }
+
+ return mount_icon;
+}
+
+static GIcon *
get_link_icon (NautilusFile *file)
{
GIcon *icon = NULL;
@@ -4079,6 +4096,154 @@ nautilus_is_video_file (NautilusFile *file)
return FALSE;
}
+static GList *
+sort_keyword_list_and_remove_duplicates (GList *keywords)
+{
+ GList *p;
+ GList *duplicate_link;
+
+ if (keywords != NULL) {
+ keywords = g_list_sort (keywords, (GCompareFunc) g_utf8_collate);
+
+ p = keywords;
+ while (p->next != NULL) {
+ if (strcmp ((const char *) p->data, (const char *) p->next->data) == 0) {
+ duplicate_link = p->next;
+ keywords = g_list_remove_link (keywords, duplicate_link);
+ g_list_free_full (duplicate_link, g_free);
+ } else {
+ p = p->next;
+ }
+ }
+ }
+
+ return keywords;
+}
+
+static void
+clean_up_metadata_keywords (NautilusFile *file,
+ GList **metadata_keywords)
+{
+ NautilusFile *parent_file;
+ GList *l, *res = NULL;
+ char *exclude[4];
+ char *keyword;
+ gboolean found;
+ gint i;
+
+ i = 0;
+ exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_TRASH;
+ exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_NOTE;
+
+ parent_file = nautilus_file_get_parent (file);
+ if (parent_file) {
+ if (!nautilus_file_can_write (parent_file)) {
+ exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_CANT_WRITE;
+ }
+ nautilus_file_unref (parent_file);
+ }
+ exclude[i++] = NULL;
+
+ for (l = *metadata_keywords; l != NULL; l = l->next) {
+ keyword = l->data;
+ found = FALSE;
+
+ for (i = 0; exclude[i] != NULL; i++) {
+ if (strcmp (exclude[i], keyword) == 0) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ res = g_list_prepend (res, keyword);
+ }
+ }
+
+ g_list_free (*metadata_keywords);
+ *metadata_keywords = res;
+}
+
+/**
+ * nautilus_file_get_keywords
+ *
+ * Return this file's keywords.
+ * @file: NautilusFile representing the file in question.
+ *
+ * Returns: A list of keywords.
+ *
+ **/
+static GList *
+nautilus_file_get_keywords (NautilusFile *file)
+{
+ GList *keywords, *metadata_keywords;
+
+ if (file == NULL) {
+ return NULL;
+ }
+
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ keywords = g_list_copy_deep (file->details->extension_emblems, (GCopyFunc) g_strdup, NULL);
+ keywords = g_list_concat (keywords, g_list_copy_deep (file->details->pending_extension_emblems,
(GCopyFunc) g_strdup, NULL));
+
+ metadata_keywords = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_EMBLEMS);
+ clean_up_metadata_keywords (file, &metadata_keywords);
+ keywords = g_list_concat (keywords, metadata_keywords);
+
+ return sort_keyword_list_and_remove_duplicates (keywords);
+}
+
+/**
+ * nautilus_file_get_emblem_icons
+ *
+ * Return the list of names of emblems that this file should display,
+ * in canonical order.
+ * @file: NautilusFile representing the file in question.
+ *
+ * Returns: A list of emblem names.
+ *
+ **/
+static GList *
+nautilus_file_get_emblem_icons (NautilusFile *file)
+{
+ GList *keywords, *l;
+ GList *icons;
+ char *icon_names[2];
+ char *keyword;
+ GIcon *icon;
+
+ if (file == NULL) {
+ return NULL;
+ }
+
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ keywords = nautilus_file_get_keywords (file);
+ keywords = prepend_automatic_keywords (file, keywords);
+
+ icons = NULL;
+ for (l = keywords; l != NULL; l = l->next) {
+ keyword = l->data;
+
+ icon_names[0] = g_strconcat ("emblem-", keyword, NULL);
+ icon_names[1] = keyword;
+ icon = g_themed_icon_new_from_names (icon_names, 2);
+ g_free (icon_names[0]);
+
+ icons = g_list_prepend (icons, icon);
+ }
+
+ icon = get_mount_icon (file);
+ if (icon != NULL) {
+ icons = g_list_prepend (icons, icon);
+ }
+
+ g_list_free_full (keywords, g_free);
+
+ return icons;
+}
+
static void
prepend_icon_name (const char *name,
GThemedIcon *icon)
@@ -4086,6 +4251,48 @@ prepend_icon_name (const char *name,
g_themed_icon_prepend_name(icon, name);
}
+static GIcon *
+apply_emblems_to_icon (NautilusFile *file,
+ GIcon *icon,
+ NautilusFileIconFlags flags)
+{
+ GIcon *emblemed_icon;
+ GEmblem *emblem;
+ GList *emblems, *l;
+
+ emblemed_icon = NULL;
+ emblems = nautilus_file_get_emblem_icons (file);
+
+ for (l = emblems; l != NULL; l = l->next) {
+ if (g_icon_equal (l->data, icon)) {
+ continue;
+ }
+
+ emblem = g_emblem_new (l->data);
+
+ if (emblemed_icon == NULL) {
+ emblemed_icon = g_emblemed_icon_new (icon, emblem);
+ } else {
+ g_emblemed_icon_add_emblem (G_EMBLEMED_ICON (emblemed_icon), emblem);
+ }
+
+ if (emblemed_icon != NULL &&
+ (flags & NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM)) {
+ break;
+ }
+ }
+
+ if (emblems != NULL) {
+ g_list_free_full (emblems, g_object_unref);
+ }
+
+ if (emblemed_icon != NULL) {
+ return emblemed_icon;
+ } else {
+ return g_object_ref (icon);
+ }
+}
+
GIcon *
nautilus_file_get_gicon (NautilusFile *file,
NautilusFileIconFlags flags)
@@ -4093,10 +4300,7 @@ nautilus_file_get_gicon (NautilusFile *file,
const char * const * names;
const char *name;
GPtrArray *prepend_array;
- GMount *mount;
- GList *emblems, *l;
- GIcon *icon, *mount_icon = NULL, *emblemed_icon = NULL;
- GEmblem *emblem;
+ GIcon *icon, *emblemed_icon;
int i;
gboolean is_folder = FALSE, is_preview = FALSE, is_inode_directory = FALSE;
@@ -4116,19 +4320,16 @@ nautilus_file_get_gicon (NautilusFile *file,
return icon;
}
- if (file->details->icon) {
- icon = NULL;
-
- /* fetch the mount icon here, we'll use it later */
- if (flags & NAUTILUS_FILE_ICON_FLAGS_USE_MOUNT_ICON ||
- flags & NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS) {
- mount = nautilus_file_get_mount (file);
+ if (flags & NAUTILUS_FILE_ICON_FLAGS_USE_MOUNT_ICON) {
+ icon = get_mount_icon (file);
- if (mount != NULL) {
- mount_icon = g_mount_get_icon (mount);
- g_object_unref (mount);
- }
+ if (icon != NULL) {
+ return icon;
}
+ }
+
+ if (file->details->icon) {
+ icon = NULL;
if (((flags & NAUTILUS_FILE_ICON_FLAGS_EMBEDDING_TEXT) ||
(flags & NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT) ||
@@ -4193,44 +4394,10 @@ nautilus_file_get_gicon (NautilusFile *file,
icon = g_object_ref (file->details->icon);
}
- if ((flags & NAUTILUS_FILE_ICON_FLAGS_USE_MOUNT_ICON) &&
- mount_icon != NULL) {
+ if (flags & NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS) {
+ emblemed_icon = apply_emblems_to_icon (file, icon, flags);
g_object_unref (icon);
- icon = mount_icon;
- } else if (flags & NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS) {
- emblems = nautilus_file_get_emblem_icons (file);
-
- if (mount_icon != NULL) {
- emblems = g_list_prepend (emblems, mount_icon);
- }
-
- for (l = emblems; l != NULL; l = l->next) {
- if (g_icon_equal (l->data, icon)) {
- continue;
- }
-
- emblem = g_emblem_new (l->data);
-
- if (emblemed_icon == NULL) {
- emblemed_icon = g_emblemed_icon_new (icon, emblem);
- } else {
- g_emblemed_icon_add_emblem (G_EMBLEMED_ICON (emblemed_icon), emblem);
- }
-
- if (emblemed_icon != NULL &&
- (flags & NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM)) {
- break;
- }
- }
-
- if (emblemed_icon != NULL) {
- g_object_unref (icon);
- icon = emblemed_icon;
- }
-
- if (emblems != NULL) {
- g_list_free_full (emblems, g_object_unref);
- }
+ icon = emblemed_icon;
}
return icon;
@@ -6429,149 +6596,6 @@ nautilus_file_is_launchable (NautilusFile *file)
!nautilus_file_is_directory (file);
}
-static GList *
-sort_keyword_list_and_remove_duplicates (GList *keywords)
-{
- GList *p;
- GList *duplicate_link;
-
- if (keywords != NULL) {
- keywords = g_list_sort (keywords, (GCompareFunc) g_utf8_collate);
-
- p = keywords;
- while (p->next != NULL) {
- if (strcmp ((const char *) p->data, (const char *) p->next->data) == 0) {
- duplicate_link = p->next;
- keywords = g_list_remove_link (keywords, duplicate_link);
- g_list_free_full (duplicate_link, g_free);
- } else {
- p = p->next;
- }
- }
- }
-
- return keywords;
-}
-
-static void
-clean_up_metadata_keywords (NautilusFile *file,
- GList **metadata_keywords)
-{
- NautilusFile *parent_file;
- GList *l, *res = NULL;
- char *exclude[4];
- char *keyword;
- gboolean found;
- gint i;
-
- i = 0;
- exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_TRASH;
- exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_NOTE;
-
- parent_file = nautilus_file_get_parent (file);
- if (parent_file) {
- if (!nautilus_file_can_write (parent_file)) {
- exclude[i++] = NAUTILUS_FILE_EMBLEM_NAME_CANT_WRITE;
- }
- nautilus_file_unref (parent_file);
- }
- exclude[i++] = NULL;
-
- for (l = *metadata_keywords; l != NULL; l = l->next) {
- keyword = l->data;
- found = FALSE;
-
- for (i = 0; exclude[i] != NULL; i++) {
- if (strcmp (exclude[i], keyword) == 0) {
- found = TRUE;
- break;
- }
- }
-
- if (!found) {
- res = g_list_prepend (res, keyword);
- }
- }
-
- g_list_free (*metadata_keywords);
- *metadata_keywords = res;
-}
-
-/**
- * nautilus_file_get_keywords
- *
- * Return this file's keywords.
- * @file: NautilusFile representing the file in question.
- *
- * Returns: A list of keywords.
- *
- **/
-static GList *
-nautilus_file_get_keywords (NautilusFile *file)
-{
- GList *keywords, *metadata_keywords;
-
- if (file == NULL) {
- return NULL;
- }
-
- g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
-
- keywords = g_list_copy_deep (file->details->extension_emblems, (GCopyFunc) g_strdup, NULL);
- keywords = g_list_concat (keywords, g_list_copy_deep (file->details->pending_extension_emblems,
(GCopyFunc) g_strdup, NULL));
-
- metadata_keywords = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_EMBLEMS);
- clean_up_metadata_keywords (file, &metadata_keywords);
- keywords = g_list_concat (keywords, metadata_keywords);
-
- return sort_keyword_list_and_remove_duplicates (keywords);
-}
-
-/**
- * nautilus_file_get_emblem_icons
- *
- * Return the list of names of emblems that this file should display,
- * in canonical order.
- * @file: NautilusFile representing the file in question.
- *
- * Returns: A list of emblem names.
- *
- **/
-GList *
-nautilus_file_get_emblem_icons (NautilusFile *file)
-{
- GList *keywords, *l;
- GList *icons;
- char *icon_names[2];
- char *keyword;
- GIcon *icon;
-
- if (file == NULL) {
- return NULL;
- }
-
- g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
-
- keywords = nautilus_file_get_keywords (file);
- keywords = prepend_automatic_keywords (file, keywords);
-
- icons = NULL;
- for (l = keywords; l != NULL; l = l->next) {
- keyword = l->data;
-
- icon_names[0] = g_strconcat ("emblem-", keyword, NULL);
- icon_names[1] = keyword;
- icon = g_themed_icon_new_from_names (icon_names, 2);
- g_free (icon_names[0]);
-
- icons = g_list_prepend (icons, icon);
- }
-
- g_list_free_full (keywords, g_free);
-
- return icons;
-}
-
/**
* nautilus_file_is_symbolic_link
*
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index 0bd8025..5d8cee2 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -210,7 +210,6 @@ NautilusRequestStatus nautilus_file_get_deep_counts (Nautilu
gboolean nautilus_file_should_show_thumbnail (NautilusFile
*file);
gboolean nautilus_file_should_show_directory_item_count (NautilusFile
*file);
gboolean nautilus_file_should_show_type (NautilusFile
*file);
-GList * nautilus_file_get_emblem_icons (NautilusFile
*file);
gboolean nautilus_file_get_directory_item_mime_types (NautilusFile
*file,
GList
**mime_list);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]