diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 8e7ddc2e8c..f6399dc63f 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -127,7 +127,6 @@ PresetBundle& PresetBundle::operator=(const PresetBundle &rhs) printers = rhs.printers; physical_printers = rhs.physical_printers; - extruders_filaments = rhs.extruders_filaments; project_config = rhs.project_config; vendors = rhs.vendors; obsolete_presets = rhs.obsolete_presets; @@ -139,6 +138,21 @@ PresetBundle& PresetBundle::operator=(const PresetBundle &rhs) sla_materials.update_vendor_ptrs_after_copy(this->vendors); printers .update_vendor_ptrs_after_copy(this->vendors); + // Copy extruders filaments + { + if (!extruders_filaments.empty()) + extruders_filaments.clear(); + size_t i = 0; + // create extruders_filaments to correct pointer to the new filaments + for (const ExtruderFilaments& rhs_filaments : rhs.extruders_filaments) { + extruders_filaments.emplace_back(ExtruderFilaments(&filaments, i, rhs_filaments.get_selected_preset_name())); + ExtruderFilaments& this_filaments = extruders_filaments[i]; + for (size_t preset_id = 0; preset_id < this_filaments.m_filaments->size(); preset_id++) + this_filaments.filament(preset_id).is_compatible = rhs_filaments.filament(preset_id).is_compatible; + i++; + } + } + return *this; } @@ -536,6 +550,9 @@ bool PresetBundle::transfer_and_save(Preset::Type type, const std::string& prese return false; preset.config.apply_only(preset_from->config, options); + if (type == Preset::TYPE_FILAMENT) + cache_extruder_filaments_names(); + // Store new_name preset to disk. preset.save(); @@ -547,8 +564,7 @@ bool PresetBundle::transfer_and_save(Preset::Type type, const std::string& prese copy_bed_model_and_texture_if_needed(preset.config); if (type == Preset::TYPE_FILAMENT) { - // synchronize the first filament presets. - set_filament_preset(0, filaments.get_selected_preset_name()); + reset_extruder_filaments(); } return true; diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index e2f356082f..1f02867d5f 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -83,9 +83,32 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const BitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY), m_type(preset_type), m_last_selected(wxNOT_FOUND), - m_em_unit(em_unit(this)), - m_preset_bundle(preset_bundle ? preset_bundle : wxGetApp().preset_bundle) + m_em_unit(em_unit(this)) { + init_from_bundle(preset_bundle); + + m_bitmapCompatible = get_bmp_bundle("flag_green"); + m_bitmapIncompatible = get_bmp_bundle("flag_red"); + + // parameters for an icon's drawing + fill_width_height(); + + Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) { + if (m_suppress_change) + e.StopPropagation(); + else + e.Skip(); + }); + Bind(wxEVT_COMBOBOX_DROPDOWN, [this](wxCommandEvent&) { m_suppress_change = false; }); + Bind(wxEVT_COMBOBOX_CLOSEUP, [this](wxCommandEvent&) { m_suppress_change = true; }); + + Bind(wxEVT_COMBOBOX, &PresetComboBox::OnSelect, this); +} + +void PresetComboBox::init_from_bundle(PresetBundle* preset_bundle) +{ + m_preset_bundle = preset_bundle ? preset_bundle : wxGetApp().preset_bundle; + switch (m_type) { case Preset::TYPE_PRINT: { @@ -115,23 +138,6 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const } default: break; } - - m_bitmapCompatible = get_bmp_bundle("flag_green"); - m_bitmapIncompatible = get_bmp_bundle("flag_red"); - - // parameters for an icon's drawing - fill_width_height(); - - Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) { - if (m_suppress_change) - e.StopPropagation(); - else - e.Skip(); - }); - Bind(wxEVT_COMBOBOX_DROPDOWN, [this](wxCommandEvent&) { m_suppress_change = false; }); - Bind(wxEVT_COMBOBOX_CLOSEUP, [this](wxCommandEvent&) { m_suppress_change = true; }); - - Bind(wxEVT_COMBOBOX, &PresetComboBox::OnSelect, this); } void PresetComboBox::OnSelect(wxCommandEvent& evt) @@ -247,12 +253,15 @@ static wxString get_preset_name_with_suffix(const Preset & preset) return from_u8(preset.name + Preset::suffix_modified()); } +// ysToDo : Add separator for "Templates" presets void PresetComboBox::update(std::string select_preset_name) { Freeze(); Clear(); invalidate_selection(); + const ExtruderFilaments* extruder_filaments = m_preset_bundle->extruders_filaments.empty() ? nullptr : &m_preset_bundle->extruders_filaments[m_extruder_idx]; + const std::deque& presets = m_collection->get_presets(); struct PresetData { @@ -272,7 +281,9 @@ void PresetComboBox::update(std::string select_preset_name) for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i) { const Preset& preset = presets[i]; - if (!m_show_all && (!preset.is_visible || !preset.is_compatible)) + const bool is_compatible = m_type == Preset::TYPE_FILAMENT && extruder_filaments ? extruder_filaments->filament(i).is_compatible : preset.is_compatible; + + if (!m_show_all && (!preset.is_visible || !is_compatible)) continue; // marker used for disable incompatible printer models for the selected physical printer @@ -288,7 +299,7 @@ void PresetComboBox::update(std::string select_preset_name) } std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - auto bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); + auto bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, is_compatible, preset.is_system || preset.is_default); assert(bmp); if (!is_enabled) { @@ -439,7 +450,10 @@ void PresetComboBox::update() void PresetComboBox::update_from_bundle() { - this->update(m_collection->get_selected_preset().name); + if (m_collection->type() == Preset::TYPE_FILAMENT && !m_preset_bundle->extruders_filaments.empty()) + this->update(m_preset_bundle->extruders_filaments[m_extruder_idx].get_selected_preset_name()); + else + this->update(m_collection->get_selected_preset().name); } void PresetComboBox::msw_rescale() @@ -1270,7 +1284,7 @@ void TabPresetComboBox::update() Clear(); invalidate_selection(); - const ExtruderFilaments& extruder_filaments = m_preset_bundle->extruders_filaments[m_active_extruder_idx]; + const ExtruderFilaments& extruder_filaments = m_preset_bundle->extruders_filaments[m_extruder_idx]; const std::deque& presets = m_collection->get_presets(); diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index 5a9821b7de..fd40a18ab9 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -41,6 +41,8 @@ public: PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize, PresetBundle* preset_bundle = nullptr); ~PresetComboBox(); + void init_from_bundle(PresetBundle* preset_bundle); + enum LabelItemType { LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01, LABEL_ITEM_DISABLED, @@ -82,6 +84,10 @@ public: virtual void sys_color_changed(); virtual void OnSelect(wxCommandEvent& evt); + // used by Filaments list to update preset list according to the particular extruder + void set_extruder_idx(int extruder_idx) { m_extruder_idx = extruder_idx; } + int get_extruder_idx() { return m_extruder_idx; } + protected: typedef std::size_t Marker; std::function on_selection_changed { nullptr }; @@ -104,6 +110,9 @@ protected: int m_em_unit; bool m_suppress_change { true }; + // This parameter is used by FilamentSettings tab to show filament setting related to the active extruder + int m_extruder_idx{ 0 }; + // parameters for an icon's drawing int icon_height; int norm_icon_width; @@ -156,9 +165,6 @@ public: ScalableButton* edit_btn { nullptr }; wxGenericStaticText* connect_info { nullptr }; - void set_extruder_idx(const int extr_idx) { m_extruder_idx = extr_idx; } - int get_extruder_idx() const { return m_extruder_idx; } - void switch_to_tab(); void change_extruder_color(); void show_add_menu(); @@ -171,9 +177,6 @@ public: void OnSelect(wxCommandEvent& evt) override; std::string get_selected_ph_printer_name() const; - -private: - int m_extruder_idx = -1; }; @@ -185,8 +188,6 @@ class TabPresetComboBox : public PresetComboBox { bool show_incompatible {false}; bool m_enable_all {false}; - // This parameter is used by FilamentSettings tab to show filament setting related to the active extruder - int m_active_extruder_idx {0}; public: TabPresetComboBox(wxWindow *parent, Preset::Type preset_type); @@ -205,9 +206,6 @@ public: PresetCollection* presets() const { return m_collection; } Preset::Type type() const { return m_type; } - - // used by Filaments tab to update preset list according to the particular extruder - void set_active_extruder(int extruder_idx) { m_active_extruder_idx = extruder_idx; } }; } // namespace GUI diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 3ddb44e9ac..37a6120d15 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2106,7 +2106,7 @@ void TabFilament::update_extruder_combobox() // To avoid inconsistance between value of active_extruder in FilamentTab and TabPresetComboBox, // which can causes a crash on switch preset from MM printer to SM printer - m_presets_choice->set_active_extruder(m_active_extruder); + m_presets_choice->set_extruder_idx(m_active_extruder); } m_extruders_cb->SetSelection(m_active_extruder); @@ -2120,11 +2120,11 @@ bool TabFilament::set_active_extruder(int new_selected_extruder) const int old_extruder_id = m_active_extruder; m_active_extruder = new_selected_extruder; - m_presets_choice->set_active_extruder(m_active_extruder); + m_presets_choice->set_extruder_idx(m_active_extruder); if (!select_preset(m_preset_bundle->extruders_filaments[m_active_extruder].get_selected_preset_name())) { m_active_extruder = old_extruder_id; - m_presets_choice->set_active_extruder(m_active_extruder); + m_presets_choice->set_extruder_idx(m_active_extruder); m_extruders_cb->SetSelection(m_active_extruder); return false; } @@ -2471,7 +2471,7 @@ void TabFilament::load_current_preset() } assert(m_active_extruder >= 0); - m_presets_choice->set_active_extruder(m_active_extruder); + m_presets_choice->set_extruder_idx(m_active_extruder); if (m_active_extruder != m_extruders_cb->GetSelection()) m_extruders_cb->Select(m_active_extruder); } @@ -2483,7 +2483,7 @@ void TabFilament::load_current_preset() // To avoid inconsistance between value of active_extruder in FilamentTab and TabPresetComboBox, // which can causes a crash on switch preset from MM printer to SM printer - m_presets_choice->set_active_extruder(m_active_extruder); + m_presets_choice->set_extruder_idx(m_active_extruder); } Tab::load_current_preset(); diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 9276d35da4..0fae8a3eb4 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -1491,9 +1491,9 @@ void DiffPresetDialog::create_presets_sizer() sizer->Add(cb, 1); cb->Show(new_type == Preset::TYPE_PRINTER); }; - add_preset_combobox(&presets_left, m_preset_bundle_left.get()); + add_preset_combobox(&presets_left, &m_preset_bundle_left); sizer->Add(equal_bmp, 0, wxRIGHT | wxLEFT | wxALIGN_CENTER_VERTICAL, 5); - add_preset_combobox(&presets_right, m_preset_bundle_right.get()); + add_preset_combobox(&presets_right, &m_preset_bundle_right); m_presets_sizer->Add(sizer, 1, wxTOP, 5); equal_bmp->Show(new_type == Preset::TYPE_PRINTER); @@ -1503,7 +1503,7 @@ void DiffPresetDialog::create_presets_sizer() std::string preset_name = get_selection(presets_left); presets_right->update(preset_name); if (m_view_type == Preset::TYPE_INVALID) - update_compatibility(preset_name, presets_right->get_type(), m_preset_bundle_right.get()); + update_compatibility(preset_name, presets_right->get_type(), &m_preset_bundle_right); update_tree(); }); } @@ -1669,8 +1669,8 @@ DiffPresetDialog::DiffPresetDialog(MainFrame* mainframe) assert(wxGetApp().preset_bundle); - m_preset_bundle_left = std::make_unique(*wxGetApp().preset_bundle); - m_preset_bundle_right = std::make_unique(*wxGetApp().preset_bundle); + m_preset_bundle_left = *wxGetApp().preset_bundle; + m_preset_bundle_right = *wxGetApp().preset_bundle; // Create UI items @@ -1700,6 +1700,13 @@ void DiffPresetDialog::update_controls_visibility(Preset::Type type /* = Preset: preset_combos.presets_right->Show(show); if (show) { + if (cb_type == Preset::TYPE_FILAMENT) { + int extruder_id = 0; + if (type == Preset::TYPE_FILAMENT) + extruder_id = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_FILAMENT))->get_active_extruder(); + preset_combos.presets_left->set_extruder_idx(extruder_id); + preset_combos.presets_right->set_extruder_idx(extruder_id); + } preset_combos.presets_left->update_from_bundle(); preset_combos.presets_right->update_from_bundle(); } @@ -1710,10 +1717,17 @@ void DiffPresetDialog::update_controls_visibility(Preset::Type type /* = Preset: void DiffPresetDialog::update_bundles_from_app() { - *m_preset_bundle_left = *wxGetApp().preset_bundle; - *m_preset_bundle_right = *wxGetApp().preset_bundle; + m_preset_bundle_left = *wxGetApp().preset_bundle; + m_preset_bundle_right = *wxGetApp().preset_bundle; - m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + m_pr_technology = m_preset_bundle_left.printers.get_edited_preset().printer_technology(); + + for (auto preset_combos : m_preset_combos) { + if (m_view_type == Preset::TYPE_INVALID || m_view_type == preset_combos.presets_left->get_type()) { + preset_combos.presets_left->init_from_bundle(&m_preset_bundle_left); + preset_combos.presets_right->init_from_bundle(&m_preset_bundle_right); + } + } } void DiffPresetDialog::show(Preset::Type type /* = Preset::TYPE_INVALID*/) @@ -1969,7 +1983,7 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres update_compatible_type(technology_changed, print_tab, true), update_compatible_type(technology_changed, false, true)); - bool is_left_presets = preset_bundle == m_preset_bundle_left.get(); + bool is_left_presets = preset_bundle == &m_preset_bundle_left; PrinterTechnology pr_tech = preset_bundle->printers.get_selected_preset().printer_technology(); // update preset comboboxes @@ -1987,10 +2001,10 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres } if (technology_changed && - m_preset_bundle_left.get()->printers.get_selected_preset().printer_technology() == - m_preset_bundle_right.get()->printers.get_selected_preset().printer_technology()) + m_preset_bundle_left.printers.get_selected_preset().printer_technology() == + m_preset_bundle_right.printers.get_selected_preset().printer_technology()) { - m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + m_pr_technology = m_preset_bundle_left.printers.get_edited_preset().printer_technology(); update_controls_visibility(); } } @@ -2009,7 +2023,7 @@ bool DiffPresetDialog::is_save_confirmed() } if (!types_for_save.empty()) { - SavePresetDialog save_dlg(this, types_for_save, _u8L("Modified"), m_preset_bundle_right.get()); + SavePresetDialog save_dlg(this, types_for_save, _u8L("Modified"), false, &m_preset_bundle_right); if (save_dlg.ShowModal() != wxID_OK) return false; @@ -2051,8 +2065,8 @@ void DiffPresetDialog::button_event(Action act) MessageDialog(this, UnsavedChangesDialog::msg_success_saved_modifications(saved_cnt)).ShowModal(); update_bundles_from_app(); for (const auto& preset : presets_to_save) { - m_preset_bundle_left->get_presets(preset.type).select_preset_by_name(preset.from_name, true); - m_preset_bundle_right->get_presets(preset.type).select_preset_by_name(preset.new_name, true); + m_preset_bundle_left.get_presets(preset.type).select_preset_by_name(preset.from_name, true); + m_preset_bundle_right.get_presets(preset.type).select_preset_by_name(preset.new_name, true); } update_presets(m_view_type, false); } diff --git a/src/slic3r/GUI/UnsavedChangesDialog.hpp b/src/slic3r/GUI/UnsavedChangesDialog.hpp index e83d023d86..d2866dbbcc 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.hpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.hpp @@ -361,8 +361,8 @@ class DiffPresetDialog : public DPIDialog Preset::Type m_view_type { Preset::TYPE_INVALID }; PrinterTechnology m_pr_technology; - std::unique_ptr m_preset_bundle_left; - std::unique_ptr m_preset_bundle_right; + PresetBundle m_preset_bundle_left; + PresetBundle m_preset_bundle_right; void create_buttons(); void create_edit_sizer();