From ec8602f8d9b261ac8ea211337bff14fe74267dbe Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 29 Sep 2020 11:04:25 +0200 Subject: [PATCH] Faster switching of parameter pages if the page is switched by cursor keys in the tree control: The page update is delayed to idle. --- src/slic3r/GUI/Tab.cpp | 29 ++++++++++++++++++----------- src/slic3r/GUI/Tab.hpp | 6 +++++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index b0dfe44bcd..7352c70376 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -293,7 +293,20 @@ void Tab::create_preset_tab() m_treectrl->AddRoot("root"); m_treectrl->SetIndent(0); - m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, &Tab::OnTreeSelChange, this); + // Delay processing of the following handler until the message queue is flushed. + // This helps to process all the cursor key events on Windows in the tree control, + // so that the cursor jumps to the last item. + m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, [this](wxTreeEvent&) { + if (!m_disable_tree_sel_changed_event && !m_pages.empty()) + m_page_switch_planned = true; + }); + m_treectrl->Bind(wxEVT_IDLE, [this](wxIdleEvent&) { + if (m_page_switch_planned) { + this->tree_sel_change_delayed(); + m_page_switch_planned = false; + } + }); + m_treectrl->Bind(wxEVT_KEY_DOWN, &Tab::OnKeyDown, this); // Initialize the page. @@ -3370,14 +3383,11 @@ void Tab::active_selected_page() toggle_options(); } -void Tab::OnTreeSelChange(wxTreeEvent& event) +void Tab::tree_sel_change_delayed() { - if (m_disable_tree_sel_changed_event) - return; - -// There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952. -// The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason, -// we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely. + // There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952. + // The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason, + // we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely. #ifdef __linux__ std::unique_ptr no_updates(new wxWindowUpdateLocker(this)); #else @@ -3390,9 +3400,6 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) //#endif #endif - if (m_pages.empty()) - return; - Page* page = nullptr; const auto sel_item = m_treectrl->GetSelection(); const auto selection = sel_item ? m_treectrl->GetItemText(sel_item) : ""; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 9df68592b5..9d65d767a1 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -130,7 +130,7 @@ protected: wxScrolledWindow* m_page_view {nullptr}; wxBoxSizer* m_page_sizer {nullptr}; - ModeSizer* m_mode_sizer; + ModeSizer* m_mode_sizer; struct PresetDependencies { Preset::Type type = Preset::TYPE_INVALID; @@ -238,6 +238,9 @@ protected: DynamicPrintConfig m_cache_config; + + bool m_page_switch_planned = false; + public: PresetBundle* m_preset_bundle; bool m_show_btn_incompatible_presets = false; @@ -351,6 +354,7 @@ protected: void compatible_widget_reload(PresetDependencies &deps); void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false); + void tree_sel_change_delayed(); void on_presets_changed(); void build_preset_description_line(ConfigOptionsGroup* optgroup); void update_preset_description_line();