From 1400fd42f71007e6499c84b1e363d1807c84c212 Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 1 Jul 2010 05:16:33 +0000 Subject: foldersel.c: move up/collapse/expand row with left/right key. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2595 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 4 ++++ src/foldersel.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f2ad4229..39c748c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-07-01 + + * src/foldersel.c: move up/collapse/expand row with left/right key. + 2010-07-01 * src/folderview.c: folderview_key_pressed(): modified key handling diff --git a/src/foldersel.c b/src/foldersel.c index fb7cabeb..61c9a809 100644 --- a/src/foldersel.c +++ b/src/foldersel.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2008 Hiroyuki Yamamoto + * Copyright (C) 1999-2010 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -82,6 +82,7 @@ static GdkPixbuf *foldernoselect_pixbuf; static GtkWidget *window; static GtkWidget *label; +static GtkWidget *scrolledwin; static GtkWidget *treeview; static GtkWidget *entry; static GtkWidget *confirm_area; @@ -130,6 +131,10 @@ static void foldersel_tree_activated (GtkTreeView *treeview, GtkTreeViewColumn *column, gpointer data); +static gboolean foldersel_tree_key_pressed (GtkWidget *widget, + GdkEventKey *event, + gpointer data); + static gint delete_event (GtkWidget *widget, GdkEventAny *event, gpointer data); @@ -243,7 +248,6 @@ FolderItem *foldersel_folder_sel_full(Folder *cur_folder, static void foldersel_create(void) { GtkWidget *vbox; - GtkWidget *scrolledwin; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; @@ -306,6 +310,8 @@ static void foldersel_create(void) g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(foldersel_tree_activated), NULL); + g_signal_connect(G_OBJECT(treeview), "key_press_event", + G_CALLBACK(foldersel_tree_key_pressed), NULL); gtk_container_add(GTK_CONTAINER(scrolledwin), treeview); @@ -648,6 +654,69 @@ static void foldersel_tree_activated(GtkTreeView *treeview, GtkTreePath *path, gtk_button_clicked(GTK_BUTTON(ok_button)); } +static gboolean foldersel_tree_key_pressed(GtkWidget *widget, + GdkEventKey *event, gpointer data) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *selected; + GtkAdjustment *adj; + gboolean moved; + + if (!event) + return FALSE; + + switch (event->keyval) { + case GDK_Left: + case GDK_KP_Left: + if ((event->state & + (GDK_SHIFT_MASK|GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) + return FALSE; + adj = gtk_scrolled_window_get_hadjustment + (GTK_SCROLLED_WINDOW(scrolledwin)); + if (adj->lower < adj->value) + return FALSE; + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return FALSE; + selected = gtk_tree_model_get_path(model, &iter); + if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(treeview), selected)) { + gtk_tree_view_collapse_row(GTK_TREE_VIEW(treeview), selected); + gtk_tree_path_free(selected); + return TRUE; + } + gtk_tree_path_free(selected); + g_signal_emit_by_name(G_OBJECT(treeview), + "select-cursor-parent", &moved); + return TRUE; + case GDK_Right: + case GDK_KP_Right: + if ((event->state & + (GDK_SHIFT_MASK|GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) + return FALSE; + adj = gtk_scrolled_window_get_hadjustment + (GTK_SCROLLED_WINDOW(scrolledwin)); + if (adj->lower - adj->page_size > adj->value) + return FALSE; + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return FALSE; + selected = gtk_tree_model_get_path(model, &iter); + if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(treeview), selected)) { + gtk_tree_view_expand_row(GTK_TREE_VIEW(treeview), selected, FALSE); + gtk_tree_path_free(selected); + return TRUE; + } + gtk_tree_path_free(selected); + break; + default: + break; + } + + return FALSE; +} + static gint delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data) { foldersel_cancel(NULL, NULL); -- cgit v1.2.3