mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 04:02:02 +08:00
Fix for SPE-2172 : Compare preset dialog doesn't respect compatibility condition.
This commit is contained in:
parent
9b6b20070a
commit
2b837d9f6e
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user