diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2005-04-19 20:46:35 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2005-04-19 20:46:35 +0000 |
commit | 40222850f816fe1fb1ef9c4650ac6438a1a9fe32 (patch) | |
tree | 6b3c7a22d0a3203c35bbdc2e59ca36d8c5481eec /gtk/proto_draw.c | |
parent | 64cafdda216f606434b230b92bcbaf7bd3ef0203 (diff) | |
download | wireshark-40222850f816fe1fb1ef9c4650ac6438a1a9fe32.tar.gz |
add keyboard expand/collapse in the tree view (with Left/Right keys) with GTK2
svn path=/trunk/; revision=14137
Diffstat (limited to 'gtk/proto_draw.c')
-rw-r--r-- | gtk/proto_draw.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gtk/proto_draw.c b/gtk/proto_draw.c index 7c14c98f08..d4514dd0c4 100644 --- a/gtk/proto_draw.c +++ b/gtk/proto_draw.c @@ -1642,6 +1642,64 @@ void tree_cell_renderer(GtkTreeViewColumn *tree_column _U_, #endif +#if GTK_MAJOR_VERSION >= 2 +static int +tree_view_key_pressed_cb(GtkCTree *ctree, GdkEventKey *event, gpointer user_data _U_) +{ + GtkTreeSelection* selection; + GtkTreeIter iter; + GtkTreeIter parent; + GtkTreeModel* model; + GtkTreePath* path; + gboolean expanded; + gboolean has_parent; + + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); + if(!selection) { + return FALSE; + } + + if(!gtk_tree_selection_get_selected (selection, &model, &iter)) { + return FALSE; + } + + path = gtk_tree_model_get_path(model, &iter); + if(!path) { + return FALSE; + } + + if (event->keyval == GDK_Left) { + expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(tree_view), path); + if(expanded) { + /* subtree is expanded, collapse it */ + gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree_view), path); + return TRUE; + } else { + /* subtree is already collapsed, jump to parent node */ + has_parent = gtk_tree_model_iter_parent(model, &parent, &iter); + path = gtk_tree_model_get_path(model, &parent); + if(!path) { + return FALSE; + } + gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, + NULL /* focus_column */, + FALSE /* !start_editing */); + return TRUE; + } + } + if (event->keyval == GDK_Right) { + /* try to expand the subtree */ + gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, FALSE /* !open_all */); + return TRUE; + } + + return FALSE; +} +#endif + + + GtkWidget * main_tree_view_new(e_prefs *prefs, GtkWidget **tree_view_p) { @@ -1690,6 +1748,7 @@ main_tree_view_new(e_prefs *prefs, GtkWidget **tree_view_p) GTK_TREE_VIEW_COLUMN_AUTOSIZE); SIGNAL_CONNECT(tree_view, "row-expanded", expand_tree, NULL); SIGNAL_CONNECT(tree_view, "row-collapsed", collapse_tree, NULL); + SIGNAL_CONNECT(tree_view, "key-press-event", tree_view_key_pressed_cb, NULL ); #endif gtk_container_add( GTK_CONTAINER(tv_scrollw), tree_view ); set_ptree_sel_browse(tree_view, prefs->gui_ptree_sel_browse); |