summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog29
-rw-r--r--libnautilus-extensions/nautilus-metadata.h1
-rw-r--r--libnautilus-private/nautilus-metadata.h1
-rw-r--r--src/file-manager/fm-icon-view.c140
4 files changed, 156 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 8b285fabe..cb03f6980 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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