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;
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;

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),
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<Preset>& 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,6 +450,9 @@ void PresetComboBox::update()
void PresetComboBox::update_from_bundle()
{
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);
}
@ -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<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();
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<void(int)> 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

View File

@ -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();

View File

@ -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<PresetBundle>(*wxGetApp().preset_bundle);
m_preset_bundle_right = std::make_unique<PresetBundle>(*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<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_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);
}

View File

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