summaryrefslogtreecommitdiff
path: root/gtk/proto_draw.c
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2005-04-19 20:46:35 +0000
committerUlf Lamping <ulf.lamping@web.de>2005-04-19 20:46:35 +0000
commit40222850f816fe1fb1ef9c4650ac6438a1a9fe32 (patch)
tree6b3c7a22d0a3203c35bbdc2e59ca36d8c5481eec /gtk/proto_draw.c
parent64cafdda216f606434b230b92bcbaf7bd3ef0203 (diff)
downloadwireshark-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.c59
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);