-------- Weitergeleitete Nachricht -------- > Von: Christian Neumair <chris gnome-de org> > An: nautilus-list gnome org > Betreff: Icon view navigation > Datum: Wed, 06 Jul 2005 11:16:25 +0200 > Dear usability crew, > > in an effort to fix bug 9930 [1], which complains that when pressing > right in the last icon column, the selection doesn't move to the next > row, first column, I've noticed that providing a good icon keynav isn't > trivial. Some observations/questions: > > * Users (including me) indeed tend to use the right/left key as "give me > next/prev. icon", where the list is read zig-zag, i.e. the nth row, last > icon preceeds the n+1th row, first icon > * When you have the first column/row focused and press left, would you > expect to be taken to the first row, last column? What about the last > icon in the view and the right key? > * Should the selection "wrap"? We currently select everything in the > matrix between and including the start icon of the selection and the > msot recently selected item, i.e. we have a selection pane, as if you > selected everything in between with the rubberband. > > The attached patch introduces the behavior described in the first two *. > Maybe an usability tester could point out other observations? > > [1] http://bugzilla.gnome.org/show_bug.cgi?id=99330 Sorry, I've sent the mail to the wrong list. -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-icon-container.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.c,v
retrieving revision 1.390
diff -u -p -r1.390 nautilus-icon-container.c
--- libnautilus-private/nautilus-icon-container.c 5 Jul 2005 12:23:34 -0000 1.390
+++ libnautilus-private/nautilus-icon-container.c 6 Jul 2005 09:02:28 -0000
@@ -186,6 +186,8 @@ static void handle_vadjustment_
static void nautilus_icon_container_prioritize_thumbnailing_for_visible_icons (NautilusIconContainer *container);
static void reveal_icon (NautilusIconContainer *container,
NautilusIcon *icon);
+static int compare_with_start_row (NautilusIconContainer *container,
+ NautilusIcon *icon);
static gpointer accessible_parent_class;
@@ -2317,6 +2319,68 @@ leftmost_in_top_row (NautilusIconContain
}
static gboolean
+rightmost_in_top_row (NautilusIconContainer *container,
+ NautilusIcon *start_icon,
+ NautilusIcon *best_so_far,
+ NautilusIcon *candidate,
+ void *data)
+{
+ /* Candidates after or in the start row do not qualify. */
+ if (compare_with_start_row (container, candidate) > 0) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+leftmost_in_same_row (NautilusIconContainer *container,
+ NautilusIcon *start_icon,
+ NautilusIcon *best_so_far,
+ NautilusIcon *candidate,
+ void *data)
+{
+ /* Candidates before the start row do not qualify. */
+ if (best_so_far == NULL &&
+ compare_with_start_row (container, candidate) == 0) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+rightmost_in_same_row (NautilusIconContainer *container,
+ NautilusIcon *start_icon,
+ NautilusIcon *best_so_far,
+ NautilusIcon *candidate,
+ void *data)
+{
+ /* Candidates before the start row do not qualify. */
+ if (compare_with_start_row (container, candidate) == 0) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+leftmost_in_bottom_row (NautilusIconContainer *container,
+ NautilusIcon *start_icon,
+ NautilusIcon *best_so_far,
+ NautilusIcon *candidate,
+ void *data)
+{
+ /* Candidates before or in the start row do not qualify. */
+ if (best_so_far != NULL ||
+ compare_with_start_row (container, candidate) >= 0) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
rightmost_in_bottom_row (NautilusIconContainer *container,
NautilusIcon *start_icon,
NautilusIcon *best_so_far,
@@ -2702,7 +2766,9 @@ keyboard_arrow_key (NautilusIconContaine
IsBetterIconFunction better_start,
IsBetterIconFunction empty_start,
IsBetterIconFunction better_destination,
- IsBetterIconFunction better_destination_manual)
+ IsBetterIconFunction better_destination_manual,
+ IsBetterIconFunction alternative_destination,
+ IsBetterIconFunction worse_destination)
{
NautilusIcon *from;
NautilusIcon *to;
@@ -2748,6 +2814,19 @@ keyboard_arrow_key (NautilusIconContaine
(container, from,
container->details->auto_layout ? better_destination : better_destination_manual,
&data);
+
+ if (container->details->auto_layout) {
+ if (to == NULL &&
+ alternative_destination != NULL) {
+ to = find_best_icon
+ (container, from, alternative_destination, &data);
+ }
+ if (to == NULL &&
+ worse_destination != NULL) {
+ to = find_best_icon
+ (container, from, worse_destination, &data);
+ }
+ }
}
keyboard_move_to (container, to, from, event);
@@ -2766,7 +2845,9 @@ keyboard_right (NautilusIconContainer *c
rightmost_in_bottom_row,
leftmost_in_top_row,
same_row_right_side_leftmost,
- closest_in_90_degrees);
+ closest_in_90_degrees,
+ leftmost_in_bottom_row,
+ leftmost_in_same_row);
}
static void
@@ -2782,7 +2863,9 @@ keyboard_left (NautilusIconContainer *co
leftmost_in_top_row,
rightmost_in_bottom_row,
same_row_left_side_rightmost,
- closest_in_90_degrees);
+ closest_in_90_degrees,
+ rightmost_in_top_row,
+ rightmost_in_same_row);
}
static void
@@ -2798,7 +2881,8 @@ keyboard_down (NautilusIconContainer *co
rightmost_in_bottom_row,
leftmost_in_top_row,
same_column_below_highest,
- closest_in_90_degrees);
+ closest_in_90_degrees,
+ NULL, NULL);
}
static void
@@ -2814,7 +2898,8 @@ keyboard_up (NautilusIconContainer *cont
leftmost_in_top_row,
rightmost_in_bottom_row,
same_column_above_lowest,
- closest_in_90_degrees);
+ closest_in_90_degrees,
+ NULL, NULL);
}
static void
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil