[gnome-builder] libide-gui: add up/down and ctrl+n/ctrl+p search movements



commit 01f7672ce913769a293d5abfcbef52046f3c3667
Author: Christian Hergert <chergert redhat com>
Date:   Tue Jul 12 22:37:55 2022 -0700

    libide-gui: add up/down and ctrl+n/ctrl+p search movements
    
    This is just handy for people used to various keybindings in different
    search systems.

 src/libide/gui/gtk/keybindings.json |  5 +++++
 src/libide/gui/ide-search-popover.c | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)
---
diff --git a/src/libide/gui/gtk/keybindings.json b/src/libide/gui/gtk/keybindings.json
index 7b87d715a..6976f3f17 100644
--- a/src/libide/gui/gtk/keybindings.json
+++ b/src/libide/gui/gtk/keybindings.json
@@ -1,6 +1,11 @@
 /* Global Search */
 { "trigger" : "<Control>Return", "action" : "workbench.global-search", "when" : "canSearch()", "phase" : 
"capture" },
 { "trigger" : "Escape", "action" : "search.hide", "when" : "inPopoverSearch() || inPageSearch()", "phase" : 
"capture" },
+{ "trigger" : "Down", "action" : "search.move", "args" : "1", "when" : "inPopoverSearch()", "phase" : 
"capture" },
+{ "trigger" : "Up", "action" : "search.move", "args" : "-1", "when" : "inPopoverSearch()", "phase" : 
"capture" },
+{ "trigger" : "<Control>n", "action" : "search.move", "args" : "1", "when" : "inPopoverSearch()", "phase" : 
"capture" },
+{ "trigger" : "<Control>p", "action" : "search.move", "args" : "-1", "when" : "inPopoverSearch()", "phase" : 
"capture" },
+
 
 /* New Files */
 { "trigger" : "<Control>n", "action" : "editorui.new-file", "when" : "canEdit()", "phase" : "bubble" },
diff --git a/src/libide/gui/ide-search-popover.c b/src/libide/gui/ide-search-popover.c
index 922413c13..69093c62d 100644
--- a/src/libide/gui/ide-search-popover.c
+++ b/src/libide/gui/ide-search-popover.c
@@ -257,6 +257,42 @@ ide_search_popover_entry_activate_cb (IdeSearchPopover *self,
   ide_search_popover_queue_search (self);
 }
 
+static void
+ide_search_popover_move_action (GtkWidget  *widget,
+                                const char *action_name,
+                                GVariant   *param)
+{
+  IdeSearchPopover *self = (IdeSearchPopover *)widget;
+  guint selected;
+  int dir;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_SEARCH_POPOVER (self));
+  g_assert (g_variant_is_of_type (param, G_VARIANT_TYPE_INT32));
+
+  selected = gtk_single_selection_get_selected (self->selection);
+  dir = g_variant_get_int32 (param);
+
+  if (dir < 0)
+    {
+      if (selected < ABS (dir))
+        selected = 0;
+      else
+        selected -= ABS (dir);
+    }
+  else
+    {
+      selected += dir;
+    }
+
+  if (selected < g_list_model_get_n_items (G_LIST_MODEL (self->selection)))
+    gtk_single_selection_set_selected (self->selection, selected);
+
+  IDE_EXIT;
+}
+
 static void
 ide_search_popover_next_match_cb (IdeSearchPopover *self,
                                   GtkSearchEntry   *entry)
@@ -395,6 +431,7 @@ ide_search_popover_class_init (IdeSearchPopoverClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, ide_search_popover_previous_match_cb);
 
   gtk_widget_class_install_action (widget_class, "search.hide", NULL, ide_search_popover_hide_action);
+  gtk_widget_class_install_action (widget_class, "search.move", "i", ide_search_popover_move_action);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]