From 5a723637e9f75bf04cba9b361693e349a663428a Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Thu, 19 Oct 2023 10:52:33 +0200 Subject: [PATCH] This allow lpedialog and other dialogs that use completion popup giving user close the menu on keypress focusing on entry for search autocompletion --- src/ui/widget/completion-popup.cpp | 30 ++++++++++++++++++++++++++++++ src/ui/widget/completion-popup.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/src/ui/widget/completion-popup.cpp b/src/ui/widget/completion-popup.cpp index 40391f7c15..a669e5217f 100644 --- a/src/ui/widget/completion-popup.cpp +++ b/src/ui/widget/completion-popup.cpp @@ -8,6 +8,7 @@ #include "completion-popup.h" #include "ui/builder-utils.h" +#include "ui/controller.h" namespace Inkscape::UI::Widget { @@ -26,6 +27,7 @@ CompletionPopup::CompletionPopup() : _completion(get_object(_builder, "completion")) { _popover_menu.show_all_children(); + Controller::add_key<&CompletionPopup::onPopoverKeyPressed>(_popover_menu, *this, Gtk::PHASE_CAPTURE); _button.set_popover(_popover_menu); _list = Glib::RefPtr::cast_dynamic(_builder->get_object("list")); @@ -74,6 +76,34 @@ CompletionPopup::CompletionPopup() : CompletionPopup::~CompletionPopup() = default; +bool CompletionPopup::onPopoverKeyPressed(GtkEventControllerKey const * /*controller*/, + unsigned keyval, unsigned /*keycode*/, + GdkModifierType state) { + if (!_button.get_active()) { + return false; + } + switch (keyval) { + // do nothing on direction keys and enter + case GDK_KEY_Left: + case GDK_KEY_KP_Left: + case GDK_KEY_Up: + case GDK_KEY_KP_Up: + case GDK_KEY_Right: + case GDK_KEY_KP_Right: + case GDK_KEY_Down: + case GDK_KEY_KP_Down: + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: + break; + default: + _button_press.emit(); + clear(); + _search.grab_focus(); + break; + } + return false; +} + void CompletionPopup::clear_completion_list() { _list->clear(); } diff --git a/src/ui/widget/completion-popup.h b/src/ui/widget/completion-popup.h index 33aaa38f79..2ebc389656 100644 --- a/src/ui/widget/completion-popup.h +++ b/src/ui/widget/completion-popup.h @@ -37,6 +37,8 @@ public: sigc::signal& on_focus(); private: + bool onPopoverKeyPressed(GtkEventControllerKey const *controller, + unsigned keyval, unsigned keycode, GdkModifierType state); Glib::RefPtr _builder; Glib::RefPtr _list; Gtk::SearchEntry& _search; -- GitLab