diff options
author | bubnikv <bubnikv@gmail.com> | 2017-12-19 21:51:22 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2017-12-19 21:51:22 +0300 |
commit | 0b6bd3cbdedaf52e95716d34294630ff22d4356c (patch) | |
tree | c8b639b007355f3df622f30225f0f23a88699d6f /xs | |
parent | 5a768ddd7b4d72088878266b363454248ea0b32a (diff) |
Implemented a "Reset user profile" on the first page of the configuration
wizard if the wizard is opened from the menu. This allows one
to reinstall the bundled printer profile cleanly.
Fixed a bug when loading a config bundle as a config: The config bundle
should not be unpacked into the user profile directory.
Diffstat (limited to 'xs')
-rw-r--r-- | xs/src/slic3r/GUI/Preset.cpp | 23 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/Preset.hpp | 2 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PresetBundle.cpp | 22 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PresetBundle.hpp | 13 | ||||
-rw-r--r-- | xs/xsp/GUI_Preset.xsp | 4 |
5 files changed, 56 insertions, 8 deletions
diff --git a/xs/src/slic3r/GUI/Preset.cpp b/xs/src/slic3r/GUI/Preset.cpp index adc996030..49c999737 100644 --- a/xs/src/slic3r/GUI/Preset.cpp +++ b/xs/src/slic3r/GUI/Preset.cpp @@ -263,6 +263,21 @@ PresetCollection::~PresetCollection() m_bitmap_main_frame = nullptr; } +void PresetCollection::reset(bool delete_files) +{ + if (m_presets.size() > 1) { + if (delete_files) { + // Erase the preset files. + for (Preset &preset : m_presets) + if (! preset.is_default && ! preset.is_external) + boost::nowide::remove(preset.file.c_str()); + } + // Don't use m_presets.resize() here as it requires a default constructor for Preset. + m_presets.erase(m_presets.begin() + 1, m_presets.end()); + this->select_preset(0); + } +} + // Load all presets found in dir_path. // Throws an exception on error. void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir) @@ -501,9 +516,11 @@ bool PresetCollection::update_dirty_ui(wxBitmapComboBox *ui) std::string preset_name = Preset::remove_suffix_modified(old_label); const Preset *preset = this->find_preset(preset_name, false); assert(preset != nullptr); - std::string new_label = preset->is_dirty ? preset->name + g_suffix_modified : preset->name; - if (old_label != new_label) - ui->SetString(ui_id, wxString::FromUTF8(new_label.c_str())); + if (preset != nullptr) { + std::string new_label = preset->is_dirty ? preset->name + g_suffix_modified : preset->name; + if (old_label != new_label) + ui->SetString(ui_id, wxString::FromUTF8(new_label.c_str())); + } } return was_dirty != is_dirty; } diff --git a/xs/src/slic3r/GUI/Preset.hpp b/xs/src/slic3r/GUI/Preset.hpp index bfb7d6e20..b37982017 100644 --- a/xs/src/slic3r/GUI/Preset.hpp +++ b/xs/src/slic3r/GUI/Preset.hpp @@ -116,6 +116,8 @@ public: PresetCollection(Preset::Type type, const std::vector<std::string> &keys); ~PresetCollection(); + void reset(bool delete_files); + Preset::Type type() const { return m_type; } std::string name() const; const std::deque<Preset>& operator()() const { return m_presets; } diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index 4dc2e56ce..645477541 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -69,6 +69,16 @@ PresetBundle::~PresetBundle() delete bitmap.second; } +void PresetBundle::reset(bool delete_files) +{ + // Clear the existing presets, delete their respective files. + this->prints .reset(delete_files); + this->filaments.reset(delete_files); + this->printers .reset(delete_files); + this->filament_presets.clear(); + this->filament_presets.emplace_back(this->filaments.get_selected_preset().name); +} + void PresetBundle::setup_directories() { boost::filesystem::path data_dir = boost::filesystem::path(Slic3r::data_dir()); @@ -376,7 +386,8 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const { // 1) Load the config bundle into a temp data. PresetBundle tmp_bundle; - tmp_bundle.load_configbundle(path); + // Load the config bundle, don't save the loaded presets to user profile directory. + tmp_bundle.load_configbundle(path, 0); std::string bundle_name = std::string(" - ") + boost::filesystem::path(path).filename().string(); // 2) Extract active configs from the config bundle, copy them and activate them in this bundle. @@ -430,8 +441,11 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const // Load a config bundle file, into presets and store the loaded presets into separate files // of the local configuration directory. -size_t PresetBundle::load_configbundle(const std::string &path) +size_t PresetBundle::load_configbundle(const std::string &path, unsigned int flags) { + if (flags & LOAD_CFGBNDLE_RESET_USER_PROFILE) + this->reset(flags & LOAD_CFGBNDLE_SAVE); + // 1) Read the complete config file into a boost::property_tree. namespace pt = boost::property_tree; pt::ptree tree; @@ -504,7 +518,9 @@ size_t PresetBundle::load_configbundle(const std::string &path) #endif / presets->name() / file_name).make_preferred(); // Load the preset into the list of presets, save it to disk. - presets->load_preset(file_path.string(), preset_name, std::move(config), false).save(); + Preset &loaded = presets->load_preset(file_path.string(), preset_name, std::move(config), false); + if (flags & LOAD_CFGBNDLE_SAVE) + loaded.save(); ++ presets_loaded; } } diff --git a/xs/src/slic3r/GUI/PresetBundle.hpp b/xs/src/slic3r/GUI/PresetBundle.hpp index 238e7c802..308785fda 100644 --- a/xs/src/slic3r/GUI/PresetBundle.hpp +++ b/xs/src/slic3r/GUI/PresetBundle.hpp @@ -15,6 +15,10 @@ public: PresetBundle(); ~PresetBundle(); + // Remove all the presets but the "-- default --". + // Optionally remove all the files referenced by the presets from the user profile directory. + void reset(bool delete_files); + void setup_directories(); // Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets. @@ -51,7 +55,14 @@ public: // Load settings into the provided settings instance. // Activate the presets stored in the config bundle. // Returns the number of presets loaded successfully. - size_t load_configbundle(const std::string &path); + enum { + // Save the profiles, which have been loaded. + LOAD_CFGBNDLE_SAVE = 1, + // Delete all old config profiles before loading. + LOAD_CFGBNDLE_RESET_USER_PROFILE = 2 + }; + // Load the config bundle, store it to the user profile directory by default. + size_t load_configbundle(const std::string &path, unsigned int flags = LOAD_CFGBNDLE_SAVE); // Export a config bundle file containing all the presets and the names of the active presets. void export_configbundle(const std::string &path); // , const DynamicPrintConfig &settings); diff --git a/xs/xsp/GUI_Preset.xsp b/xs/xsp/GUI_Preset.xsp index 905ff4ecd..ed5db01e9 100644 --- a/xs/xsp/GUI_Preset.xsp +++ b/xs/xsp/GUI_Preset.xsp @@ -100,6 +100,8 @@ PresetCollection::arrayref() PresetBundle(); ~PresetBundle(); + void reset(bool delete_files); + void setup_directories() %code%{ try { @@ -128,7 +130,7 @@ PresetCollection::arrayref() size_t load_configbundle(const char *path) %code%{ try { - RETVAL = THIS->load_configbundle(path); + RETVAL = THIS->load_configbundle(path, PresetBundle::LOAD_CFGBNDLE_SAVE); } catch (std::exception& e) { croak("Loading of a config bundle %s failed:\n%s\n", path, e.what()); } |