--- a/gtk/gtktreeview.c 2012-10-26 10:58:51.698218497 +1100 +++ b/gtk/gtktreeview.c 2012-10-26 11:09:37.178264810 +1100 @@ -1147,22 +1147,6 @@ GTK_MOVEMENT_PAGES, 1); - gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, - G_TYPE_INT, 1); - - gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, - G_TYPE_INT, -1); - - gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, - G_TYPE_INT, 1); - - gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, - G_TYPE_INT, -1); - gtk_binding_entry_add_signal (binding_set, GDK_Right, GDK_CONTROL_MASK, "move-cursor", 2, G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, @@ -1214,6 +1198,28 @@ G_TYPE_BOOLEAN, TRUE, G_TYPE_BOOLEAN, FALSE); + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, 0, + "expand-collapse-cursor-row", 3, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, TRUE, + G_TYPE_BOOLEAN, FALSE); + gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Right, 0, + "expand-collapse-cursor-row", 3, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, TRUE, + G_TYPE_BOOLEAN, FALSE); + + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, 0, + "expand-collapse-cursor-row", 3, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, FALSE); + gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Left, 0, + "expand-collapse-cursor-row", 3, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, FALSE, + G_TYPE_BOOLEAN, FALSE); + gtk_binding_entry_add_signal (binding_set, GDK_asterisk, 0, "expand-collapse-cursor-row", 3, G_TYPE_BOOLEAN, TRUE, @@ -10222,32 +10228,59 @@ if (!gtk_widget_has_focus (GTK_WIDGET (tree_view))) return FALSE; - cursor_path = NULL; if (tree_view->priv->cursor) cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); if (cursor_path == NULL) return FALSE; - if (_gtk_tree_view_find_node (tree_view, cursor_path, &tree, &node)) - return FALSE; + gboolean return_value = FALSE; - /* Don't handle the event if we aren't an expander */ - if (!((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT)) - return FALSE; + if (_gtk_tree_view_find_node (tree_view, cursor_path, &tree, &node)) + goto out; if (!logical && gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL) expand = !expand; - if (expand) - gtk_tree_view_real_expand_row (tree_view, cursor_path, tree, node, open_all, TRUE); - else - gtk_tree_view_real_collapse_row (tree_view, cursor_path, tree, node, TRUE); + return_value = TRUE; + /* If we are on a collapsed node */ + if (!gtk_tree_view_row_expanded(tree_view, cursor_path)) { + if (!expand) { + if (gtk_tree_path_up(cursor_path)) { + /* If we try to collapse using arrows, select the parent node */ + if (!logical) + gtk_tree_view_set_cursor(tree_view,cursor_path,NULL,FALSE); + /* If we try to collapse a leaf node using minus, + cancel action and start interactive search */ + else if (!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT)) + return_value = FALSE; + } + } else if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT)) { + gtk_tree_view_real_expand_row (tree_view, cursor_path, tree, node, open_all, TRUE); + } else + /* If we try to expand a leaf node, cancel action */ + return_value = !logical; + } + /* If we are on a expanded node */ + else { + if (expand) { + if(open_all) + gtk_tree_view_real_expand_row (tree_view, cursor_path, tree, node, open_all, TRUE); + + /* If we try to expand using arrows, select the first child */ + if (!logical) { + gtk_tree_path_down(cursor_path); + gtk_tree_view_set_cursor(tree_view,cursor_path,NULL,FALSE); + } + } else + gtk_tree_view_real_collapse_row (tree_view, cursor_path, tree, node, TRUE); + } +out: gtk_tree_path_free (cursor_path); - return TRUE; + return return_value; } static gboolean