From 87880022fcc59cb6a2eaed155bdcd636993a35a0 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 15 Dec 2021 11:09:27 +0100 Subject: Some improvements to copying of newer configuration to current folder: 1) Less context is kept in GUI_App. 2) Copying is not being done if loading current PrusaSlicer.ini fails 3) AppConfig (PrusaSlicer.ini) is saved first after the newer configuration is installed. --- src/slic3r/GUI/GUI_App.cpp | 59 +++++++++++++++++++++++----------------------- src/slic3r/GUI/GUI_App.hpp | 10 ++++---- 2 files changed, 33 insertions(+), 36 deletions(-) (limited to 'src/slic3r/GUI') diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 81488c4b0..522546100 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -909,17 +909,18 @@ void GUI_App::init_app_config() "\n\n" + app_config->config_path() + "\n\n" + error); } } - // Save orig_version here, so its empty if no app_config existed before this run. - m_last_config_version = app_config->orig_version();//parse_semver_from_ini(app_config->config_path()); } } -// returns true if found newer version and user agreed to use it -bool GUI_App::check_older_app_config(Semver current_version, bool backup) +// returns old config path to copy from if such exists, +// returns an empty string if such config path does not exists or if it cannot be loaded. +std::string GUI_App::check_older_app_config(Semver current_version, bool backup) { + std::string older_data_dir_path; + // If the config folder is redefined - do not check if (m_datadir_redefined) - return false; + return {}; // find other version app config (alpha / beta / release) std::string config_path = app_config->config_path(); @@ -940,13 +941,13 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup) boost::optionalother_semver = parse_semver_from_ini(candidate.string()); if (other_semver && *other_semver > last_semver) { last_semver = *other_semver; - m_older_data_dir_path = candidate.parent_path().string(); + older_data_dir_path = candidate.parent_path().string(); } } } - if (m_older_data_dir_path.empty()) - return false; - BOOST_LOG_TRIVIAL(info) << "last app config file used: " << m_older_data_dir_path; + if (older_data_dir_path.empty()) + return {}; + BOOST_LOG_TRIVIAL(info) << "last app config file used: " << older_data_dir_path; // ask about using older data folder InfoDialog msg(nullptr @@ -959,13 +960,13 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup) "\n\nShall the newer configuration be imported?" "\nIf so, your active configuration will be backed up before importing the new configuration." ) - , SLIC3R_APP_NAME, current_version.to_string(), m_older_data_dir_path, last_semver.to_string()) + , SLIC3R_APP_NAME, current_version.to_string(), older_data_dir_path, last_semver.to_string()) : format_wxstr(_L( "An existing configuration was found in %3%" "\ncreated by %1% %2%." "\n\nShall this configuration be imported?" ) - , SLIC3R_APP_NAME, last_semver.to_string(), m_older_data_dir_path) + , SLIC3R_APP_NAME, last_semver.to_string(), older_data_dir_path) , true, wxYES_NO); if (backup) { @@ -989,10 +990,10 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup) BOOST_LOG_TRIVIAL(error) << "Failed to take congiguration snapshot: "; } - // This will tell later (when config folder structure is sure to exists) to copy files from m_older_data_dir_path + // This will tell later (when config folder structure is sure to exists) to copy files from older_data_dir_path m_init_app_config_from_older = true; // load app config from older file - std::string error = app_config->load((boost::filesystem::path(m_older_data_dir_path) / filename).string()); + std::string error = app_config->load((boost::filesystem::path(older_data_dir_path) / filename).string()); if (!error.empty()) { // Error while parsing config file. We'll customize the error message and rethrow to be displayed. if (is_editor()) { @@ -1011,14 +1012,9 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup) if (!snapshot_id.empty()) app_config->set("on_snapshot", snapshot_id); m_app_conf_exists = true; - return true; + return older_data_dir_path; } - return false; -} - -void GUI_App::copy_older_config() -{ - preset_bundle->copy_files(m_older_data_dir_path); + return {}; } void GUI_App::init_single_instance_checker(const std::string &name, const std::string &path) @@ -1117,16 +1113,16 @@ bool GUI_App::on_init_inner() init_label_colours(); init_fonts(); - if (m_last_config_version) { - if (*m_last_config_version < *Semver::parse(SLIC3R_VERSION)) - check_older_app_config(*m_last_config_version, true); + std::string older_data_dir_path; + if (m_app_conf_exists) { + if (app_config->orig_version() && *app_config->orig_version() < *Semver::parse(SLIC3R_VERSION)) + // Only copying configuration if it was saved with a newer slicer than the one currently running. + older_data_dir_path = check_older_app_config(*app_config->orig_version(), true); } else { - check_older_app_config(Semver(), false); + // No AppConfig exists, fresh install. Always try to copy from an alternate location, don't make backup of the current configuration. + older_data_dir_path = check_older_app_config(Semver(), false); } - app_config->set("version", SLIC3R_VERSION); - app_config->save(); - SplashScreen* scrn = nullptr; if (app_config->get("show_splash_screen") == "1") { // make a bitmap with dark grey banner on the left side @@ -1155,10 +1151,13 @@ bool GUI_App::on_init_inner() // just checking for existence of Slic3r::data_dir is not enough : it may be an empty directory // supplied as argument to --datadir; in that case we should still run the wizard preset_bundle->setup_directories(); - - if (m_init_app_config_from_older) - copy_older_config(); + if (! older_data_dir_path.empty()) + preset_bundle->copy_files(older_data_dir_path); + + // Save PrusaSlicer.ini after possibly copying the config from the alternate location and after all the configs from the alternate location were copied. + app_config->set("version", SLIC3R_VERSION); + app_config->save(); if (is_editor()) { #ifdef __WXMSW__ diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index b1b0a7786..9c65bc024 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -341,8 +341,9 @@ public: private: bool on_init_inner(); void init_app_config(); - bool check_older_app_config(Semver current_version, bool backup); - void copy_older_config(); + // returns old config path to copy from if such exists, + // returns an empty string if such config path does not exists or if it cannot be loaded. + std::string check_older_app_config(Semver current_version, bool backup); void window_pos_save(wxTopLevelWindow* window, const std::string &name); void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false); void window_pos_sanitize(wxTopLevelWindow* window); @@ -351,10 +352,7 @@ private: bool config_wizard_startup(); void check_updates(const bool verbose); - bool m_init_app_config_from_older { false }; - bool m_datadir_redefined { false }; - std::string m_older_data_dir_path; - boost::optional m_last_config_version; + bool m_datadir_redefined { false }; }; DECLARE_APP(GUI_App) -- cgit v1.2.3