173 lines
6.7 KiB
Text
173 lines
6.7 KiB
Text
From 52269786c0a84eeed5faf33c6dd896298e71b2a6 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Dami=C3=A1n=20Nohales?= <damiannohales@gmail.com>
|
|
Date: Mon, 2 Jul 2012 20:20:18 -0300
|
|
Subject: [PATCH] treeview: change keyboard bindings behaviour
|
|
|
|
This commit changes the default GtkTreeView behaviour with the keyboard,
|
|
expanding nodes with right arrow and collapsing it with left arrow,
|
|
selecting parent and child nodes when appropriate. Users that want to
|
|
navigate into cells horizontally (a non frecuent use case) will need
|
|
to press Ctrl+<Left|Right>.
|
|
---
|
|
gtk/gtktreeview.c | 107 +++++++++++++++++++++++++++++++++++++----------------
|
|
1 file changed, 76 insertions(+), 31 deletions(-)
|
|
|
|
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
|
|
index 73cd0ae..28e6500 100644
|
|
--- a/gtk/gtktreeview.c
|
|
+++ b/gtk/gtktreeview.c
|
|
@@ -1527,22 +1527,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
|
|
GTK_MOVEMENT_PAGES, 1);
|
|
|
|
|
|
- gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, 0, "move-cursor", 2,
|
|
- G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
|
- G_TYPE_INT, 1);
|
|
-
|
|
- gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, 0, "move-cursor", 2,
|
|
- G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
|
- G_TYPE_INT, -1);
|
|
-
|
|
- gtk_binding_entry_add_signal (binding_set, GDK_KEY_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_KEY_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_KEY_Right, GDK_CONTROL_MASK,
|
|
"move-cursor", 2,
|
|
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
|
@@ -1594,6 +1578,15 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
|
|
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_asterisk, 0,
|
|
"expand-collapse-cursor-row", 3,
|
|
G_TYPE_BOOLEAN, TRUE,
|
|
@@ -1605,6 +1598,16 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
|
|
G_TYPE_BOOLEAN, TRUE,
|
|
G_TYPE_BOOLEAN, TRUE);
|
|
|
|
+ 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_KEY_slash, 0,
|
|
"expand-collapse-cursor-row", 3,
|
|
G_TYPE_BOOLEAN, TRUE,
|
|
@@ -10812,6 +10815,7 @@ gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
|
gboolean open_all)
|
|
{
|
|
GtkTreePath *cursor_path = NULL;
|
|
+ gboolean return_value = TRUE;
|
|
|
|
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
|
return FALSE;
|
|
@@ -10822,31 +10826,72 @@ gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
|
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
|
tree_view->priv->cursor_node);
|
|
|
|
- /* Don't handle the event if we aren't an expander */
|
|
- if (!GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT))
|
|
- return FALSE;
|
|
-
|
|
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_view->priv->cursor_tree,
|
|
- tree_view->priv->cursor_node,
|
|
- open_all,
|
|
- 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 (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT))
|
|
+ return_value = FALSE;
|
|
+ }
|
|
+ }
|
|
+ else if (GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT))
|
|
+ {
|
|
+ gtk_tree_view_real_expand_row (tree_view,
|
|
+ cursor_path,
|
|
+ tree_view->priv->cursor_tree,
|
|
+ tree_view->priv->cursor_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
|
|
- gtk_tree_view_real_collapse_row (tree_view,
|
|
+ {
|
|
+ if (expand)
|
|
+ {
|
|
+ if(open_all)
|
|
+ {
|
|
+ gtk_tree_view_real_expand_row (tree_view,
|
|
cursor_path,
|
|
tree_view->priv->cursor_tree,
|
|
tree_view->priv->cursor_node,
|
|
+ open_all,
|
|
TRUE);
|
|
+ }
|
|
|
|
- gtk_tree_path_free (cursor_path);
|
|
+ /* 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_view->priv->cursor_tree,
|
|
+ tree_view->priv->cursor_node,
|
|
+ TRUE);
|
|
+ }
|
|
|
|
- return TRUE;
|
|
+ gtk_tree_path_free (cursor_path);
|
|
+
|
|
+ return return_value;
|
|
}
|
|
|
|
static gboolean
|
|
--
|
|
1.7.9.5
|
|
|