From c25415ea022105445f3c4328f936f46a9c5d49c5 Mon Sep 17 00:00:00 2001 From: Michael Gratton Date: Mon, 22 Jul 2019 01:24:42 +1000 Subject: [PATCH] Make J/K work globally, add Ctrl+] and Ctrl+[ as aliases See #505 --- .../application/application-controller.vala | 14 ++++++++ .../conversation-list-view.vala | 33 +++++++++++++++++++ src/client/folder-list/folder-list-tree.vala | 16 --------- ui/gtk/help-overlay.ui | 8 ++--- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/client/application/application-controller.vala b/src/client/application/application-controller.vala index e3a2204f..0bb01681 100644 --- a/src/client/application/application-controller.vala +++ b/src/client/application/application-controller.vala @@ -38,6 +38,8 @@ public class Application.Controller : Geary.BaseObject { public const string ACTION_CONVERSATION_LIST = "focus-conv-list"; public const string ACTION_TOGGLE_SEARCH = "toggle-search"; public const string ACTION_TOGGLE_FIND = "toggle-find"; + public const string ACTION_CONVERSATION_UP = "up-conversation"; + public const string ACTION_CONVERSATION_DOWN = "down-conversation"; // Properties public const string PROP_SELECTED_CONVERSATIONS ="selected-conversations"; @@ -197,6 +199,8 @@ public class Application.Controller : Geary.BaseObject { {ACTION_DELETE_CONVERSATION, on_delete_conversation }, {ACTION_COPY_MENU, on_show_copy_menu }, {ACTION_MOVE_MENU, on_show_move_menu }, + {ACTION_CONVERSATION_UP, on_conversation_up }, + {ACTION_CONVERSATION_DOWN, on_conversation_down }, // Message marking actions {ACTION_SHOW_MARK_MENU, on_show_mark_menu }, {ACTION_MARK_AS_READ, on_mark_as_read }, @@ -606,6 +610,8 @@ public class Application.Controller : Geary.BaseObject { add_window_accelerators(ACTION_ZOOM+("('normal')"), { "0" }); add_window_accelerators(ACTION_SEARCH, { "S" }); add_window_accelerators(ACTION_CONVERSATION_LIST, { "B" }); + add_window_accelerators(ACTION_CONVERSATION_UP, { "bracketleft", "K" }); + add_window_accelerators(ACTION_CONVERSATION_DOWN, { "bracketright", "J" }); } private void add_window_accelerators(string action, string[] accelerators, Variant? param = null) { @@ -2909,6 +2915,14 @@ public class Application.Controller : Geary.BaseObject { ); } + private void on_conversation_up() { + this.main_window.conversation_list_view.scroll(Gtk.ScrollType.STEP_UP); + } + + private void on_conversation_down() { + this.main_window.conversation_list_view.scroll(Gtk.ScrollType.STEP_DOWN); + } + private void on_save_attachments(Gee.Collection attachments) { GLib.Cancellable? cancellable = null; if (this.current_account != null) { diff --git a/src/client/conversation-list/conversation-list-view.vala b/src/client/conversation-list/conversation-list-view.vala index a4400248..9a18ee7f 100644 --- a/src/client/conversation-list/conversation-list-view.vala +++ b/src/client/conversation-list/conversation-list-view.vala @@ -122,6 +122,39 @@ public class ConversationListView : Gtk.TreeView, Geary.BaseInterface { selection.changed.connect(on_selection_changed); } + public void scroll(Gtk.ScrollType where) { + Gtk.TreeSelection selection = get_selection(); + weak Gtk.TreeModel model; + GLib.List selected = selection.get_selected_rows(out model); + Gtk.TreePath? target_path = null; + Gtk.TreeIter? target_iter = null; + if (selected.length() > 0) { + switch (where) { + case STEP_UP: + target_path = selected.first().data; + model.get_iter(out target_iter, target_path); + if (model.iter_previous(ref target_iter)) { + target_path = model.get_path(target_iter); + } else { + this.get_window().beep(); + } + break; + + case STEP_DOWN: + target_path = selected.last().data; + model.get_iter(out target_iter, target_path); + if (model.iter_next(ref target_iter)) { + target_path = model.get_path(target_iter); + } else { + this.get_window().beep(); + } + break; + } + + set_cursor(target_path, null, false); + } + } + /** * Specifies an action is currently changing the view's selection. */ diff --git a/src/client/folder-list/folder-list-tree.vala b/src/client/folder-list/folder-list-tree.vala index 8fabcc0b..0fac3770 100644 --- a/src/client/folder-list/folder-list-tree.vala +++ b/src/client/folder-list/folder-list-tree.vala @@ -36,22 +36,6 @@ public class FolderList.Tree : Sidebar.Tree, Geary.BaseInterface { unowned Gtk.BindingSet? binding_set = Gtk.BindingSet.find("GtkTreeView"); assert(binding_set != null); Gtk.BindingEntry.remove(binding_set, Gdk.Key.N, Gdk.ModifierType.CONTROL_MASK); - // add j/k bindings for gmail or vim users - // The add_signal API is hard to use (need to pass variable arguments with - // type identifiers), so we might as well use this version that parses a - // string. - Gtk.BindingEntry.add_signal_from_string( - binding_set, - """ - bind "j" { "move-cursor" (display-lines, 1) } - """ - ); - Gtk.BindingEntry.add_signal_from_string( - binding_set, - """ - bind "k" { "move-cursor" (display-lines, -1) } - """ - ); } ~Tree() { diff --git a/ui/gtk/help-overlay.ui b/ui/gtk/help-overlay.ui index 08f5e01a..db4b099d 100644 --- a/ui/gtk/help-overlay.ui +++ b/ui/gtk/help-overlay.ui @@ -244,15 +244,15 @@ True - Select next conversation down - J + Select the conversation down + <primary>bracketright J True - Select previous conversation up - K + Select the conversation up + <primary>bracketleft K