From 4cbe7a9545501a44704869d4b1392b07f8a48de4 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 29 Jun 2021 13:25:02 +0200 Subject: [PATCH] If configuration update is available, show Dialog with information about it before ConfigWizard is opened --- src/slic3r/GUI/GUI_App.cpp | 22 +++++++++++++++++++++- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/UpdateDialogs.cpp | 21 +++++++++++++++------ src/slic3r/GUI/UpdateDialogs.hpp | 3 ++- src/slic3r/Utils/PresetUpdater.cpp | 16 ++++++++++------ src/slic3r/Utils/PresetUpdater.hpp | 12 +++++++++--- 6 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 6eb0547c3..b496c846d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1886,6 +1886,9 @@ void GUI_App::add_config_menu(wxMenuBar *menu) // Load the currently selected preset into the GUI, update the preset selection box. load_current_presets(); + + // update config wizard in respect to the new config + update_wizard_from_config(); } catch (std::exception &ex) { GUI::show_error(nullptr, _L("Failed to activate configuration snapshot.") + "\n" + into_u8(ex.what())); } @@ -2137,6 +2140,17 @@ void GUI_App::load_current_presets(bool check_printer_presets_ /*= true*/) } } +void GUI_App::update_wizard_from_config() +{ + if (!m_wizard) + return; + // If ConfigWizard was created before changing of the configuration, + // we have to destroy it to have possibility to create it again in respect to the new config's parameters + m_wizard->Reparent(nullptr); + m_wizard->Destroy(); + m_wizard = nullptr; +} + bool GUI_App::OnExceptionInMainLoop() { generic_exception_handle(); @@ -2297,7 +2311,13 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage { wxCHECK_MSG(mainframe != nullptr, false, "Internal error: Main frame not created / null"); + if (reason == ConfigWizard::RR_USER) + if (PresetUpdater::UpdateResult result = preset_updater->config_update(app_config->orig_version(), PresetUpdater::UpdateParams::FORCED_BEFORE_WIZARD); + result == PresetUpdater::R_ALL_CANCELED) + return false; + if (! m_wizard) { + wxBusyCursor wait; m_wizard = new ConfigWizard(mainframe); } @@ -2465,7 +2485,7 @@ void GUI_App::check_updates(const bool verbose) { PresetUpdater::UpdateResult updater_result; try { - updater_result = preset_updater->config_update(app_config->orig_version(), verbose); + updater_result = preset_updater->config_update(app_config->orig_version(), verbose ? PresetUpdater::UpdateParams::SHOW_TEXT_BOX : PresetUpdater::UpdateParams::SHOW_NOTIFICATION); if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) { mainframe->Close(); } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index be6c71f6c..f23f42133 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -247,6 +247,7 @@ public: bool check_print_host_queue(); bool checked_tab(Tab* tab); void load_current_presets(bool check_printer_presets = true); + void update_wizard_from_config(); wxString current_language_code() const { return m_wxLocale->GetCanonicalName(); } // Translate the language code to a code, for which Prusa Research maintains translations. Defaults to "en_US". diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index c3189c4c1..de132b184 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -85,8 +85,11 @@ bool MsgUpdateSlic3r::disable_version_check() const // MsgUpdateConfig -MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates) : - MsgDialog(nullptr, _(L("Configuration update")), _(L("Configuration update is available")), wxID_NONE) +MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_before_wizard/* = false*/) : + MsgDialog(nullptr, force_before_wizard ? _L("Opening Configuration Wizard") : _L("Configuration update"), + force_before_wizard ? _L("PrusaSlicer is not using the newest configuration available.\n" + "Configuration Wizard may not offer the latest printers, filaments and SLA materials to be installed. ") : + _L("Configuration update is available"), wxID_NONE) { auto *text = new wxStaticText(this, wxID_ANY, _(L( "Would you like to install it?\n\n" @@ -130,11 +133,17 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates) : content_sizer->Add(versions); content_sizer->AddSpacer(2*VERT_SPACING); - auto *btn_cancel = new wxButton(this, wxID_CANCEL); - btn_sizer->Add(btn_cancel); - btn_sizer->AddSpacer(HORIZ_SPACING); - auto *btn_ok = new wxButton(this, wxID_OK); + auto* btn_ok = new wxButton(this, wxID_OK, force_before_wizard ? _L("Install") : "OK"); btn_sizer->Add(btn_ok); + btn_sizer->AddSpacer(HORIZ_SPACING); + if (force_before_wizard) { + auto* btn_no_install = new wxButton(this, wxID_ANY, "Don't install"); + btn_no_install->Bind(wxEVT_BUTTON, [this](wxEvent&) { this->EndModal(wxID_CLOSE); }); + btn_sizer->Add(btn_no_install); + btn_sizer->AddSpacer(HORIZ_SPACING); + } + auto* btn_cancel = new wxButton(this, wxID_CANCEL); + btn_sizer->Add(btn_cancel); btn_ok->SetFocus(); wxGetApp().UpdateDlgDarkUI(this); diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index 6d355065a..aa3a10677 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -54,7 +54,8 @@ public: {} }; - MsgUpdateConfig(const std::vector &updates); + // force_before_wizard - indicates that check of updated is forced before ConfigWizard opening + MsgUpdateConfig(const std::vector &updates, bool force_before_wizard = false); MsgUpdateConfig(MsgUpdateConfig &&) = delete; MsgUpdateConfig(const MsgUpdateConfig &) = delete; MsgUpdateConfig &operator=(MsgUpdateConfig &&) = delete; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 7fcf1ed68..7b4321be9 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -724,9 +724,10 @@ static void reload_configs_update_gui() GUI::wxGetApp().preset_bundle->load_presets(*app_config, ForwardCompatibilitySubstitutionRule::EnableSilentDisableSystem); GUI::wxGetApp().load_current_presets(); GUI::wxGetApp().plater()->set_bed_shape(); + GUI::wxGetApp().update_wizard_from_config(); } -PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3r_version, bool no_notification) const +PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3r_version, UpdateParams params) const { if (! p->enabled_config_update) { return R_NOOP; } @@ -809,7 +810,11 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3 } // regular update - if (no_notification) { + if (params == UpdateParams::SHOW_NOTIFICATION) { + p->set_waiting_updates(updates); + GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::PresetUpdateAvailable); + } + else { BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. Asking for confirmation ...", p->waiting_updates.updates.size()); std::vector updates_msg; @@ -818,7 +823,7 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3 updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url)); } - GUI::MsgUpdateConfig dlg(updates_msg); + GUI::MsgUpdateConfig dlg(updates_msg, params == UpdateParams::FORCED_BEFORE_WIZARD); const auto res = dlg.ShowModal(); if (res == wxID_OK) { @@ -829,11 +834,10 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3 } else { BOOST_LOG_TRIVIAL(info) << "User refused the update"; + if (params == UpdateParams::FORCED_BEFORE_WIZARD && res == wxID_CANCEL) + return R_ALL_CANCELED; return R_UPDATE_REJECT; } - } else { - p->set_waiting_updates(updates); - GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::PresetUpdateAvailable); } // MsgUpdateConfig will show after the notificaation is clicked diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 0ca363c61..acec7baf7 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -35,15 +35,21 @@ public: R_INCOMPAT_CONFIGURED, R_UPDATE_INSTALLED, R_UPDATE_REJECT, - R_UPDATE_NOTIFICATION + R_UPDATE_NOTIFICATION, + R_ALL_CANCELED + }; + + enum class UpdateParams { + SHOW_TEXT_BOX, // force modal textbox + SHOW_NOTIFICATION, // only shows notification + FORCED_BEFORE_WIZARD // indicates that check of updated is forced before ConfigWizard opening }; // If updating is enabled, check if updates are available in cache, if so, ask about installation. // A false return value implies Slic3r should exit due to incompatibility of configuration. // Providing old slic3r version upgrade profiles on upgrade of an application even in case // that the config index installed from the Internet is equal to the index contained in the installation package. - // no_notification = force modal textbox, otherwise some cases only shows notification - UpdateResult config_update(const Semver &old_slic3r_version, bool no_notification) const; + UpdateResult config_update(const Semver &old_slic3r_version, UpdateParams params) const; // "Update" a list of bundles from resources (behaves like an online update). void install_bundles_rsrc(std::vector bundles, bool snapshot = true) const;