Fix for SPE-2172 : Compare preset dialog doesn't respect compatibility condition.

This commit is contained in:
YuSanka 2024-03-01 21:56:18 +01:00 committed by Lukas Matena
parent 9b6b20070a
commit 2b837d9f6e
6 changed files with 101 additions and 59 deletions

View File

@ -127,7 +127,6 @@ PresetBundle& PresetBundle::operator=(const PresetBundle &rhs)
printers = rhs.printers; printers = rhs.printers;
physical_printers = rhs.physical_printers; physical_printers = rhs.physical_printers;
extruders_filaments = rhs.extruders_filaments;
project_config = rhs.project_config; project_config = rhs.project_config;
vendors = rhs.vendors; vendors = rhs.vendors;
obsolete_presets = rhs.obsolete_presets; obsolete_presets = rhs.obsolete_presets;
@ -139,6 +138,21 @@ PresetBundle& PresetBundle::operator=(const PresetBundle &rhs)
sla_materials.update_vendor_ptrs_after_copy(this->vendors); sla_materials.update_vendor_ptrs_after_copy(this->vendors);
printers .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; return *this;
} }
@ -536,6 +550,9 @@ bool PresetBundle::transfer_and_save(Preset::Type type, const std::string& prese
return false; return false;
preset.config.apply_only(preset_from->config, options); preset.config.apply_only(preset_from->config, options);
if (type == Preset::TYPE_FILAMENT)
cache_extruder_filaments_names();
// Store new_name preset to disk. // Store new_name preset to disk.
preset.save(); 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); copy_bed_model_and_texture_if_needed(preset.config);
if (type == Preset::TYPE_FILAMENT) { if (type == Preset::TYPE_FILAMENT) {
// synchronize the first filament presets. reset_extruder_filaments();
set_filament_preset(0, filaments.get_selected_preset_name());
} }
return true; return true;

View File

