diff options
-rw-r--r-- | ChangeLog | 29 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-metadata.h | 1 | ||||
-rw-r--r-- | libnautilus-private/nautilus-metadata.h | 1 | ||||
-rw-r--r-- | src/file-manager/fm-icon-view.c | 140 |
4 files changed, 156 insertions, 15 deletions
@@ -1,3 +1,27 @@ +2000-05-18 John Sullivan <sullivan@eazel.com> + + Added the ability to switch sort order in Icons view. Note + that one time while developing this I saw a problem at startup + where the icons all danced back and forth a few pixels forever. + I can't reproduce this, so I don't think my changes caused it, + but be wary of the evil jig-dancing icons. + + * libnautilus-extensions/nautilus-metadata.h: + Added #define for icon view sort direction. + + * src/file-manager/fm-icon-view.c: + Added sort_reversed to FMIconViewDetails; + (update_layout_menus): Set sensitivity of "Ascending"/"Descending" + menu items appropriately, and activate the right one. + (set_sort_reversed), (get_sort_reversed_from_menu_path), + (sort_direction_callback): New functions used for setting + the sort direction. + (fm_icon_view_begin_loading): Read sort direction from metadata. + (fm_icon_view_merge_menus): Add sort-direction menu items to + Layout menu. + (icon_container_compare_icons_callback): Take sort direction + into account. + 2000-05-18 Andy Hertzfeld <andy@eazel.com> * components/music/Makefile.am: @@ -7,8 +31,9 @@ (slider_moved_callback), (slider_release_callback), (volume_callback), (xpm_label_box), (add_play_controls), (nautilus_music_view_update_from_uri): - added a "bitrate" column to the music view, started adding the play controls, but - not yet finished, so they're disabled for now + added a "bitrate" column to the music view, started adding + the play controls, but not yet finished, so they're + disabled for now * components/music/pixmaps.h: some inline images for the buttons diff --git a/libnautilus-extensions/nautilus-metadata.h b/libnautilus-extensions/nautilus-metadata.h index 650f5b5b1..cba7e54e8 100644 --- a/libnautilus-extensions/nautilus-metadata.h +++ b/libnautilus-extensions/nautilus-metadata.h @@ -40,6 +40,7 @@ #define NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL "ICONS_ZOOM_LEVEL" #define NAUTILUS_METADATA_KEY_ICON_VIEW_AUTO_LAYOUT "ICONS_AUTO_LAYOUT" #define NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY "ICONS_SORT_BY" +#define NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED "ICONS_SORT_REVERSED" #define NAUTILUS_METADATA_KEY_LIST_VIEW_ZOOM_LEVEL "LIST_ZOOM_LEVEL" #define NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN "LIST_SORT_COLUMN" diff --git a/libnautilus-private/nautilus-metadata.h b/libnautilus-private/nautilus-metadata.h index 650f5b5b1..cba7e54e8 100644 --- a/libnautilus-private/nautilus-metadata.h +++ b/libnautilus-private/nautilus-metadata.h @@ -40,6 +40,7 @@ #define NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL "ICONS_ZOOM_LEVEL" #define NAUTILUS_METADATA_KEY_ICON_VIEW_AUTO_LAYOUT "ICONS_AUTO_LAYOUT" #define NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY "ICONS_SORT_BY" +#define NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED "ICONS_SORT_REVERSED" #define NAUTILUS_METADATA_KEY_LIST_VIEW_ZOOM_LEVEL "LIST_ZOOM_LEVEL" #define NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN "LIST_SORT_COLUMN" diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index ee18d26ec..4ee8656b1 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -55,14 +55,18 @@ #include <libnautilus-extensions/nautilus-icon-container.h> /* Paths to use when creating & referring to Bonobo menu items */ -#define MENU_PATH_STRETCH_ICON "/Settings/Stretch" -#define MENU_PATH_UNSTRETCH_ICONS "/Settings/Unstretch" -#define MENU_PATH_AFTER_STRETCH_SEPARATOR "/Settings/After Stretch Separator" -#define MENU_PATH_CUSTOMIZE_ICON_TEXT "/Settings/Icon Text" -#define MENU_PATH_LAYOUT_MENU "/Layout" -#define MENU_PATH_MANUAL_LAYOUT "/Layout/Manual Layout" -#define MENU_PATH_LAYOUT_SEPARATOR "/Layout/Separator" -#define MENU_PATH_RENAME "/File/Rename" +#define MENU_PATH_STRETCH_ICON "/Settings/Stretch" +#define MENU_PATH_UNSTRETCH_ICONS "/Settings/Unstretch" +#define MENU_PATH_AFTER_STRETCH_SEPARATOR "/Settings/After Stretch Separator" +#define MENU_PATH_CUSTOMIZE_ICON_TEXT "/Settings/Icon Text" +#define MENU_PATH_LAYOUT_MENU "/Layout" +#define MENU_PATH_MANUAL_LAYOUT "/Layout/Manual Layout" +#define MENU_PATH_LAYOUT_SEPARATOR "/Layout/Separator" +#define MENU_PATH_SORT_DIRECTION_SEPARATOR "/Layout/SortDirectionSeparator" +#define MENU_PATH_SORT_DIRECTION_RADIO_GROUP "/Layout/SortDirectionRadioGroup" +#define MENU_PATH_SORT_ASCENDING "/Layout/Ascending" +#define MENU_PATH_SORT_DESCENDING "/Layout/Descending" +#define MENU_PATH_RENAME "/File/Rename" /* forward declarations */ static NautilusIconContainer *create_icon_container (FMIconView *icon_view); @@ -133,6 +137,7 @@ struct FMIconViewDetails gboolean menus_ready; const SortCriterion *sort; + gboolean sort_reversed; /* FIXME bugzilla.eazel.com 916: Workaround for Bonobo bug. */ gboolean updating_bonobo_radio_menu_item; @@ -475,6 +480,8 @@ static void update_layout_menus (FMIconView *view) { const char *path; + BonoboUIHandler *ui_handler; + gboolean is_auto_layout; if (!view->details->menus_ready) { return; @@ -482,13 +489,37 @@ update_layout_menus (FMIconView *view) /* FIXME bugzilla.eazel.com 916: Workaround for Bonobo bug. */ view->details->updating_bonobo_radio_menu_item = TRUE; + + is_auto_layout = nautilus_icon_container_is_auto_layout + (get_icon_container (view)); + ui_handler = fm_directory_view_get_bonobo_ui_handler + (FM_DIRECTORY_VIEW (view)); + + /* Mark sort criterion. */ path = MENU_PATH_MANUAL_LAYOUT; - if (nautilus_icon_container_is_auto_layout (get_icon_container (view))) { + if (is_auto_layout) { path = view->details->sort->menu_path; } - bonobo_ui_handler_menu_set_radio_state - (fm_directory_view_get_bonobo_ui_handler (FM_DIRECTORY_VIEW (view)), - path, TRUE); + bonobo_ui_handler_menu_set_radio_state (ui_handler, path, TRUE); + + /* Sort order isn't relevant for manual layout. */ + /* Note that sensitivity must be set before setting which radio + * item is active, or the active state might be changed (Bonobo + * bug) + */ + bonobo_ui_handler_menu_set_sensitivity + (ui_handler, MENU_PATH_SORT_DESCENDING, is_auto_layout); + bonobo_ui_handler_menu_set_sensitivity + (ui_handler, MENU_PATH_SORT_ASCENDING, is_auto_layout); + + /* Mark sort order. */ + if (view->details->sort_reversed) { + path = MENU_PATH_SORT_DESCENDING; + } else { + path = MENU_PATH_SORT_ASCENDING; + } + bonobo_ui_handler_menu_set_radio_state (ui_handler, path, TRUE); + view->details->updating_bonobo_radio_menu_item = FALSE; } @@ -516,6 +547,27 @@ set_sort_criterion (FMIconView *icon_view, const SortCriterion *sort) return TRUE; } +static gboolean +set_sort_reversed (FMIconView *icon_view, gboolean new_value) +{ + if (icon_view->details->sort_reversed == new_value) { + return FALSE; + } + icon_view->details->sort_reversed = new_value; + + /* Store the new sort setting in the metafile. */ + nautilus_directory_set_boolean_metadata + (fm_directory_view_get_model (FM_DIRECTORY_VIEW (icon_view)), + NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, + FALSE, + new_value); + + /* Update the layout menus to match the new sort-order setting. */ + update_layout_menus (icon_view); + + return TRUE; +} + static const SortCriterion * get_sort_criterion_by_metadata_text (const char *metadata_text) { @@ -544,6 +596,19 @@ get_sort_criterion_by_menu_path (const char *path) return NULL; } +static gboolean +get_sort_reversed_from_menu_path (const char *path) +{ + if (strcmp (path, MENU_PATH_SORT_DESCENDING) == 0) { + return TRUE; + } + + /* Complain softly about unexpected parameter. */ + g_return_val_if_fail (strcmp (path, MENU_PATH_SORT_ASCENDING) == 0, FALSE); + + return FALSE; +} + static void fm_icon_view_begin_loading (FMDirectoryView *view) { @@ -580,6 +645,12 @@ fm_icon_view_begin_loading (FMDirectoryView *view) set_sort_criterion (icon_view, get_sort_criterion_by_metadata_text (sort_name)); g_free (sort_name); + /* Set the sort direction from the metadata. */ + set_sort_reversed (icon_view, nautilus_directory_get_boolean_metadata + (directory, + NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED, + FALSE)); + /* Set the layout mode from the metadata. * We must do this after getting the sort mode, * because otherwise the layout_changed callback @@ -766,6 +837,23 @@ sort_callback (BonoboUIHandler *handler, gpointer user_data, const char *path) } static void +sort_direction_callback (BonoboUIHandler *handler, gpointer user_data, const char *path) +{ + FMIconView *icon_view; + + icon_view = FM_ICON_VIEW (user_data); + + /* FIXME bugzilla.eazel.com 916: Workaround for Bonobo bug. */ + if (icon_view->details->updating_bonobo_radio_menu_item) { + return; + } + + set_sort_reversed (icon_view, get_sort_reversed_from_menu_path (path)); + nautilus_icon_container_sort (get_icon_container (icon_view)); + +} + +static void manual_layout_callback (BonoboUIHandler *handler, gpointer user_data, const char *path) @@ -871,6 +959,24 @@ fm_icon_view_merge_menus (FMDirectoryView *view) -1, 0, 0, sort_callback, view); } + bonobo_ui_handler_menu_new_separator + (ui_handler, MENU_PATH_SORT_DIRECTION_SEPARATOR, -1); + bonobo_ui_handler_menu_new_radiogroup + (ui_handler, MENU_PATH_SORT_DIRECTION_RADIO_GROUP); + bonobo_ui_handler_menu_new_radioitem + (ui_handler, + MENU_PATH_SORT_ASCENDING, + _("_Ascending"), + _("Sort icons from \"smallest\" to \"largest\" according to sort criteria"), + -1, 0, 0, + sort_direction_callback, view); + bonobo_ui_handler_menu_new_radioitem + (ui_handler, + MENU_PATH_SORT_DESCENDING, + _("Des_cending"), + _("Sort icons from \"largest\" to \"smallest\" according to sort criteria"), + -1, 0, 0, + sort_direction_callback, view); icon_view->details->updating_bonobo_radio_menu_item = FALSE; /* File menu. */ @@ -979,13 +1085,21 @@ icon_container_compare_icons_callback (NautilusIconContainer *container, NautilusFile *file_b, FMIconView *icon_view) { + int result; + g_assert (FM_IS_ICON_VIEW (icon_view)); g_assert (container == get_icon_container (icon_view)); g_assert (NAUTILUS_IS_FILE (file_a)); g_assert (NAUTILUS_IS_FILE (file_b)); - return nautilus_file_compare_for_sort + result = nautilus_file_compare_for_sort (file_a, file_b, icon_view->details->sort->sort_type); + + if (icon_view->details->sort_reversed) { + result = -1 * result; + } + + return result; } static void |