diff options
author | supermerill <merill@free.fr> | 2021-11-05 14:55:27 +0300 |
---|---|---|
committer | supermerill <merill@free.fr> | 2021-11-06 23:19:34 +0300 |
commit | 6d641fa24bddc5aa9bfa032528ab84edc4e2863b (patch) | |
tree | c4b91b4f5ea8760ff729fee21f9d9fcfb0d5d8e6 /src | |
parent | 03cf86b06c050fc4f68ff9fe7a9905719455875e (diff) |
Fix crash when creating a physical printer & having a dirty printer
supermerill/SuperSlicer#1631
Diffstat (limited to 'src')
-rw-r--r-- | src/slic3r/GUI/PhysicalPrinterDialog.cpp | 9 | ||||
-rw-r--r-- | src/slic3r/GUI/Tab.cpp | 34 | ||||
-rw-r--r-- | src/slic3r/GUI/UnsavedChangesDialog.cpp | 12 |
3 files changed, 46 insertions, 9 deletions
diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 307259f47..54701eedd 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -180,7 +180,14 @@ PhysicalPrinterDialog::PhysicalPrinterDialog(wxWindow* parent, wxString printer_ m_printer_name = new wxTextCtrl(this, wxID_ANY, printer_name, wxDefaultPosition, wxDefaultSize); m_printer_name->Bind(wxEVT_TEXT, [this](wxEvent&) { this->update_full_printer_names(); }); - + m_printer_name->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent& e) { + if (m_printer_name->GetValue() == m_default_name) m_printer_name->SetValue(""); + e.Skip(); + }); + m_printer_name->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { + if (m_printer_name->GetValue().empty()) m_printer_name->SetValue(m_default_name); + e.Skip(); + }); PhysicalPrinterCollection& printers = wxGetApp().preset_bundle->physical_printers; PhysicalPrinter* printer = printers.find_printer(into_u8(printer_name)); if (!printer) { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0e3375df3..fc789adbd 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -366,6 +366,33 @@ void Tab::create_preset_tab() if (m_btn_edit_ph_printer) m_btn_edit_ph_printer->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) { + // ask for saving modif before + if (m_presets->current_is_dirty()) { + //ok = may_discard_current_dirty_preset(nullptr, ""); + UnsavedChangesDialog dlg(Preset::Type::TYPE_PRINTER, m_presets, ""); + if (dlg.ShowModal() == wxID_CANCEL) + return; + + if (dlg.save_preset()) // save selected changes + { + const std::vector<std::string>& unselected_options = dlg.get_unselected_options(Preset::Type::TYPE_PRINTER); + const std::string& name = dlg.get_preset_name(); + + // revert unselected options to the old values + m_presets->get_edited_preset().config.apply_only(m_presets->get_selected_preset().config, unselected_options); + save_preset(name); + + for (const std::pair<std::string, Preset::Type>& nt : dlg.get_names_and_types()) + m_preset_bundle->save_changes_for_preset(nt.first, nt.second, dlg.get_unselected_options(nt.second)); + + // if we saved changes to the new presets, we should to + // synchronize config.ini with the current selections. + m_preset_bundle->export_selections(*wxGetApp().app_config); + } else { + // discard all changes + m_presets->discard_current_changes(); + } + } if (m_preset_bundle->physical_printers.has_selection()) m_presets_choice->edit_physical_printer(); else @@ -3471,7 +3498,7 @@ bool Tab::may_discard_current_dirty_preset(PresetCollection* presets /*= nullptr // revert unselected options to the old values presets->get_edited_preset().config.apply_only(presets->get_selected_preset().config, unselected_options); save_preset(name); - } + } else { m_preset_bundle->save_changes_for_preset(name, presets->type(), unselected_options); @@ -3481,7 +3508,7 @@ bool Tab::may_discard_current_dirty_preset(PresetCollection* presets /*= nullptr // but in full_config a filament_colors option aren't. if (presets->type() == Preset::TYPE_FFF_FILAMENT && wxGetApp().extruders_edited_cnt() > 1) wxGetApp().plater()->force_filament_colors_update(); - } + } } else if (dlg.transfer_changes()) // move selected changes { @@ -3500,8 +3527,7 @@ bool Tab::may_discard_current_dirty_preset(PresetCollection* presets /*= nullptr // copy selected options to the cache from edited preset cache_config_diff(selected_options); - } - else + } else wxGetApp().get_tab(presets->type())->cache_config_diff(selected_options); } diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index b5927b40f..d56e82d80 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -646,9 +646,13 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ }; const PresetCollection& printers = wxGetApp().preset_bundle->printers; - if (dependent_presets && (type == dependent_presets->type() ? - dependent_presets->get_edited_preset().printer_technology() == dependent_presets->find_preset(new_selected_preset)->printer_technology() : - printers.get_edited_preset().printer_technology() == printers.find_preset(new_selected_preset)->printer_technology())) + // get the preset we switch to (if it exists) + const Preset* new_preset = nullptr; + if (dependent_presets) + new_preset = (type == dependent_presets->type() ? dependent_presets->find_preset(new_selected_preset) : printers.find_preset(new_selected_preset)); + if (new_preset && dependent_presets && (type == dependent_presets->type() ? + dependent_presets->get_edited_preset().printer_technology() == new_preset->printer_technology() : + printers.get_edited_preset().printer_technology() == new_preset->printer_technology())) add_btn(&m_transfer_btn, m_move_btn_id, "paste_menu", Action::Transfer, _L("Transfer")); add_btn(&m_discard_btn, m_continue_btn_id, dependent_presets ? "switch_presets" : "exit", Action::Discard, _L("Discard"), false); add_btn(&m_save_btn, m_save_btn_id, "save", Action::Save, _L("Save")); @@ -1042,7 +1046,7 @@ void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent m_discard_btn ->Bind(wxEVT_ENTER_WINDOW, [this] (wxMouseEvent& e) { show_info_line(Action::Discard); e.Skip(); }); - if (type == Preset::TYPE_INVALID) { + if (type == Preset::TYPE_INVALID || !dependent_presets) { m_action_line->SetLabel(header + "\n" + _L("The following presets were modified:")); } else { |