diff options
-rw-r--r-- | src/nautilus-canvas-view.c | 263 | ||||
-rw-r--r-- | src/resources/ui/nautilus-toolbar-view-menu.ui | 42 |
2 files changed, 113 insertions, 192 deletions
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c index 563a48c65..8480a9117 100644 --- a/src/nautilus-canvas-view.c +++ b/src/nautilus-canvas-view.c @@ -74,6 +74,7 @@ typedef struct { const NautilusFileSortType sort_type; const char *metadata_text; const char *action_target_name; + const gboolean reverse_order; SortCriterionMatchFunc match_func; } SortCriterion; @@ -91,7 +92,6 @@ struct NautilusCanvasViewDetails guint react_to_canvas_change_idle_id; const SortCriterion *sort; - gboolean sort_reversed; gulong clipboard_handler_id; @@ -113,55 +113,79 @@ static const SortCriterion sort_criteria[] = { { NAUTILUS_FILE_SORT_BY_DISPLAY_NAME, "name", - "name" + "name", + FALSE }, + { + NAUTILUS_FILE_SORT_BY_DISPLAY_NAME, + "name", + "name-desc", + TRUE + }, { NAUTILUS_FILE_SORT_BY_SIZE, "size", - "size" + "size", + TRUE }, { NAUTILUS_FILE_SORT_BY_TYPE, "type", - "type" + "type", + FALSE }, { NAUTILUS_FILE_SORT_BY_MTIME, "modification date", "modification-date", + FALSE }, + { + NAUTILUS_FILE_SORT_BY_MTIME, + "modification date", + "modification-date-desc", + TRUE + }, { NAUTILUS_FILE_SORT_BY_ATIME, "access date", "access-date", + FALSE }, + { + NAUTILUS_FILE_SORT_BY_ATIME, + "access date", + "access-date-desc", + TRUE + }, { NAUTILUS_FILE_SORT_BY_TRASHED_TIME, "trashed", "trash-time", + TRUE, nautilus_file_is_in_trash }, { NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE, NULL, "search-relevance", + TRUE, nautilus_file_is_in_search } }; static void nautilus_canvas_view_set_directory_sort_by (NautilusCanvasView *canvas_view, NautilusFile *file, - const char *sort_by); + const SortCriterion *sort); static void nautilus_canvas_view_update_click_mode (NautilusCanvasView *canvas_view); static gboolean nautilus_canvas_view_supports_scaling (NautilusCanvasView *canvas_view); static void nautilus_canvas_view_reveal_selection (NautilusFilesView *view); -static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type); -static gboolean set_sort_reversed (NautilusCanvasView *canvas_view, - gboolean new_value, - gboolean set_metadata); +static const SortCriterion *get_sort_criterion_by_metadata_text (const char *metadata_text, + gboolean reversed); +static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type, + gboolean reversed); static void switch_to_manual_layout (NautilusCanvasView *view); -static NautilusFileSortType get_default_sort_order (NautilusFile *file, - gboolean *reversed); +static const SortCriterion *get_default_sort_order (NautilusFile *file); static void nautilus_canvas_view_clear (NautilusFilesView *view); G_DEFINE_TYPE (NautilusCanvasView, nautilus_canvas_view, NAUTILUS_TYPE_FILES_VIEW); @@ -268,7 +292,6 @@ update_sort_criterion (NautilusCanvasView *canvas_view, { NautilusFile *file; const SortCriterion *overrided_sort_criterion; - gboolean overrided_reversed; file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (canvas_view)); @@ -276,16 +299,14 @@ update_sort_criterion (NautilusCanvasView *canvas_view, * of the change to not allow sorting on search and recent, or the * case that the user or some app modified directly the metadata */ if (nautilus_file_is_in_search (file) || nautilus_file_is_in_recent (file)) { - overrided_sort_criterion = get_sort_criterion_by_sort_type (get_default_sort_order (file, NULL)); - nautilus_file_get_default_sort_attribute (file, &overrided_reversed); - set_sort_reversed (canvas_view, overrided_reversed, FALSE); + overrided_sort_criterion = get_default_sort_order (file); } else if (sort != NULL && canvas_view->details->sort != sort) { overrided_sort_criterion = sort; if (set_metadata) { /* Store the new sort setting. */ nautilus_canvas_view_set_directory_sort_by (canvas_view, file, - sort->metadata_text); + sort); } } else { return; @@ -298,20 +319,13 @@ void nautilus_canvas_view_clean_up_by_name (NautilusCanvasView *canvas_view) { NautilusCanvasContainer *canvas_container; - gboolean saved_sort_reversed; canvas_container = get_canvas_container (canvas_view); - /* Hardwire Clean Up to always be by name, in forward order */ - saved_sort_reversed = canvas_view->details->sort_reversed; - - set_sort_reversed (canvas_view, FALSE, FALSE); update_sort_criterion (canvas_view, &sort_criteria[0], FALSE); nautilus_canvas_container_sort (canvas_container); nautilus_canvas_container_freeze_icon_positions (canvas_container); - - set_sort_reversed (canvas_view, saved_sort_reversed, FALSE); } static gboolean @@ -452,54 +466,60 @@ nautilus_canvas_view_supports_keep_aligned (NautilusCanvasView *view) return view->details->supports_keep_aligned; } -static char * +static const SortCriterion * nautilus_canvas_view_get_directory_sort_by (NautilusCanvasView *canvas_view, NautilusFile *file) { - const SortCriterion *default_sort_criterion; + const SortCriterion *default_sort; + g_autofree char *sort_by = NULL; + gboolean reversed; if (!nautilus_canvas_view_supports_auto_layout (canvas_view)) { - return g_strdup ("name"); + return get_sort_criterion_by_metadata_text ("name", FALSE); } - default_sort_criterion = get_sort_criterion_by_sort_type (get_default_sort_order (file, NULL)); - g_return_val_if_fail (default_sort_criterion != NULL, NULL); + default_sort = get_default_sort_order (file); + g_return_val_if_fail (default_sort != NULL, NULL); - return nautilus_file_get_metadata - (file, NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY, - default_sort_criterion->metadata_text); + sort_by = nautilus_file_get_metadata (file, + NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY, + default_sort->metadata_text); + + reversed = nautilus_file_get_boolean_metadata (file, + NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, + default_sort->reverse_order); + + return get_sort_criterion_by_metadata_text (sort_by, reversed); } -static NautilusFileSortType -get_default_sort_order (NautilusFile *file, gboolean *reversed) +static const SortCriterion * +get_default_sort_order (NautilusFile *file) { - NautilusFileSortType retval, default_sort_order; - gboolean default_sort_in_reverse_order; + NautilusFileSortType sort_type, default_sort_order; + gboolean reversed; default_sort_order = g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER); - default_sort_in_reverse_order = g_settings_get_boolean (nautilus_preferences, - NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); - - retval = nautilus_file_get_default_sort_type (file, reversed); + reversed = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); - if (retval == NAUTILUS_FILE_SORT_NONE) { + /* If this is a special folder (e.g. search or recent), override the sort + * order and reversed flag with values appropriate for the folder */ + sort_type = nautilus_file_get_default_sort_type (file, &reversed); - if (reversed != NULL) { - *reversed = default_sort_in_reverse_order; - } - - retval = CLAMP (default_sort_order, NAUTILUS_FILE_SORT_BY_DISPLAY_NAME, - NAUTILUS_FILE_SORT_BY_ATIME); + if (sort_type == NAUTILUS_FILE_SORT_NONE) { + sort_type = CLAMP (default_sort_order, + NAUTILUS_FILE_SORT_BY_DISPLAY_NAME, + NAUTILUS_FILE_SORT_BY_ATIME); } - return retval; + return get_sort_criterion_by_sort_type (sort_type, reversed); } static void nautilus_canvas_view_set_directory_sort_by (NautilusCanvasView *canvas_view, NautilusFile *file, - const char *sort_by) + const SortCriterion *sort) { const SortCriterion *default_sort_criterion; @@ -507,48 +527,17 @@ nautilus_canvas_view_set_directory_sort_by (NautilusCanvasView *canvas_view, return; } - default_sort_criterion = get_sort_criterion_by_sort_type (get_default_sort_order (file, NULL)); + default_sort_criterion = get_default_sort_order (file); g_return_if_fail (default_sort_criterion != NULL); nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY, default_sort_criterion->metadata_text, - sort_by); -} - -static gboolean -nautilus_canvas_view_get_directory_sort_reversed (NautilusCanvasView *canvas_view, - NautilusFile *file) -{ - gboolean reversed; - - if (!nautilus_canvas_view_supports_auto_layout (canvas_view)) { - return FALSE; - } - - get_default_sort_order (file, &reversed); - return nautilus_file_get_boolean_metadata - (file, - NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, - reversed); -} - -static void -nautilus_canvas_view_set_directory_sort_reversed (NautilusCanvasView *canvas_view, - NautilusFile *file, - gboolean sort_reversed) -{ - gboolean reversed; - - if (!nautilus_canvas_view_supports_auto_layout (canvas_view)) { - return; - } - - get_default_sort_order (file, &reversed); - nautilus_file_set_boolean_metadata - (file, - NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, - reversed, sort_reversed); + sort->metadata_text); + nautilus_file_set_boolean_metadata (file, + NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, + default_sort_criterion->reverse_order, + sort->reverse_order); } static gboolean @@ -618,36 +607,19 @@ nautilus_canvas_view_set_directory_auto_layout (NautilusCanvasView *canvas_view, auto_layout); } -static gboolean -set_sort_reversed (NautilusCanvasView *canvas_view, - gboolean new_value, - gboolean set_metadata) -{ - if (canvas_view->details->sort_reversed == new_value) { - return FALSE; - } - canvas_view->details->sort_reversed = new_value; - - if (set_metadata) { - /* Store the new sort setting. */ - nautilus_canvas_view_set_directory_sort_reversed (canvas_view, nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (canvas_view)), new_value); - } - - return TRUE; -} - static const SortCriterion * -get_sort_criterion_by_metadata_text (const char *metadata_text) +get_sort_criterion_by_metadata_text (const char *metadata_text, gboolean reversed) { guint i; /* Figure out what the new sort setting should be. */ for (i = 0; i < G_N_ELEMENTS (sort_criteria); i++) { - if (g_strcmp0 (sort_criteria[i].metadata_text, metadata_text) == 0) { + if (g_strcmp0 (sort_criteria[i].metadata_text, metadata_text) == 0 + && reversed == sort_criteria[i].reverse_order) { return &sort_criteria[i]; } } - return NULL; + return &sort_criteria[0]; } static const SortCriterion * @@ -664,13 +636,14 @@ get_sort_criterion_by_action_target_name (const char *action_target_name) } static const SortCriterion * -get_sort_criterion_by_sort_type (NautilusFileSortType sort_type) +get_sort_criterion_by_sort_type (NautilusFileSortType sort_type, gboolean reversed) { guint i; /* Figure out what the new sort setting should be. */ for (i = 0; i < G_N_ELEMENTS (sort_criteria); i++) { - if (sort_type == sort_criteria[i].sort_type) { + if (sort_type == sort_criteria[i].sort_type + && reversed == sort_criteria[i].reverse_order) { return &sort_criteria[i]; } } @@ -695,7 +668,8 @@ nautilus_canvas_view_begin_loading (NautilusFilesView *view) NautilusCanvasView *canvas_view; GtkWidget *canvas_container; NautilusFile *file; - char *sort_name, *uri; + char *uri; + const SortCriterion *sort; g_return_if_fail (NAUTILUS_IS_CANVAS_VIEW (view)); @@ -712,12 +686,8 @@ nautilus_canvas_view_begin_loading (NautilusFilesView *view) * It's OK not to resort the icons because the * container doesn't have any icons at this point. */ - sort_name = nautilus_canvas_view_get_directory_sort_by (canvas_view, file); - update_sort_criterion (canvas_view, get_sort_criterion_by_metadata_text (sort_name), FALSE); - g_free (sort_name); - - /* Set the sort direction from the metadata. */ - set_sort_reversed (canvas_view, nautilus_canvas_view_get_directory_sort_reversed (canvas_view, file), FALSE); + sort = nautilus_canvas_view_get_directory_sort_by (canvas_view, file); + update_sort_criterion (canvas_view, sort, FALSE); nautilus_canvas_container_set_keep_aligned (get_canvas_container (canvas_view), @@ -893,24 +863,6 @@ nautilus_canvas_view_get_selection (NautilusFilesView *view) } static void -action_reversed_order (GSimpleAction *action, - GVariant *state, - gpointer user_data) -{ - gboolean reversed_order; - - g_assert (NAUTILUS_IS_CANVAS_VIEW (user_data)); - - reversed_order = g_variant_get_boolean (state); - if (set_sort_reversed (user_data, reversed_order, TRUE)) { - nautilus_canvas_container_sort (get_canvas_container (user_data)); - nautilus_canvas_view_reveal_selection (NAUTILUS_FILES_VIEW (user_data)); - } - - g_simple_action_set_state (action, state); -} - -static void action_keep_aligned (GSimpleAction *action, GVariant *state, gpointer user_data) @@ -1019,7 +971,6 @@ layout_changed_callback (NautilusCanvasContainer *container, const GActionEntry canvas_view_entries[] = { { "keep-aligned", NULL, NULL, "true", action_keep_aligned }, - { "reversed-order", NULL, NULL, "false", action_reversed_order }, { "sort", NULL, "s", "'name'", action_sort_order_changed }, { "zoom-to-level", NULL, NULL, "1", action_zoom_to_level } }; @@ -1091,7 +1042,6 @@ nautilus_canvas_view_update_actions_state (NautilusFilesView *view) view_action_group = nautilus_files_view_get_action_group (view); if (nautilus_canvas_view_supports_auto_layout (canvas_view)) { GVariant *sort_state; - GVariant *reversed_state; /* When we change the sort action state, even using the same value, it triggers * the sort action changed handler, which reveals the selection, since we expect @@ -1099,16 +1049,9 @@ nautilus_canvas_view_update_actions_state (NautilusFilesView *view) * need to update the actions state for others reason than an actual sort change, * so we need to prevent to trigger the sort action changed handler for those cases. * To achieve this, check if the action state value actually changed before setting - * it. The same happens to the reversed-order state. + * it */ sort_state = g_action_group_get_action_state (view_action_group, "sort"); - reversed_state = g_action_group_get_action_state (view_action_group, "reversed-order"); - - if (NAUTILUS_CANVAS_VIEW (view)->details->sort_reversed != g_variant_get_boolean (reversed_state)) { - g_action_group_change_action_state (view_action_group, - "reversed-order", - g_variant_new_boolean (NAUTILUS_CANVAS_VIEW (view)->details->sort_reversed)); - } if (g_strcmp0 (g_variant_get_string (sort_state, NULL), NAUTILUS_CANVAS_VIEW (view)->details->sort->action_target_name) != 0) { @@ -1117,7 +1060,6 @@ nautilus_canvas_view_update_actions_state (NautilusFilesView *view) g_variant_new_string (NAUTILUS_CANVAS_VIEW (view)->details->sort->action_target_name)); } - g_variant_unref (reversed_state); g_variant_unref (sort_state); } @@ -1363,7 +1305,7 @@ nautilus_canvas_view_compare_files (NautilusCanvasView *canvas_view, (a, b, canvas_view->details->sort->sort_type, /* Use type-unsafe cast for performance */ nautilus_files_view_should_sort_directories_first ((NautilusFilesView *)canvas_view), - canvas_view->details->sort_reversed); + canvas_view->details->sort->reverse_order); } static int @@ -1506,7 +1448,7 @@ default_sort_order_changed_callback (gpointer callback_data) { NautilusCanvasView *canvas_view; NautilusFile *file; - char *sort_name; + const SortCriterion *sort; NautilusCanvasContainer *canvas_container; g_return_if_fail (NAUTILUS_IS_CANVAS_VIEW (callback_data)); @@ -1514,9 +1456,8 @@ default_sort_order_changed_callback (gpointer callback_data) canvas_view = NAUTILUS_CANVAS_VIEW (callback_data); file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (canvas_view)); - sort_name = nautilus_canvas_view_get_directory_sort_by (canvas_view, file); - update_sort_criterion (canvas_view, get_sort_criterion_by_metadata_text (sort_name), FALSE); - g_free (sort_name); + sort = nautilus_canvas_view_get_directory_sort_by (canvas_view, file); + update_sort_criterion (canvas_view, sort, FALSE); canvas_container = get_canvas_container (canvas_view); g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (canvas_container)); @@ -1525,25 +1466,6 @@ default_sort_order_changed_callback (gpointer callback_data) } static void -default_sort_in_reverse_order_changed_callback (gpointer callback_data) -{ - NautilusCanvasView *canvas_view; - NautilusFile *file; - NautilusCanvasContainer *canvas_container; - - g_return_if_fail (NAUTILUS_IS_CANVAS_VIEW (callback_data)); - - canvas_view = NAUTILUS_CANVAS_VIEW (callback_data); - - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (canvas_view)); - set_sort_reversed (canvas_view, nautilus_canvas_view_get_directory_sort_reversed (canvas_view, file), FALSE); - canvas_container = get_canvas_container (canvas_view); - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (canvas_container)); - - nautilus_canvas_container_request_update_all (canvas_container); -} - -static void nautilus_canvas_view_sort_directories_first_changed (NautilusFilesView *directory_view) { NautilusCanvasView *canvas_view; @@ -1874,9 +1796,6 @@ nautilus_canvas_view_finalize (GObject *object) default_sort_order_changed_callback, canvas_view); g_signal_handlers_disconnect_by_func (nautilus_preferences, - default_sort_in_reverse_order_changed_callback, - canvas_view); - g_signal_handlers_disconnect_by_func (nautilus_preferences, image_display_policy_changed_callback, canvas_view); @@ -1994,7 +1913,7 @@ nautilus_canvas_view_init (NautilusCanvasView *canvas_view) canvas_view); g_signal_connect_swapped (nautilus_preferences, "changed::" NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER, - G_CALLBACK (default_sort_in_reverse_order_changed_callback), + G_CALLBACK (default_sort_order_changed_callback), canvas_view); g_signal_connect_swapped (nautilus_preferences, "changed::" NAUTILUS_PREFERENCES_SHOW_FILE_THUMBNAILS, diff --git a/src/resources/ui/nautilus-toolbar-view-menu.ui b/src/resources/ui/nautilus-toolbar-view-menu.ui index 6bbe3b26c..8c66c9a89 100644 --- a/src/resources/ui/nautilus-toolbar-view-menu.ui +++ b/src/resources/ui/nautilus-toolbar-view-menu.ui @@ -218,61 +218,63 @@ <object class="GtkModelButton" id="sort_name"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="text" translatable="yes" context="Sort Criterion" comments="This is used to sort by name in the toolbar view menu">_Name</property> + <property name="text" translatable="yes" context="Sort Criterion" comments="This is used to sort by name in the toolbar view menu">_A-Z</property> <property name="action-name">view.sort</property> <property name="action-target">'name'</property> </object> </child> <child> - <object class="GtkModelButton" id="sort_size"> + <object class="GtkModelButton" id="sort_name_desc"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="text" translatable="yes">_Size</property> + <property name="text" translatable="yes" context="Sort Criterion" comments="This is used to sort by name, in descending order in the toolbar view menu">_Z-A</property> <property name="action-name">view.sort</property> - <property name="action-target">'size'</property> + <property name="action-target">'name-desc'</property> </object> </child> <child> - <object class="GtkModelButton" id="sort_type"> + <object class="GtkModelButton" id="sort_modification_date_desc"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="text" translatable="yes">_Type</property> + <property name="text" translatable="yes">Last _Modified</property> <property name="action-name">view.sort</property> - <property name="action-target">'type'</property> + <property name="action-target">'modification-date-desc'</property> </object> </child> <child> <object class="GtkModelButton" id="sort_modification_date"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="text" translatable="yes">Last _Modified</property> + <property name="text" translatable="yes">_First Modified</property> <property name="action-name">view.sort</property> <property name="action-target">'modification-date'</property> </object> </child> <child> - <object class="GtkModelButton" id="sort_trash_time"> - <property name="visible">False</property> + <object class="GtkModelButton" id="sort_size"> + <property name="visible">True</property> <property name="can_focus">True</property> - <property name="text" translatable="yes">Last _Trashed</property> + <property name="text" translatable="yes">_Size</property> <property name="action-name">view.sort</property> - <property name="action-target">'trash-time'</property> + <property name="action-target">'size'</property> </object> </child> <child> - <object class="GtkSeparator"> + <object class="GtkModelButton" id="sort_type"> <property name="visible">True</property> - <property name="orientation">horizontal</property> - <property name="margin-top">6</property> - <property name="margin-bottom">6</property> + <property name="can_focus">True</property> + <property name="text" translatable="yes">_Type</property> + <property name="action-name">view.sort</property> + <property name="action-target">'type'</property> </object> </child> <child> - <object class="GtkModelButton" id="reversed_order"> - <property name="visible">True</property> + <object class="GtkModelButton" id="sort_trash_time"> + <property name="visible">False</property> <property name="can_focus">True</property> - <property name="text" translatable="yes">Re_verse Order</property> - <property name="action-name">view.reversed-order</property> + <property name="text" translatable="yes">Last _Trashed</property> + <property name="action-name">view.sort</property> + <property name="action-target">'trash-time'</property> </object> </child> </object> |