diff options
Diffstat (limited to 'nautilus-desktop/nautilus-desktop-canvas-view-container.c')
-rw-r--r-- | nautilus-desktop/nautilus-desktop-canvas-view-container.c | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/nautilus-desktop/nautilus-desktop-canvas-view-container.c b/nautilus-desktop/nautilus-desktop-canvas-view-container.c new file mode 100644 index 000000000..a92ca4f2a --- /dev/null +++ b/nautilus-desktop/nautilus-desktop-canvas-view-container.c @@ -0,0 +1,201 @@ +/* nautilus-desktop-canvas-view-container.c + * + * Copyright (C) 2016 Carlos Soriano <csoriano@gnome.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "nautilus-desktop-canvas-view-container.h" +#include "nautilus-desktop-icon-file.h" + +struct _NautilusDesktopCanvasViewContainer +{ + NautilusCanvasViewContainer parent_instance; +}; + +G_DEFINE_TYPE (NautilusDesktopCanvasViewContainer, nautilus_desktop_canvas_view_container, NAUTILUS_TYPE_CANVAS_VIEW_CONTAINER) + +/* Sort as follows: + * 0) home link + * 1) network link + * 2) mount links + * 3) other + * 4) trash link + */ +typedef enum { + SORT_HOME_LINK, + SORT_NETWORK_LINK, + SORT_MOUNT_LINK, + SORT_OTHER, + SORT_TRASH_LINK +} SortCategory; + +static SortCategory +get_sort_category (NautilusFile *file) +{ + NautilusDesktopLink *link; + SortCategory category; + + category = SORT_OTHER; + + if (NAUTILUS_IS_DESKTOP_ICON_FILE (file)) + { + link = nautilus_desktop_icon_file_get_link (NAUTILUS_DESKTOP_ICON_FILE (file)); + if (link != NULL) + { + switch (nautilus_desktop_link_get_link_type (link)) + { + case NAUTILUS_DESKTOP_LINK_HOME: + category = SORT_HOME_LINK; + break; + case NAUTILUS_DESKTOP_LINK_MOUNT: + category = SORT_MOUNT_LINK; + break; + case NAUTILUS_DESKTOP_LINK_TRASH: + category = SORT_TRASH_LINK; + break; + case NAUTILUS_DESKTOP_LINK_NETWORK: + category = SORT_NETWORK_LINK; + break; + default: + category = SORT_OTHER; + break; + } + g_object_unref (link); + } + } + + return category; +} + +static int +real_compare_icons (NautilusCanvasContainer *container, + NautilusCanvasIconData *data_a, + NautilusCanvasIconData *data_b) +{ + NautilusFile *file_a; + NautilusFile *file_b; + NautilusFilesView *directory_view; + SortCategory category_a, category_b; + + file_a = (NautilusFile *) data_a; + file_b = (NautilusFile *) data_b; + + directory_view = NAUTILUS_FILES_VIEW (NAUTILUS_CANVAS_VIEW_CONTAINER (container)->view); + g_return_val_if_fail (directory_view != NULL, 0); + + category_a = get_sort_category (file_a); + category_b = get_sort_category (file_b); + + if (category_a == category_b) + { + return nautilus_file_compare_for_sort (file_a, + file_b, + NAUTILUS_FILE_SORT_BY_DISPLAY_NAME, + nautilus_files_view_should_sort_directories_first (directory_view), + FALSE); + } + + if (category_a < category_b) + { + return -1; + } + else + { + return +1; + } +} + +static void +real_get_icon_text (NautilusCanvasContainer *container, + NautilusCanvasIconData *data, + char **editable_text, + char **additional_text, + gboolean include_invisible) +{ + NautilusFile *file; + gboolean use_additional; + + file = NAUTILUS_FILE (data); + + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (editable_text != NULL); + + use_additional = (additional_text != NULL); + + /* Strip the suffix for nautilus object xml files. */ + *editable_text = nautilus_file_get_display_name (file); + + if (!use_additional) { + return; + } + + if (NAUTILUS_IS_DESKTOP_ICON_FILE (file) || + nautilus_file_is_nautilus_link (file)) + { + /* Don't show the normal extra information for desktop icons, + * or desktop files, it doesn't make sense. + */ + *additional_text = NULL; + + return; + } + + return NAUTILUS_CANVAS_CONTAINER_CLASS (G_OBJECT_GET_CLASS (container))->get_icon_text (container, + data, + editable_text, + additional_text, + include_invisible); +} + +static char * +real_get_icon_description (NautilusCanvasContainer *container, + NautilusCanvasIconData *data) +{ + NautilusFile *file; + + file = NAUTILUS_FILE (data); + g_assert (NAUTILUS_IS_FILE (file)); + + if (NAUTILUS_IS_DESKTOP_ICON_FILE (file)) + { + return NULL; + } + else + { + return NAUTILUS_CANVAS_CONTAINER_CLASS (G_OBJECT_GET_CLASS (container))->get_icon_description (container, + data); + } +} + +NautilusDesktopCanvasViewContainer * +nautilus_desktop_canvas_view_container_new (void) +{ + return g_object_new (NAUTILUS_TYPE_DESKTOP_CANVAS_VIEW_CONTAINER, NULL); +} + +static void +nautilus_desktop_canvas_view_container_class_init (NautilusDesktopCanvasViewContainerClass *klass) +{ + NautilusCanvasContainerClass *container_class = NAUTILUS_CANVAS_CONTAINER_CLASS (klass); + + container_class->get_icon_description = real_get_icon_description; + container_class->get_icon_text = real_get_icon_text; + container_class->compare_icons = real_compare_icons; +} + +static void +nautilus_desktop_canvas_view_container_init (NautilusDesktopCanvasViewContainer *self) +{ +} |