From 3c9687d3d8cebe107716c14562d6446890f89651 Mon Sep 17 00:00:00 2001 From: Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> Date: Thu, 27 Jun 2019 19:33:42 +1000 Subject: Override navigation in swatch/gradient list Fix gitlab.com/inkscape/inkscape/issues/237 --- src/widgets/gradient-selector.cpp | 62 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'src/widgets/gradient-selector.cpp') diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp index 9cd0cf19f..19dc184eb 100644 --- a/src/widgets/gradient-selector.cpp +++ b/src/widgets/gradient-selector.cpp @@ -149,6 +149,8 @@ static void sp_gradient_selector_init(SPGradientSelector *sel) count_column->set_clickable(true); count_column->set_resizable(true); + sel->treeview->signal_key_press_event().connect(sigc::mem_fun(*sel, &SPGradientSelector::onKeyPressEvent), false); + sel->treeview->show(); icon_column->signal_clicked().connect( sigc::mem_fun(*sel, &SPGradientSelector::onTreeColorColClick) ); @@ -334,6 +336,66 @@ void SPGradientSelector::onTreeCountColClick() { column->set_sort_column(columns->refcount); } +void SPGradientSelector::moveSelection(int amount) +{ + Glib::RefPtr select = treeview->get_selection(); + auto iter = select->get_selected(); + auto canary = iter; + + for (--canary; amount < 0 && canary; ++amount) { + --canary; + --iter; + } + + canary = iter; + for (++canary; amount > 0 && canary; --amount) { + ++canary; + ++iter; + } + + select->select(iter); + treeview->scroll_to_row(store->get_path(iter), 0.5); +} + +bool SPGradientSelector::onKeyPressEvent(GdkEventKey *event) +{ + bool consume = false; + auto display = Gdk::Display::get_default(); + auto keymap = display->get_keymap(); + guint key = 0; + gdk_keymap_translate_keyboard_state(keymap, event->hardware_keycode, + static_cast(event->state), + 0, &key, 0, 0, 0); + + switch (key) { + case GDK_KEY_Up: + case GDK_KEY_KP_Up: { + moveSelection(-1); + consume = true; + break; + } + case GDK_KEY_Down: + case GDK_KEY_KP_Down: { + moveSelection(1); + consume = true; + break; + } + case GDK_KEY_Page_Up: + case GDK_KEY_KP_Page_Up: { + moveSelection(-5); + consume = true; + break; + } + + case GDK_KEY_Page_Down: + case GDK_KEY_KP_Page_Down: { + moveSelection(5); + consume = true; + break; + } + } + return consume; +} void SPGradientSelector::onTreeSelection() { -- cgit v1.2.3