summaryrefslogtreecommitdiffstats
path: root/src/widgets/gradient-selector.cpp
diff options
context:
space:
mode:
authorNathan Lee <2431820-nathanal@users.noreply.gitlab.com>2019-06-27 09:33:42 +0000
committerMarc Jeanmougin <marcjeanmougin@free.fr>2019-07-15 10:34:16 +0000
commit3c9687d3d8cebe107716c14562d6446890f89651 (patch)
tree27ae30f12397645a20b8ccb9ad796688639fb6f1 /src/widgets/gradient-selector.cpp
parentEraser tool fixes (diff)
downloadinkscape-3c9687d3d8cebe107716c14562d6446890f89651.tar.gz
inkscape-3c9687d3d8cebe107716c14562d6446890f89651.zip
Override navigation in swatch/gradient list
Fix gitlab.com/inkscape/inkscape/issues/237
Diffstat (limited to 'src/widgets/gradient-selector.cpp')
-rw-r--r--src/widgets/gradient-selector.cpp62
1 files changed, 62 insertions, 0 deletions
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<Gtk::TreeSelection> 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<GdkModifierType>(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()
{