@ -83,9 +83,32 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const
BitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY), BitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY),
m_type(preset_type), m_type(preset_type),
m_last_selected(wxNOT_FOUND), m_last_selected(wxNOT_FOUND),
m_em_unit(em_unit(this)), m_em_unit(em_unit(this))
m_preset_bundle(preset_bundle ? preset_bundle : wxGetApp().preset_bundle)
{ {
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) switch (m_type)
{ {
case Preset::TYPE_PRINT: { case Preset::TYPE_PRINT: {
@ -115,23 +138,6 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const
} }
default: break; 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) 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()); return from_u8(preset.name + Preset::suffix_modified());
} }
// ysToDo : Add separator for "Templates" presets
void PresetComboBox::update(std::string select_preset_name) void PresetComboBox::update(std::string select_preset_name)
{ {
Freeze(); Freeze();
Clear(); Clear();
invalidate_selection(); invalidate_selection();
const ExtruderFilaments* extruder_filaments = m_preset_bundle->extruders_filaments.empty() ? nullptr : &m_preset_bundle->extruders_filaments[m_extruder_idx];
const std::deque<Preset>& presets = m_collection->get_presets(); const std::deque<Preset>& presets = m_collection->get_presets();
struct PresetData { 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) for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i)
{ {
const Preset& preset = presets[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; continue;
// marker used for disable incompatible printer models for the selected physical printer // 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; 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); assert(bmp);
if (!is_enabled) { if (!is_enabled) {
@ -439,7 +450,10 @@ void PresetComboBox::update()
void PresetComboBox::update_from_bundle() 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() void PresetComboBox::msw_rescale()
@ -1270,7 +1284,7 @@ void TabPresetComboBox::update()
Clear(); Clear();
invalidate_selection(); 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<Preset>& presets = m_collection->get_presets(); const std::deque<Preset>& presets = m_collection->get_presets();

View File

@ -41,6 +41,8 @@ public:
PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize, PresetBundle* preset_bundle = nullptr); PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize, PresetBundle* preset_bundle = nullptr);
~PresetComboBox(); ~PresetComboBox();
void init_from_bundle(PresetBundle* preset_bundle);
enum LabelItemType { enum LabelItemType {
LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01, LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01,
LABEL_ITEM_DISABLED, LABEL_ITEM_DISABLED,
@ -82,6 +84,10 @@ public:
virtual void sys_color_changed(); virtual void sys_color_changed();
virtual void OnSelect(wxCommandEvent& evt); 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: protected:
typedef std::size_t Marker; typedef std::size_t Marker;
std::function<void(int)> on_selection_changed { nullptr }; std::function<void(int)> on_selection_changed { nullptr };
@ -104,6 +110,9 @@ protected:
int m_em_unit; int m_em_unit;
bool m_suppress_change { true }; 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 // parameters for an icon's drawing
int icon_height; int icon_height;
int norm_icon_width; int norm_icon_width;
@ -156,9 +165,6 @@ public:
ScalableButton* edit_btn { nullptr }; ScalableButton* edit_btn { nullptr };
wxGenericStaticText* connect_info { 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 switch_to_tab();
void change_extruder_color(); void change_extruder_color();
void show_add_menu(); void show_add_menu();
@ -171,9 +177,6 @@ public:
void OnSelect(wxCommandEvent& evt) override; void OnSelect(wxCommandEvent& evt) override;
std::string get_selected_ph_printer_name() const; 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 show_incompatible {false};
bool m_enable_all {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: public:
TabPresetComboBox(wxWindow *parent, Preset::Type preset_type); TabPresetComboBox(wxWindow *parent, Preset::Type preset_type);
@ -205,9 +206,6 @@ public:
PresetCollection* presets() const { return m_collection; } PresetCollection* presets() const { return m_collection; }
Preset::Type type() const { return m_type; } 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 } // namespace GUI

View File

@ -2106,7 +2106,7 @@ void TabFilament::update_extruder_combobox()
// To avoid inconsistance between value of active_extruder in FilamentTab and TabPresetComboBox, // 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 // 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); 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; const int old_extruder_id = m_active_extruder;
m_active_extruder = new_selected_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())) { if (!select_preset(m_preset_bundle->extruders_filaments[m_active_extruder].get_selected_preset_name())) {
m_active_extruder = old_extruder_id; 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); m_extruders_cb->SetSelection(m_active_extruder);
return false; return false;
} }
@ -2471,7 +2471,7 @@ void TabFilament::load_current_preset()
} }
assert(m_active_extruder >= 0); 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()) if (m_active_extruder != m_extruders_cb->GetSelection())
m_extruders_cb->Select(m_active_extruder); 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, // 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 // 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(); Tab::load_current_preset();

View File

@ -1491,9 +1491,9 @@ void DiffPresetDialog::create_presets_sizer()
sizer->Add(cb, 1); sizer->Add(cb, 1);
cb->Show(new_type == Preset::TYPE_PRINTER); 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); 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); m_presets_sizer->Add(sizer, 1, wxTOP, 5);
equal_bmp->Show(new_type == Preset::TYPE_PRINTER); 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); std::string preset_name = get_selection(presets_left);
presets_right->update(preset_name); presets_right->update(preset_name);
if (m_view_type == Preset::TYPE_INVALID) 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(); update_tree();
}); });
} }
@ -1669,8 +1669,8 @@ DiffPresetDialog::DiffPresetDialog(MainFrame* mainframe)
assert(wxGetApp().preset_bundle); assert(wxGetApp().preset_bundle);
m_preset_bundle_left = std::make_unique<PresetBundle>(*wxGetApp().preset_bundle); m_preset_bundle_left = *wxGetApp().preset_bundle;
m_preset_bundle_right = std::make_unique<PresetBundle>(*wxGetApp().preset_bundle); m_preset_bundle_right = *wxGetApp().preset_bundle;
// Create UI items // Create UI items
@ -1700,6 +1700,13 @@ void DiffPresetDialog::update_controls_visibility(Preset::Type type /* = Preset:
preset_combos.presets_right->Show(show); preset_combos.presets_right->Show(show);
if (show) { if (show) {
if (cb_type == Preset::TYPE_FILAMENT) {
int extruder_id = 0;
if (type == Preset::TYPE_FILAMENT)
extruder_id = dynamic_cast<TabFilament*>(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_left->update_from_bundle();
preset_combos.presets_right->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() void DiffPresetDialog::update_bundles_from_app()
{ {
*m_preset_bundle_left = *wxGetApp().preset_bundle; m_preset_bundle_left = *wxGetApp().preset_bundle;
*m_preset_bundle_right = *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*/) 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, print_tab, true),
update_compatible_type(technology_changed, false, 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(); PrinterTechnology pr_tech = preset_bundle->printers.get_selected_preset().printer_technology();
// update preset comboboxes // update preset comboboxes
@ -1987,10 +2001,10 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres
} }
if (technology_changed && if (technology_changed &&
m_preset_bundle_left.get()->printers.get_selected_preset().printer_technology() == m_preset_bundle_left.printers.get_selected_preset().printer_technology() ==
m_preset_bundle_right.get()->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(); update_controls_visibility();
} }
} }
@ -2009,7 +2023,7 @@ bool DiffPresetDialog::is_save_confirmed()
} }
if (!types_for_save.empty()) { 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) if (save_dlg.ShowModal() != wxID_OK)
return false; return false;
@ -2051,8 +2065,8 @@ void DiffPresetDialog::button_event(Action act)
MessageDialog(this, UnsavedChangesDialog::msg_success_saved_modifications(saved_cnt)).ShowModal(); MessageDialog(this, UnsavedChangesDialog::msg_success_saved_modifications(saved_cnt)).ShowModal();
update_bundles_from_app(); update_bundles_from_app();
for (const auto& preset : presets_to_save) { 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_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_right.get_presets(preset.type).select_preset_by_name(preset.new_name, true);
} }
update_presets(m_view_type, false); update_presets(m_view_type, false);
} }

View File

@ -361,8 +361,8 @@ class DiffPresetDialog : public DPIDialog
Preset::Type m_view_type { Preset::TYPE_INVALID }; Preset::Type m_view_type { Preset::TYPE_INVALID };
PrinterTechnology m_pr_technology; PrinterTechnology m_pr_technology;
std::unique_ptr<PresetBundle> m_preset_bundle_left; PresetBundle m_preset_bundle_left;
std::unique_ptr<PresetBundle> m_preset_bundle_right; PresetBundle m_preset_bundle_right;
void create_buttons(); void create_buttons();
void create_edit_sizer(); void create_edit_sizer();