FIX: the data and UI are out of sync when creating printer

jira: STUDIO-11080
Change-Id: I4cc86174b4ed847b53c87f85f9e590742e6dd9ff
This commit is contained in:
zhimin.zeng 2025-03-24 19:18:33 +08:00 committed by lane.wei
parent 10945fcafc
commit c366876acf
5 changed files with 115 additions and 52 deletions

View File

@ -2690,7 +2690,7 @@ std::vector<std::string> PresetCollection::diameters_of_selected_printer()
std::set<std::string> diameters;
auto printer_model = m_edited_preset.config.opt_string("printer_model");
for (auto &preset : m_presets) {
if (preset.is_system && preset.config.opt_string("printer_model") == printer_model)
if (preset.config.opt_string("printer_model") == printer_model)
diameters.insert(preset.config.opt_string("printer_variant"));
}
return std::vector<std::string>{diameters.begin(), diameters.end()};

View File

@ -1629,6 +1629,10 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_item(wxWindow *parent)
MessageDialog dlg(this, _L("The model is not fond, place reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE);
dlg.ShowModal();
}
m_select_printer->SetSelection(-1);
m_select_printer->SetValue(_L("Select Printer"));
m_select_printer->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR);
e.Skip();
});
@ -2426,6 +2430,8 @@ void CreatePrinterPresetDialog::select_curr_radiobox(std::vector<std::pair<Radio
int len = radiobox_list.size();
for (int i = 0; i < len; ++i) {
if (i == btn_idx) {
if (!radiobox_list[i].first->IsEnabled())
return;
radiobox_list[i].first->SetValue(true);
wxString curr_selected_type = radiobox_list[i].second;
this->Freeze();
@ -2525,11 +2531,22 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_preset_item(wxWindow *pare
m_printer_vendor = new ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_VENDOR_SIZE, 0, nullptr, wxCB_READONLY);
m_printer_vendor->SetValue(_L("Select Vendor"));
m_printer_vendor->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR);
VendorMap vendors;
wxArrayString exist_vendor_choice = get_exist_vendor_choices(vendors);
m_printer_vendor->Set(exist_vendor_choice);
m_printer_vendor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) {
e.SetExtraLong(1); // 0 means form last page, 1 means form cur combobox
on_select_printer_model(e);
});
comboBox_sizer->Add(m_printer_vendor, 0, wxEXPAND, 0);
m_printer_model = new ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_MODEL_SIZE, 0, nullptr, wxCB_READONLY);
m_printer_model->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR);
m_printer_model->SetValue(_L("Select Model"));
m_printer_model->Bind(wxEVT_COMBOBOX, &CreatePrinterPresetDialog::on_preset_model_value_change, this);
comboBox_sizer->Add(m_printer_model, 0, wxEXPAND | wxLEFT, FromDIP(10));
vertical_sizer->Add(comboBox_sizer, 0, wxEXPAND | wxTOP, FromDIP(5));
@ -2913,33 +2930,81 @@ void CreatePrinterPresetDialog::show_page2()
bool CreatePrinterPresetDialog::data_init()
{
std::string nozzle_type = into_u8(m_nozzle_diameter->GetStringSelection());
size_t index_mm = nozzle_type.find(" mm");
if (std::string::npos != index_mm) {
nozzle_type = nozzle_type.substr(0, index_mm);
}
float nozzle = nozzle_diameter_map[nozzle_type];
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " entry and nozzle type is: " << nozzle_type << " and nozzle is: " << nozzle;
wxCommandEvent e;
e.SetExtraLong(0); // 0 means form last page, 1 means form cur combobox
on_select_printer_model(e);
auto get_nozzle_size_for_printer_model = [this](const std::string &model_name) -> size_t {
auto iter = m_printer_name_to_preset.find(model_name);
if (iter != m_printer_name_to_preset.end()) {
std::shared_ptr<Preset> printer_preset = iter->second;
if (printer_preset) {
auto nozzle_diameter = dynamic_cast<ConfigOptionFloatsNullable *>(printer_preset->config.option("nozzle_diameter", true));
return nozzle_diameter->values.size();
}
}
return 1; // default nozzle size
};
size_t selected_nozzle_size = get_nozzle_size_for_printer_model(into_u8(m_select_printer->GetStringSelection()));
bool has_set_value = false;
for (size_t i = 0; i < m_create_presets_btns.size(); ++i) {
auto &item = m_create_presets_btns[i];
if (item.second == m_create_type.base_template) {
if (selected_nozzle_size > 1) {
item.first->Disable();
item.first->SetValue(false);
}
else {
item.first->Enable();
if (!has_set_value) {
select_curr_radiobox(m_create_presets_btns, i);
has_set_value = true;
}
}
}
else {
if (!has_set_value) {
select_curr_radiobox(m_create_presets_btns, i);
has_set_value = true;
} else {
item.first->SetValue(false);
}
}
}
m_page2->SetSizerAndFit(m_page2_sizer);
return true;
}
void CreatePrinterPresetDialog::on_select_printer_model(wxCommandEvent &e)
{
bool is_from_last_page = e.GetExtraLong() == 0; // 0 means form last page, 1 means form cur combobox
m_printer_vendor->SetLabelColor(*wxBLACK);
VendorMap vendors;
wxArrayString exist_vendor_choice = get_exist_vendor_choices(vendors);
m_printer_vendor->Set(exist_vendor_choice);
m_printer_model->Bind(wxEVT_COMBOBOX, &CreatePrinterPresetDialog::on_preset_model_value_change, this);
m_printer_vendor->Bind(wxEVT_COMBOBOX, [this, vendors, nozzle](wxCommandEvent e) {
m_printer_vendor->SetLabelColor(*wxBLACK);
std::string curr_selected_vendor = into_u8(m_printer_vendor->GetStringSelection());
auto iterator = vendors.find(curr_selected_vendor);
if (iterator != vendors.end()) {
m_printer_preset_vendor_selected = iterator->second;
} else {
if (is_from_last_page) {
m_printer_vendor->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR);
return;
}
MessageDialog dlg(this, _L("Vendor is not found, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE);
dlg.ShowModal();
return;
}
std::string nozzle_type = into_u8(m_nozzle_diameter->GetStringSelection());
size_t index_mm = nozzle_type.find(" mm");
if (std::string::npos != index_mm) { nozzle_type = nozzle_type.substr(0, index_mm); }
float nozzle = nozzle_diameter_map[nozzle_type];
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " entry and nozzle type is: " << nozzle_type << " and nozzle is: " << nozzle;
wxArrayString printer_preset_model = printer_preset_sort_with_nozzle_diameter(m_printer_preset_vendor_selected, nozzle);
if (printer_preset_model.size() == 0) {
MessageDialog dlg(this, _L("Current vendor has no models, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE);
@ -2955,10 +3020,6 @@ bool CreatePrinterPresetDialog::data_init()
}
rewritten = false;
e.Skip();
});
return true;
}
void CreatePrinterPresetDialog::set_current_visible_printer()

View File

@ -126,6 +126,7 @@ protected:
/********************************************************** Data Interaction *******************************************************/
bool data_init();
void on_select_printer_model(wxCommandEvent &e);
void set_current_visible_printer();
void select_curr_radiobox(std::vector<std::pair<RadioBox *, wxString>> &radiobox_list, int btn_idx);
void select_all_preset_template(std::vector<std::pair<::CheckBox *, Preset *>> &preset_templates);

View File

@ -1977,10 +1977,10 @@ void Sidebar::create_printer_preset()
CreatePrinterPresetDialog dlg(wxGetApp().mainframe);
int res = dlg.ShowModal();
if (wxID_OK == res) {
wxGetApp().load_current_presets();
wxGetApp().mainframe->update_side_preset_ui();
update_ui_from_settings();
update_all_preset_comboboxes();
wxGetApp().load_current_presets();
CreatePresetSuccessfulDialog success_dlg(wxGetApp().mainframe, SuccessType::PRINTER);
int res = success_dlg.ShowModal();
if (res == wxID_OK) {

View File

@ -6099,9 +6099,10 @@ void Tab::update_extruder_variants(int extruder_id, bool reload)
{
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << extruder_id;
if (m_extruder_switch) {
Preset &printer_preset = m_preset_bundle->printers.get_edited_preset();
auto nozzle_volumes = m_preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
if (nozzle_volumes->size() == 2) {
int extruder_nums = m_preset_bundle->get_printer_extruder_count();
nozzle_volumes->values.resize(extruder_nums);
if (extruder_nums == 2) {
auto nozzle_volumes_def = m_preset_bundle->project_config.def()->get("nozzle_volume_type");
wxString left, right;
for (size_t i = 0; i < nozzle_volumes_def->enum_labels.size(); ++i) {