diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 587b44bcca..2bdc67ac17 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -241,44 +241,17 @@ PresetsConfigSubstitutions PresetBundle::load_presets(AppConfig &config, Forward //BBS: change system config to json std::tie(substitutions, errors_cummulative) = this->load_system_presets_from_json(substitution_rule); - //BBS load preset from user's folder, load system default if - //BBS: change directories by design - std::string dir_user_presets; - if (!config.get("preset_folder").empty()) { - dir_user_presets = data_dir() + "/" + PRESET_USER_DIR + "/" + config.get("preset_folder"); + // Load default user presets always + load_user_presets(DEFAULT_USER_FOLDER_NAME, substitution_rule); + // BBS load preset from user's folder, load system default if + // BBS: change directories by design + std::string dir_user_presets = config.get("preset_folder"); + if (!dir_user_presets.empty()) { + load_user_presets(dir_user_presets, substitution_rule); } - else { - dir_user_presets = data_dir() + "/" + PRESET_USER_DIR + "/" + DEFAULT_USER_FOLDER_NAME; - } - fs::path user_folder(data_dir() + "/" + PRESET_USER_DIR); - if (!fs::exists(user_folder)) - fs::create_directory(user_folder); - fs::path folder(dir_user_presets); - if (!fs::exists(folder)) - fs::create_directory(folder); - - // BBS do not load sla_print - //BBS: change directoties by design - try { - this->prints.load_presets(dir_user_presets, PRESET_PRINT_NAME, substitutions, substitution_rule); - } catch (const std::runtime_error &err) { - errors_cummulative += err.what(); - } - try { - this->filaments.load_presets(dir_user_presets, PRESET_FILAMENT_NAME, substitutions, substitution_rule); - } catch (const std::runtime_error &err) { - errors_cummulative += err.what(); - } - try { - this->printers.load_presets(dir_user_presets, PRESET_PRINTER_NAME, substitutions, substitution_rule); - } catch (const std::runtime_error &err) { - errors_cummulative += err.what(); - } this->update_multi_material_filament_presets(); this->update_compatible(PresetSelectCompatibleType::Never); - if (! errors_cummulative.empty()) - throw Slic3r::RuntimeError(errors_cummulative); this->load_selections(config, preferred_selection); @@ -534,7 +507,42 @@ std::string PresetBundle::get_hotend_model_for_printer_model(std::string model_n return out; } -PresetsConfigSubstitutions PresetBundle::load_user_presets(AppConfig &config, std::map>& my_presets, ForwardCompatibilitySubstitutionRule substitution_rule) +PresetsConfigSubstitutions PresetBundle::load_user_presets(std::string user, ForwardCompatibilitySubstitutionRule substitution_rule) +{ + PresetsConfigSubstitutions substitutions; + std::string errors_cummulative; + + fs::path user_folder(data_dir() + "/" + PRESET_USER_DIR); + if (!fs::exists(user_folder)) fs::create_directory(user_folder); + + std::string dir_user_presets = data_dir() + "/" + PRESET_USER_DIR + "/" + user; + fs::path folder(user_folder / user); + if (!fs::exists(folder)) fs::create_directory(folder); + + // BBS do not load sla_print + // BBS: change directoties by design + try { + this->prints.load_presets(dir_user_presets, PRESET_PRINT_NAME, substitutions, substitution_rule); + } catch (const std::runtime_error &err) { + errors_cummulative += err.what(); + } + try { + this->filaments.load_presets(dir_user_presets, PRESET_FILAMENT_NAME, substitutions, substitution_rule); + } catch (const std::runtime_error &err) { + errors_cummulative += err.what(); + } + try { + this->printers.load_presets(dir_user_presets, PRESET_PRINTER_NAME, substitutions, substitution_rule); + } catch (const std::runtime_error &err) { + errors_cummulative += err.what(); + } + if (!errors_cummulative.empty()) throw Slic3r::RuntimeError(errors_cummulative); + return PresetsConfigSubstitutions(); +} + +PresetsConfigSubstitutions PresetBundle::load_user_presets(AppConfig & config, + std::map> &my_presets, + ForwardCompatibilitySubstitutionRule substitution_rule) { // First load the vendor specific system presets. PresetsConfigSubstitutions substitutions; diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 8c0e2dd825..65caee6be9 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -47,6 +47,7 @@ public: void load_selections(AppConfig &config, const PresetPreferences& preferred_selection = PresetPreferences()); // BBS Load user presets + PresetsConfigSubstitutions load_user_presets(std::string user, ForwardCompatibilitySubstitutionRule rule); PresetsConfigSubstitutions load_user_presets(AppConfig &config, std::map>& my_presets, ForwardCompatibilitySubstitutionRule rule); PresetsConfigSubstitutions import_presets(std::vector &files, std::function override_confirm, ForwardCompatibilitySubstitutionRule rule); void save_user_presets(AppConfig& config, std::vector& need_to_delete_list); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 36106817bd..73fc8745dc 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2354,8 +2354,9 @@ bool GUI_App::on_init_inner() if (app_config->get("sync_user_preset") == "true") { //BBS loading user preset - BOOST_LOG_TRIVIAL(info) << "Loading user presets..."; - scrn->SetText(_L("Loading user presets...")); + // Always async, not such startup step + //BOOST_LOG_TRIVIAL(info) << "Loading user presets..."; + //scrn->SetText(_L("Loading user presets...")); if (m_agent) { start_sync_user_preset(); } @@ -3339,12 +3340,9 @@ void GUI_App::request_user_logout() m_agent->user_logout(); m_agent->set_user_selected_machine(""); - BOOST_LOG_TRIVIAL(info) << "preset_folder: set to empty, user_logout"; - enable_user_preset_folder(false); /* delete old user settings */ m_device_manager->clean_user_info(); GUI::wxGetApp().sidebar().load_ams_list({}); - GUI::wxGetApp().remove_user_presets(); GUI::wxGetApp().stop_sync_user_preset(); #ifdef __WINDOWS__ @@ -3894,14 +3892,15 @@ void GUI_App::reload_settings() } } -//BBS reload when login +//BBS reload when logout void GUI_App::remove_user_presets() { if (preset_bundle && m_agent) { preset_bundle->remove_users_preset(*app_config); - std::string user_id = m_agent->get_user_id(); - preset_bundle->remove_user_presets_directory(user_id); + // Not remove user preset cache + //std::string user_id = m_agent->get_user_id(); + //preset_bundle->remove_user_presets_directory(user_id); //update ui mainframe->update_side_preset_ui(); @@ -4015,42 +4014,61 @@ void GUI_App::sync_preset(Preset* preset) } } -void GUI_App::start_sync_user_preset(bool with_progress_dlg) +void GUI_App::start_sync_user_preset(bool load_immediately, bool with_progress_dlg) { - if (!m_agent) return; + if (!m_agent || !m_agent->is_user_login()) return; - enable_user_preset_folder(m_agent->is_user_login()); + enable_user_preset_folder(true); // has already start sync if (enable_sync) return; - if (m_agent->is_user_login()) { - // get setting list, update setting list - std::string version = preset_bundle->get_vendor_profile_version(PresetBundle::BBL_BUNDLE).to_string(); - if (with_progress_dlg) { - ProgressDialog dlg(_L("Loading"), "", 100, this->mainframe, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); - dlg.Update(0, _L("Loading user preset")); - m_agent->get_setting_list(version, - [this, &dlg](int percent){ - dlg.Update(percent, _L("Loading user preset")); - }, - [this, &dlg]() { - dlg.GetValue(); - bool cont = dlg.Update(dlg.GetValue(), _L("Loading user preset")); - return !cont; - }); - } else { - m_agent->get_setting_list(version); - } - GUI::wxGetApp().reload_settings(); + if (load_immediately) { + preset_bundle->load_user_presets(m_agent->get_user_id(), ForwardCompatibilitySubstitutionRule::Enable); + mainframe->update_side_preset_ui(); + } + + ProgressFn progressFn; + WasCancelledFn cancelFn; + std::function finishFn; + + if (with_progress_dlg) { + auto dlg = new ProgressDialog(_L("Loading"), "", 100, this->mainframe, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); + dlg->Update(0, _L("Loading user preset")); + progressFn = [this, dlg](int percent) { + CallAfter([=]{ + dlg->Update(percent, _L("Loading user preset")); + }); + }; + cancelFn = [dlg]() { + return dlg->WasCanceled(); + }; + finishFn = [this, dlg] { + CallAfter([=]{ + dlg->Destroy(); + reload_settings(); + }); + }; + } + else { + finishFn = [this] { + CallAfter([=] { + reload_settings(); + }); + }; } BOOST_LOG_TRIVIAL(info) << "start_sync_service..."; //BBS enable_sync = true; m_sync_update_thread = Slic3r::create_thread( - [this] { + [this, progressFn, cancelFn, finishFn] { + // get setting list, update setting list + std::string version = preset_bundle->get_vendor_profile_version(PresetBundle::BBL_BUNDLE).to_string(); + m_agent->get_setting_list(version, progressFn, cancelFn); + finishFn(); + int count = 0, sync_count = 0; std::vector presets_to_sync; while (enable_sync) { @@ -4111,6 +4129,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg) void GUI_App::stop_sync_user_preset() { + remove_user_presets(); enable_user_preset_folder(false); if (!enable_sync) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 1042ea3ee0..a080f9d789 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -421,7 +421,7 @@ public: void reload_settings(); void remove_user_presets(); void sync_preset(Preset* preset); - void start_sync_user_preset(bool with_progress_dlg = false); + void start_sync_user_preset(bool load_immediately = false, bool with_progress_dlg = false); void stop_sync_user_preset(); static bool catch_error(std::function cb, const std::string& err); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index e4aac5ccc5..e1e242ec49 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -3139,7 +3139,7 @@ void MainFrame::on_select_default_preset(SimpleEvent& evt) { case wxID_YES: { wxGetApp().app_config->set_bool("sync_user_preset", true); - wxGetApp().start_sync_user_preset(true); + wxGetApp().start_sync_user_preset(true, true); break; } case wxID_NO: diff --git a/src/slic3r/GUI/Widgets/ProgressDialog.cpp b/src/slic3r/GUI/Widgets/ProgressDialog.cpp index b8d5955079..8119f12844 100644 --- a/src/slic3r/GUI/Widgets/ProgressDialog.cpp +++ b/src/slic3r/GUI/Widgets/ProgressDialog.cpp @@ -608,6 +608,8 @@ bool ProgressDialog::Pulse(const wxString &newmsg, bool *skip) return m_state != Canceled; } +bool ProgressDialog::WasCanceled() const { return m_state == Canceled; } + bool ProgressDialog::DoBeforeUpdate(bool *skip) { // we have to yield because not only we want to update the display but diff --git a/src/slic3r/GUI/Widgets/ProgressDialog.hpp b/src/slic3r/GUI/Widgets/ProgressDialog.hpp index ae314fc3a4..83268c267d 100644 --- a/src/slic3r/GUI/Widgets/ProgressDialog.hpp +++ b/src/slic3r/GUI/Widgets/ProgressDialog.hpp @@ -36,6 +36,7 @@ public: virtual bool Update(int value, const wxString &newmsg = wxEmptyString, bool *skip = NULL); virtual bool Pulse(const wxString &newmsg = wxEmptyString, bool *skip = NULL); + bool WasCanceled() const; virtual void Resume();