diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index eb51006780..04e1683023 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -477,7 +477,7 @@ void PresetBundle::reset_extruder_filaments() this->extruders_filaments.emplace_back(ExtruderFilaments(&filaments, id, names[id])); } -PresetCollection&PresetBundle::get_presets(Preset::Type type) +const PresetCollection& PresetBundle::get_presets(Preset::Type type) const { assert(type >= Preset::TYPE_PRINT && type <= Preset::TYPE_PRINTER); @@ -488,6 +488,12 @@ PresetCollection&PresetBundle::get_presets(Preset::Type type) } +PresetCollection& PresetBundle::get_presets(Preset::Type type) +{ + return const_cast(const_cast(this)->get_presets(type)); +} + + const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias, int extruder_id /*= -1*/) { // there are not aliases for Printers profiles diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 4bdc10ea4d..06374a1643 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -87,7 +87,8 @@ public: - PresetCollection& get_presets(Preset::Type preset_type); + const PresetCollection& get_presets(Preset::Type preset_type) const; + PresetCollection& get_presets(Preset::Type preset_type); // The project configuration values are kept separated from the print/filament/printer preset, // they are being serialized / deserialized from / to the .amf, .3mf, .config, .gcode, diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 2a2becf445..acedf3b8ef 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -1503,7 +1503,7 @@ PageCustom::PageCustom(ConfigWizard *parent) auto *label = new wxStaticText(this, wxID_ANY, _L("Custom profile name:")); wxBoxSizer* profile_name_sizer = new wxBoxSizer(wxVERTICAL); - profile_name_editor = new SavePresetDialog::Item{ this, profile_name_sizer, default_profile_name, &wxGetApp().preset_bundle->printers}; + profile_name_editor = new SavePresetDialog::Item{ this, profile_name_sizer, default_profile_name, wxGetApp().preset_bundle}; profile_name_editor->Enable(false); cb_custom->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index c98cd97768..56a350f32a 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -33,7 +33,7 @@ constexpr auto BORDER_W = 10; std::string SavePresetDialog::Item::get_init_preset_name(const std::string &suffix) { - PresetBundle* preset_bundle = dynamic_cast(m_parent)->get_preset_bundle(); + const PresetBundle* preset_bundle = dynamic_cast(m_parent)->get_preset_bundle(); if (!preset_bundle) preset_bundle = wxGetApp().preset_bundle; m_presets = &preset_bundle->get_presets(m_type); @@ -55,11 +55,30 @@ std::string SavePresetDialog::Item::get_init_preset_name(const std::string &suff void SavePresetDialog::Item::init_casei_preset_names() { m_casei_preset_names.clear(); - m_casei_preset_names.reserve(m_presets->size()); - for (const Preset& preset : *m_presets) - if (!preset.is_default) - m_casei_preset_names.emplace_back(PresetName({ boost::to_lower_copy(preset.name), preset.name })); + auto add_names_from_collection = [this](const PresetCollection& presets) { + for (const Preset& preset : presets) + if (!preset.is_default) + m_casei_preset_names.emplace_back(PresetName({ boost::to_lower_copy(preset.name), preset.name })); + }; + + if (m_presets) { + // This item is a part of SavePresetDialog and will check names inside selected PresetCollection + m_casei_preset_names.reserve(m_presets->size()); + add_names_from_collection(*m_presets); + } + else // This item is a part of ConfigWizard and will check names inside all PresetCollections in respect to the m_printer_technology + if (m_preset_bundle) { + auto types_list = PresetBundle::types_list(m_printer_technology); + + size_t presets_cnt = 0; + for (const Preset::Type& type : types_list) + presets_cnt += m_preset_bundle->get_presets(type).size(); + m_casei_preset_names.reserve(presets_cnt); + + for (const Preset::Type& type : types_list) + add_names_from_collection(m_preset_bundle->get_presets(type)); + } std::sort(m_casei_preset_names.begin(), m_casei_preset_names.end()); } @@ -139,9 +158,9 @@ SavePresetDialog::Item::Item(Preset::Type type, const std::string& suffix, wxBox update(); } -SavePresetDialog::Item::Item(wxWindow* parent, wxBoxSizer* sizer, const std::string& def_name, PresetCollection* presets, PrinterTechnology pt /*= ptFFF*/): +SavePresetDialog::Item::Item(wxWindow* parent, wxBoxSizer* sizer, const std::string& def_name, PresetBundle* preset_bundle, PrinterTechnology pt /*= ptFFF*/): m_preset_name(def_name), - m_presets(presets), + m_preset_bundle(preset_bundle), m_printer_technology(pt), m_parent(parent), m_valid_bmp(new wxStaticBitmap(m_parent, wxID_ANY, *get_bmp_bundle("tick_mark"))), @@ -196,10 +215,12 @@ const Preset* SavePresetDialog::Item::get_existing_preset() const if (m_presets) return m_presets->find_preset(existed_preset_name, false); - for (const Preset::Type& type : PresetBundle::types_list(m_printer_technology)) { - const PresetCollection& presets = wxGetApp().preset_bundle->get_presets(type); - if (const Preset* preset = presets.find_preset(existed_preset_name, false)) - return preset; + if (m_preset_bundle) { + for (const Preset::Type& type : PresetBundle::types_list(m_printer_technology)) { + const PresetCollection& presets = m_preset_bundle->get_presets(type); + if (const Preset* preset = presets.find_preset(existed_preset_name, false)) + return preset; + } } return nullptr; diff --git a/src/slic3r/GUI/SavePresetDialog.hpp b/src/slic3r/GUI/SavePresetDialog.hpp index 1cc98d56ec..9b870920d3 100644 --- a/src/slic3r/GUI/SavePresetDialog.hpp +++ b/src/slic3r/GUI/SavePresetDialog.hpp @@ -40,8 +40,11 @@ public: Warning }; + // Item as an item inside of the SavePresetDialog Item(Preset::Type type, const std::string& suffix, wxBoxSizer* sizer, SavePresetDialog* parent, bool is_for_multiple_save); - Item(wxWindow* parent, wxBoxSizer* sizer, const std::string& def_name, PresetCollection* presets, PrinterTechnology pt = ptFFF); + + // Item as a separate control(f.e. as a part of ConfigWizard to check name of the new custom priter) + Item(wxWindow* parent, wxBoxSizer* sizer, const std::string& def_name, PresetBundle* preset_bundle, PrinterTechnology pt = ptFFF); void update_valid_bmp(); void accept(); @@ -71,7 +74,8 @@ public: wxTextCtrl* m_text_ctrl {nullptr}; wxStaticText* m_valid_label {nullptr}; - PresetCollection* m_presets {nullptr}; + const PresetCollection* m_presets {nullptr}; + const PresetBundle* m_preset_bundle {nullptr}; std::vector m_casei_preset_names; @@ -108,7 +112,7 @@ public: void AddItem(Preset::Type type, const std::string& suffix, bool is_for_multiple_save); - PresetBundle* get_preset_bundle() const { return m_preset_bundle; } + const PresetBundle* get_preset_bundle() const { return m_preset_bundle; } std::string get_name(); std::string get_name(Preset::Type type);