From 435b5394f748dde616faddaf31b6333f17017575 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 19 Feb 2019 14:57:59 +0100 Subject: [PATCH] OnActivate handler to: 1) Process delayed error messages from background processing 2) Set keyboard focus to the 3D scene if no wx window has keyboard focus. --- src/slic3r/GUI/ConfigWizard.cpp | 6 +++--- src/slic3r/GUI/MainFrame.cpp | 5 +++++ src/slic3r/GUI/Plater.cpp | 35 +++++++++++++++++++++++++++++++-- src/slic3r/GUI/Plater.hpp | 2 ++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 8159eff0b5..e49a0edabc 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -65,9 +65,9 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt auto *sizer = new wxBoxSizer(wxVERTICAL); - const auto font_title = GetFont().MakeBold().Scaled(1.3); + const auto font_title = GetFont().MakeBold().Scaled(1.3f); const auto font_name = GetFont().MakeBold(); - const auto font_alt_nozzle = GetFont().Scaled(0.9); + const auto font_alt_nozzle = GetFont().Scaled(0.9f); // wxGrid appends widgets by rows, but we need to construct them in columns. // These vectors are used to hold the elements so that they can be appended in the right order. @@ -789,7 +789,7 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt) const ssize_t item_hover_new = pos.y / item_height(); - if (item_hover_new < items.size() && item_hover_new != item_hover) { + if (item_hover_new < ssize_t(items.size()) && item_hover_new != item_hover) { item_hover = item_hover_new; Refresh(); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 91574cda67..f7d1e26d83 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -105,6 +105,11 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL event.Skip(); }); + Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) { + if (m_plater != nullptr && event.GetActive()) + m_plater->on_activate(); + }); + wxGetApp().persist_window_geometry(this); update_ui_from_settings(); // FIXME (?) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f5471cdff9..8e32288239 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -962,6 +962,7 @@ struct Plater::priv std::atomic arranging; std::atomic rotoptimizing; bool delayed_scene_refresh; + std::string delayed_error_message; wxTimer background_process_timer; @@ -1947,6 +1948,8 @@ unsigned int Plater::priv::update_background_process(bool force_validation) this->background_process_timer.Stop(); // Update the "out of print bed" state of ModelInstances. this->update_print_volume_state(); + // The delayed error message is no more valid. + this->delayed_error_message.clear(); // Apply new config to the possibly running background task. bool was_running = this->background_process.running(); Print::ApplyStatus invalidated = this->background_process.apply(this->q->model(), wxGetApp().preset_bundle->full_config()); @@ -1985,8 +1988,18 @@ unsigned int Plater::priv::update_background_process(bool force_validation) return_state |= UPDATE_BACKGROUND_PROCESS_RESTART; } else { // The print is not valid. - // The error returned from the Print needs to be translated into the local language. - GUI::show_error(this->q, _(err)); + // Only show the error message immediately, if the top level parent of this window is active. + auto p = dynamic_cast(this->q); + while (p->GetParent()) + p = p->GetParent(); + auto *top_level_wnd = dynamic_cast(p); + if (top_level_wnd && top_level_wnd->IsActive()) { + // The error returned from the Print needs to be translated into the local language. + GUI::show_error(this->q, _(err)); + } else { + // Show the error message once the main window gets activated. + this->delayed_error_message = _(err); + } return_state |= UPDATE_BACKGROUND_PROCESS_INVALID; } } @@ -3095,6 +3108,24 @@ void Plater::on_config_change(const DynamicPrintConfig &config) this->p->schedule_background_process(); } +void Plater::on_activate() +{ + wxWindow *focus_window = wxWindow::FindFocus(); + if (focus_window == nullptr) { + // Activating the main frame, and no window has keyboard focus. + // Set the keyboard focus to the visible Canvas3D. + if (this->p->view3D->IsShown()) + this->p->view3D->get_wxglcanvas()->SetFocus(); + else if (this->p->preview->IsShown()) + this->p->preview->get_wxglcanvas()->SetFocus(); + } + if (! this->p->delayed_error_message.empty()) { + std::string msg = std::move(this->p->delayed_error_message); + this->p->delayed_error_message.clear(); + GUI::show_error(this, msg); + } +} + const wxString& Plater::get_project_filename() const { return p->project_filename; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index e3601b65c3..5dfe5528da 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -151,6 +151,8 @@ public: void on_extruders_change(int extruders_count); void on_config_change(const DynamicPrintConfig &config); + // On activating the parent window. + void on_activate(); void update_object_menu();