summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/widgets/gradient-selector.cpp62
-rw-r--r--src/widgets/gradient-selector.h2
2 files changed, 64 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()
{
diff --git a/src/widgets/gradient-selector.h b/src/widgets/gradient-selector.h
index 454d5c906..da771b6f1 100644
--- a/src/widgets/gradient-selector.h
+++ b/src/widgets/gradient-selector.h
@@ -60,6 +60,7 @@ struct SPGradientSelector {
/* Tree */
bool _checkForSelected(const Gtk::TreePath& path, const Gtk::TreeIter& iter, SPGradient *vector);
+ bool onKeyPressEvent(GdkEventKey *event);
void onTreeSelection();
void onGradientRename( const Glib::ustring& path_string, const Glib::ustring& new_text);
void onTreeNameColClick();
@@ -114,6 +115,7 @@ struct SPGradientSelector {
void setSpread(SPGradientSpread spread);
void setVector(SPDocument *doc, SPGradient *vector);
void selectGradientInTree(SPGradient *vector);
+ void moveSelection(int amount);
SPGradientUnits getUnits();
SPGradientSpread getSpread();