From 6ae1a1061491eb73ec4637a45b63c61c24d8aa4c Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Tue, 1 Dec 2020 08:33:06 +0100 Subject: [PATCH] #5333 - Reworked navigation of preview's sliders using the keyboard --- src/libslic3r/Technologies.hpp | 8 ++++++++ src/slic3r/GUI/DoubleSlider.cpp | 23 +++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 8 ++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 4 ++++ src/slic3r/GUI/GUI_Preview.cpp | 21 +++++++++++++++++++ src/slic3r/GUI/GUI_Preview.hpp | 3 +++ src/slic3r/GUI/KBShortcutsDialog.cpp | 30 ++++++++++++++++++++++++++-- src/slic3r/GUI/Plater.cpp | 7 +++++++ 8 files changed, 102 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 3e9db414a..45ca1a7c3 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -83,4 +83,12 @@ #define ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN (1 && ENABLE_2_3_0_BETA1) +//=================== +// 2.3.0.beta2 techs +//=================== +#define ENABLE_2_3_0_BETA2 1 + +#define ENABLE_ARROW_KEYS_WITH_SLIDERS (1 && ENABLE_2_3_0_BETA2) + + #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 34660927a..b637c2e7f 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1519,6 +1519,10 @@ void Control::move_current_thumb(const bool condition) if (accelerator > 0) delta *= accelerator; +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + if (m_selection == ssUndef) m_selection = ssHigher; +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS + if (m_selection == ssLower) { m_lower_value -= delta; correct_lower_value(); @@ -1579,13 +1583,26 @@ void Control::OnKeyDown(wxKeyEvent &event) if (key == WXK_LEFT || key == WXK_RIGHT) move_current_thumb(key == WXK_LEFT); else if (key == WXK_UP || key == WXK_DOWN) { +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + if (key == WXK_DOWN) + m_selection = ssHigher; + else if (key == WXK_UP && is_lower_thumb_editable()) + m_selection = ssLower; +#else if (key == WXK_UP) m_selection = ssHigher; else if (key == WXK_DOWN && is_lower_thumb_editable()) m_selection = ssLower; +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS Refresh(); } } +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + else { + if (key == WXK_LEFT || key == WXK_RIGHT) + move_current_thumb(key == WXK_LEFT); + } +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS } else { if (m_is_focused) { @@ -1599,6 +1616,12 @@ void Control::OnKeyDown(wxKeyEvent &event) else if (key == WXK_UP || key == WXK_DOWN) move_current_thumb(key == WXK_UP); } +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + else { + if (key == WXK_UP || key == WXK_DOWN) + move_current_thumb(key == WXK_UP); + } +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS } event.Skip(); // !Needed to have EVT_CHAR generated as well diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a8221ce69..8a2a318d6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1078,7 +1078,11 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); +#if ENABLE_ARROW_KEYS_WITH_SLIDERS +wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); +#else wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); @@ -2818,7 +2822,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) keyCode == WXK_UP || keyCode == WXK_DOWN) { if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr) +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_SLIDERS, evt)); +#else post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, evt)); +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS } } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 7f44901d1..a40f1b98d 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -103,7 +103,11 @@ wxDECLARE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); +#if ENABLE_ARROW_KEYS_WITH_SLIDERS +wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); +#else wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 6d8c18f42..06fc35e0f 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -460,6 +460,13 @@ void Preview::unbind_event_handlers() m_moves_slider->Unbind(wxEVT_SCROLL_CHANGED, &Preview::on_moves_slider_scroll_changed, this); } +#if ENABLE_ARROW_KEYS_WITH_SLIDERS +void Preview::move_moves_slider(wxKeyEvent& evt) +{ + if (m_moves_slider != nullptr) m_moves_slider->OnKeyDown(evt); +} +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS + void Preview::hide_layers_slider() { m_layers_slider_sizer->Hide((size_t)0); @@ -765,12 +772,26 @@ void Preview::update_layers_slider_from_canvas(wxKeyEvent& event) const auto key = event.GetKeyCode(); +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + if (key == 'S' || key == 'W') { + const int new_pos = key == 'W' ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1; +#else if (key == 'U' || key == 'D') { const int new_pos = key == 'U' ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1; +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS m_layers_slider->SetHigherValue(new_pos); if (event.ShiftDown() || m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue()); } +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + else if (key == 'A' || key == 'D') { + const int new_pos = key == 'D' ? m_moves_slider->GetHigherValue() + 1 : m_moves_slider->GetHigherValue() - 1; + m_moves_slider->SetHigherValue(new_pos); + if (event.ShiftDown() || m_moves_slider->is_one_layer()) m_moves_slider->SetLowerValue(m_moves_slider->GetHigherValue()); + } + else if (key == 'X') +#else else if (key == 'S') +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS m_layers_slider->ChangeOneLayerLock(); else if (key == WXK_SHIFT) m_layers_slider->UseDefaultColors(false); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index daa92d0b2..5c4083853 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -157,6 +157,9 @@ public: void update_bottom_toolbar(); void update_moves_slider(); void enable_moves_slider(bool enable); +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + void move_moves_slider(wxKeyEvent& evt); +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS void hide_layers_slider(); private: diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 53ae8f66c..21fe6a747 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -203,22 +203,48 @@ void KBShortcutsDialog::fill_shortcuts() } Shortcuts preview_shortcuts = { - { L("Arrow Up"), L("Upper Layer") }, - { L("Arrow Down"), L("Lower Layer") }, +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + { L("Arrow Up"), L("Move vertical slider current thumb Up") }, + { L("Arrow Down"), L("Move vertical slider current thumb Down") }, + { L("Arrow Left"), L("Move horizontal slider current thumb Left") }, + { L("Arrow Right"), L("Move horizontal slider current thumb Right") }, + { "W", L("Move vertical slider current thumb Up") }, + { "S", L("Move vertical slider current thumb Down") }, + { "A", L("Move horizontal slider current thumb Left") }, + { "D", L("Move horizontal slider current thumb Right") }, + { "O", L("Toggle vertical slider one layer mode ON/OFF") }, + { "L", L("Show/Hide Legend and Estimated printing time") }, +#else + { L("Arrow Up"), L("Upper layer") }, + { L("Arrow Down"), L("Lower layer") }, { "U", L("Upper Layer") }, { "D", L("Lower Layer") }, { "L", L("Show/Hide Legend & Estimated printing time") }, +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS }; m_full_shortcuts.push_back(std::make_pair(_L("Preview"), preview_shortcuts)); Shortcuts layers_slider_shortcuts = { +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + { L("Arrow Up"), L("Vertical slider - Move current thumb Up") }, + { L("Arrow Down"), L("Vertical slider - Move current thumb Down") }, + { L("Arrow Left"), L("Vertical slider - Set upper thumb to current thumb") }, + { L("Arrow Right"), L("Vertical slider - Set lower thumb to current thumb") }, + { "+", L("Vertical slider - Add color change marker for current layer") }, + { "-", L("Vertical slider - Delete color change marker for current layer") }, + { L("Arrow Up"), L("Horizontal slider - Set left thumb to current thumb") }, + { L("Arrow Down"), L("Horizontal slider - Set right thumb to current thumb") }, + { L("Arrow Left"), L("Horizontal slider - Move current thumb Left") }, + { L("Arrow Right"), L("Horizontal slider - Move current thumb Right") }, +#else { L("Arrow Up"), L("Move current slider thumb Up") }, { L("Arrow Down"), L("Move current slider thumb Down") }, { L("Arrow Left"), L("Set upper thumb to current slider thumb") }, { L("Arrow Right"), L("Set lower thumb to current slider thumb") }, { "+", L("Add color change marker for current layer") }, { "-", L("Delete color change marker for current layer") }, +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS { "Shift+", L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") }, { ctrl, L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") }, }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6709800ff..fd0245caa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2055,7 +2055,14 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_COLLAPSE_SIDEBAR, [this](SimpleEvent&) { this->q->collapse_sidebar(!this->q->is_sidebar_collapsed()); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_JUMP_TO, [this](wxKeyEvent& evt) { preview->jump_layers_slider(evt); }); +#if ENABLE_ARROW_KEYS_WITH_SLIDERS + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_SLIDERS, [this](wxKeyEvent& evt) { + preview->move_layers_slider(evt); + preview->move_moves_slider(evt); + }); +#else preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, [this](wxKeyEvent& evt) { preview->move_layers_slider(evt); }); +#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_EDIT_COLOR_CHANGE, [this](wxKeyEvent& evt) { preview->edit_layers_slider(evt); }); if (wxGetApp().is_editor()) {