From 8f6cfda2f36a733752604c2ed924a9c43d8f8ed2 Mon Sep 17 00:00:00 2001 From: tao wang Date: Tue, 12 Nov 2024 08:42:49 +0800 Subject: [PATCH] ENH:optimization of select machine page jira:[for new selectmachine page] Change-Id: I003889f6f675e08403160e410498b065cdfaf59e (cherry picked from commit 9afe123026ba5a4ffc13f7f3ce0e04100418db03) --- resources/images/print_options_bg.svg | 4 + src/slic3r/GUI/SelectMachine.cpp | 676 +++++++++++++++----------- src/slic3r/GUI/SelectMachine.hpp | 67 ++- 3 files changed, 463 insertions(+), 284 deletions(-) create mode 100644 resources/images/print_options_bg.svg diff --git a/resources/images/print_options_bg.svg b/resources/images/print_options_bg.svg new file mode 100644 index 0000000000..12363aabd0 --- /dev/null +++ b/resources/images/print_options_bg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 27d8d5f15d..ffc177857c 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -41,13 +41,14 @@ wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent); #define WRAP_GAP FromDIP(2) static wxString task_canceled_text = _L("Task canceled"); - static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { //_L("Auto"), _L("Bambu Cool Plate") + " / " + _L("PLA Plate"), _L("Bambu Engineering Plate"), _L("Bambu Smooth PEI Plate") + "/" + _L("High temperature Plate"), - _L("Bambu Textured PEI Plate")}; + _L("Bambu Textured PEI Plate") +}; + void SelectMachineDialog::stripWhiteSpace(std::string& str) { @@ -104,6 +105,13 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) SetDoubleBuffered(true); #endif //__WINDOWS__ + ops_auto.left.insert(make_pair("auto", "Auto")); + ops_auto.left.insert(make_pair("on", "On")); + ops_auto.left.insert(make_pair("off", "Off")); + + ops_no_auto.left.insert(make_pair("on", "On")); + ops_no_auto.left.insert(make_pair("off", "Off")); + SetMinSize(wxSize(FromDIP(688), -1)); SetMaxSize(wxSize(FromDIP(688), -1)); @@ -417,51 +425,81 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) //m_filament_right_panel->Hide(); m_filament_panel->Hide(); - - - - m_statictext_ams_msg = new Label(this, wxEmptyString); m_statictext_ams_msg->SetMinSize(wxSize(FromDIP(600), -1)); m_statictext_ams_msg->SetMaxSize(wxSize(FromDIP(600), -1)); m_statictext_ams_msg->SetFont(::Label::Body_13); m_statictext_ams_msg->Hide(); - - - /*options*/ + /*Advanced Options*/ wxBoxSizer* sizer_split_options = new wxBoxSizer(wxHORIZONTAL); - auto m_stext_options_title = new Label(this, _L("Print Options")); - m_stext_options_title->SetFont(::Label::Body_14); - m_stext_options_title->SetForegroundColour(0x909090); auto m_split_options_line = new wxPanel(this, wxID_ANY); m_split_options_line->SetBackgroundColour(0xeeeeee); m_split_options_line->SetSize(wxSize(-1, FromDIP(1))); m_split_options_line->SetMinSize(wxSize(-1, FromDIP(1))); m_split_options_line->SetMaxSize(wxSize(-1, FromDIP(1))); sizer_split_options->Add(0, 0, 0, wxEXPAND, 0); - sizer_split_options->Add(m_stext_options_title, 0, wxALIGN_CENTER, 0); - sizer_split_options->Add(m_split_options_line, 1, wxALIGN_CENTER_VERTICAL, 0); + sizer_split_options->Add(m_split_options_line, 1, wxALIGN_CENTER, 0); + + wxBoxSizer *sizer_advanced_options_title = new wxBoxSizer(wxHORIZONTAL); + auto advanced_options_title = new Label(this, _L("Advanced Options")); + advanced_options_title->SetFont(::Label::Body_13); + advanced_options_title->SetForegroundColour(wxColour(38, 46, 48)); + sizer_advanced_options_title->Add(0, 0, 1, wxEXPAND, 0); + sizer_advanced_options_title->Add(advanced_options_title, 0, wxRIGHT, 0); + + m_sizer_options = new wxBoxSizer(wxVERTICAL); - m_sizer_options = new wxBoxSizer(wxHORIZONTAL); - select_bed = create_item_checkbox(_L("Bed Leveling"), this, _L("Bed Leveling"), "bed_leveling"); - select_flow = create_item_checkbox(_L("Flow Dynamics Calibration"), this, _L("Flow Dynamics Calibration"), "flow_cali"); - select_timelapse = create_item_checkbox(_L("Timelapse"), this, _L("Timelapse"), "timelapse"); - select_use_ams = create_ams_checkbox(_L("Enable AMS"), this, _L("Enable AMS")); + auto option_timelapse = new PrintOption(this, _L("Timelapse"), wxEmptyString, ops_no_auto, "timelapse"); - m_sizer_options->Add(select_bed, 0, wxLEFT | wxRIGHT, WRAP_GAP); - m_sizer_options->Add(select_flow, 0, wxLEFT | wxRIGHT, WRAP_GAP); - m_sizer_options->Add(select_timelapse, 0, wxLEFT | wxRIGHT, WRAP_GAP); - m_sizer_options->Add(select_use_ams, 0, wxLEFT | wxRIGHT, WRAP_GAP); + auto option_auto_bed_level = new PrintOption( + this, + _L("Auto Bed Leveling"), + _L("Check heatbed flatness. Leveling makes extruded height uniform.\n*Automatic mode: Level first (about 10 seconds). Skip if surface is fine."), + ops_auto, + "bed_leveling" + ); - select_bed->Show(false); - select_flow->Show(false); - select_timelapse->Show(false); - select_use_ams->Show(false); + auto option_flow_dynamics_cali = new PrintOption( + this, + _L("Flow Dynamics Calibration"), + _L("Find the best coefficient for dynamic flow calibration to enhance print quality.\n*Automatic mode: Skip if the filament was calibrated recently."), + ops_auto, + "flow_cali" + ); - m_sizer_options->Layout(); + auto option_nozzle_offset_cali_cali = new PrintOption( + this, + _L("Nozzle Offset Calibration"), + _L("Calibrate nozzle offsets to enhance print quality.\n*Automatic mode: Check for calibration before printing; skip if unnecessary."), + ops_auto + ); + auto option_use_ams = new PrintOption( + this, + _L("Use AMS"), + _L("Calibrate nozzle offsets to enhance print quality.\n*Automatic mode: Check for calibration before printing; skip if unnecessary."), + ops_no_auto + ); + + m_sizer_options->Add(option_timelapse, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + m_sizer_options->Add(option_auto_bed_level, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + m_sizer_options->Add(option_flow_dynamics_cali, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + m_sizer_options->Add(option_nozzle_offset_cali_cali, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + m_sizer_options->Add(option_use_ams, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + + m_checkbox_list["timelapse"] = option_timelapse; + m_checkbox_list["bed_leveling"] = option_auto_bed_level; + m_checkbox_list["use_ams"] = option_use_ams; + m_checkbox_list["flow_cali"] = option_flow_dynamics_cali; + m_checkbox_list["nozzle_offset_cali"] = option_nozzle_offset_cali_cali; + + option_timelapse->Hide(); + option_auto_bed_level->Hide(); + option_flow_dynamics_cali->Hide(); + option_nozzle_offset_cali_cali->Hide(); + option_use_ams->Hide(); m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_DIALOG_SIMBOOK_SIZE, 0); @@ -611,7 +649,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); - m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(12)); @@ -622,9 +659,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_main->Add(m_sizer_filament_2extruder, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(6)); m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(16)); m_sizer_main->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); - m_sizer_main->Add(m_sizer_options, 0, wxLEFT|wxRIGHT, FromDIP(15)); + m_sizer_main->Add(sizer_advanced_options_title, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); + m_sizer_main->Add(m_sizer_options, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0); m_sizer_main->Add(m_sw_print_failed_info, 0, wxALIGN_CENTER, 0); @@ -750,165 +787,75 @@ void SelectMachineDialog::popup_filament_backup() } } -wxWindow *SelectMachineDialog::create_ams_checkbox(wxString title, wxWindow *parent, wxString tooltip) -{ - auto checkbox = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - checkbox->SetBackgroundColour(m_colour_def_color); - - wxBoxSizer *sizer_checkbox = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *sizer_check = new wxBoxSizer(wxVERTICAL); - - auto check = new ::CheckBox(checkbox); - - sizer_check->Add(check, 0, wxBOTTOM | wxEXPAND | wxTOP, FromDIP(5)); - - sizer_checkbox->Add(sizer_check, 0, wxEXPAND, FromDIP(5)); - sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(7)); - - auto text = new wxStaticText(checkbox, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0); - text->SetFont(::Label::Body_12); - text->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#323A3C"))); - text->Wrap(-1); - sizer_checkbox->Add(text, 0, wxALIGN_CENTER, 0); - - enable_ams = new ScalableBitmap(this, "enable_ams", 16); - img_use_ams_tip = new wxStaticBitmap(checkbox, wxID_ANY, enable_ams->bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - sizer_checkbox->Add(img_use_ams_tip, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5)); - - img_use_ams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - wxPoint img_pos = img_use_ams_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + img_use_ams_tip->GetRect().height); - m_mapping_tip_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tip_popup.Popup(); - - if (m_mapping_tip_popup.ClientToScreen(wxPoint(0, 0)).y < img_pos.y) { - m_mapping_tip_popup.Dismiss(); - popup_pos = wxPoint(img_pos.x, img_pos.y - m_mapping_tip_popup.GetRect().height); - m_mapping_tip_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tip_popup.Popup(); - } - }); - - img_use_ams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { - m_mapping_tip_popup.Dismiss(); - }); - - checkbox->SetSizer(sizer_checkbox); - checkbox->Layout(); - sizer_checkbox->Fit(checkbox); - - checkbox->SetToolTip(tooltip); - text->SetToolTip(tooltip); - - text->Bind(wxEVT_LEFT_DOWN, [this, check](wxMouseEvent& event) { - check->SetValue(check->GetValue() ? false : true); - }); - - checkbox->Bind(wxEVT_LEFT_DOWN, [this, check](wxMouseEvent& event) { - check->SetValue(check->GetValue() ? false : true); - }); - - m_checkbox_list["use_ams"] = check; - return checkbox; -} - -wxWindow *SelectMachineDialog::create_item_checkbox(wxString title, wxWindow *parent, wxString tooltip, std::string param) -{ - auto checkbox = new wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - checkbox->SetBackgroundColour(m_colour_def_color); - - wxBoxSizer *sizer_checkbox = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *sizer_check = new wxBoxSizer(wxVERTICAL); - - auto check = new ::CheckBox(checkbox); - - sizer_check->Add(check, 0, wxBOTTOM | wxEXPAND | wxTOP, FromDIP(5)); - - auto text = new wxStaticText(checkbox, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); - text->SetFont(::Label::Body_12); - text->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#323A3C"))); - text->Wrap(-1); - text->SetMinSize(wxSize(FromDIP(140), -1)); - text->SetMaxSize(wxSize(FromDIP(140), -1)); - - sizer_checkbox->Add(sizer_check, 0, wxEXPAND, FromDIP(5)); - sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(7)); - sizer_checkbox->Add(text, 0, wxALIGN_CENTER, 0); - - checkbox->SetSizer(sizer_checkbox); - checkbox->Layout(); - sizer_checkbox->Fit(checkbox); - - check->SetToolTip(tooltip); - text->SetToolTip(tooltip); - - - - check->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent &e) { - //if (!m_checkbox_state_list[param]) {return;} - AppConfig* config = wxGetApp().app_config; - if (config) { - if (check->GetValue()) - config->set_str("print", param, "0"); - else - config->set_str("print", param, "1"); - } - e.Skip(); - }); - - checkbox->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent&) { - //if (!m_checkbox_state_list[param]) {return;} - check->SetValue(check->GetValue() ? false : true); - AppConfig* config = wxGetApp().app_config; - if (config) { - if (check->GetValue()) - config->set_str("print", param, "1"); - else - config->set_str("print", param, "0"); - } - }); - - text->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent &) { - //if (!m_checkbox_state_list[param]) {return;} - check->SetValue(check->GetValue() ? false : true); - AppConfig* config = wxGetApp().app_config; - if (config) { - if (check->GetValue()) - config->set_str("print", param, "1"); - else - config->set_str("print", param, "0"); - } - }); - - //m_checkbox_state_list[param] = true; - m_checkbox_list[param] = check; - return checkbox; -} - void SelectMachineDialog::update_select_layout(MachineObject *obj) { + if (m_printer_update_options_layout) { + return; + } + + // reset checkbox + m_checkbox_list["timelapse"]->Hide(); + m_checkbox_list["bed_leveling"]->Hide(); + m_checkbox_list["use_ams"]->Hide(); + m_checkbox_list["flow_cali"]->Hide(); + m_checkbox_list["nozzle_offset_cali"]->Hide(); + + if (obj->is_enable_np) { + m_checkbox_list["bed_leveling"]->update_options(ops_auto); + m_checkbox_list["flow_cali"]->update_options(ops_auto); + } + else { + m_checkbox_list["bed_leveling"]->update_options(ops_no_auto); + m_checkbox_list["flow_cali"]->update_options(ops_auto); + } + if (obj && obj->is_support_auto_flow_calibration) { - select_flow->Show(); + m_checkbox_list["flow_cali"]->Show(); } else { - select_flow->Hide(); + m_checkbox_list["flow_cali"]->Hide(); } if (obj && obj->is_support_auto_leveling) { - select_bed->Show(); + m_checkbox_list["bed_leveling"]->Show(); } else { - select_bed->Hide(); + m_checkbox_list["bed_leveling"]->Hide(); } if (obj && obj->is_support_timelapse && is_show_timelapse()) { - select_timelapse->Show(); + m_checkbox_list["timelapse"]->Show(); update_timelapse_enable_status(); } else { - select_timelapse->Hide(); + m_checkbox_list["timelapse"]->Hide(); } + // load checkbox values from app config + AppConfig *config = wxGetApp().app_config; + if (config && config->get("print", "bed_leveling") == "0") { + m_checkbox_list["bed_leveling"]->setValue("off"); + } else { + m_checkbox_list["bed_leveling"]->setValue("on"); + } + if (config && config->get("print", "flow_cali") == "0") { + m_checkbox_list["flow_cali"]->setValue("off"); + } else { + m_checkbox_list["flow_cali"]->setValue("on"); + } + if (config && config->get("print", "timelapse") == "0") { + m_checkbox_list["timelapse"]->setValue("off"); + } else { + m_checkbox_list["timelapse"]->setValue("on"); + } + + update_ams_check(obj); + update_flow_cali_check(obj); + m_sizer_options->Layout(); Layout(); Fit(); + + if (obj->is_info_ready() && !m_printer_update_options_layout) { + m_printer_update_options_layout = true; + } } void SelectMachineDialog::prepare_mode(bool refresh_button) @@ -1505,8 +1452,9 @@ bool SelectMachineDialog::has_tips(MachineObject* obj) if (!obj) return false; // must set to a status if return true - if (select_timelapse->IsShown() && - m_checkbox_list["timelapse"]->GetValue()) { + if (m_checkbox_list["timelapse"]->IsShown() && + (m_checkbox_list["timelapse"]->getValue() == "on")) + { if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { show_status(PrintDialogStatus::PrintStatusTimelapseNoSdcard); return true; @@ -1957,7 +1905,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) } } else if (warning.msg == NOT_SUPPORT_TRADITIONAL_TIMELAPSE) { - if (obj_->get_printer_arch() == PrinterArch::ARCH_I3 && m_checkbox_list["timelapse"]->GetValue()) { + if (obj_->get_printer_arch() == PrinterArch::ARCH_I3 && (m_checkbox_list["timelapse"]->getValue() == "on")) { confirm_text.push_back(ConfirmBeforeSendInfo(Plater::get_slice_warning_string(warning))); has_slice_warnings = true; } @@ -2020,7 +1968,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) } } - if (has_prohibited_filament && obj_->has_ams() && m_checkbox_list["use_ams"]->GetValue()) { + if (has_prohibited_filament && obj_->has_ams() && (m_checkbox_list["use_ams"]->getValue() == "on")) { wxString tpu_tips = prohibited_error; show_errors(tpu_tips); return; @@ -2221,7 +2169,7 @@ void SelectMachineDialog::on_send_print() std::string ams_mapping_array; std::string ams_mapping_array2; std::string ams_mapping_info; - if (m_checkbox_list["use_ams"]->GetValue()) + if (m_checkbox_list["use_ams"]->getValue() == "on") get_ams_mapping_result(ams_mapping_array,ams_mapping_array2, ams_mapping_info); else { json mapping_info_json = json::array(); @@ -2331,21 +2279,24 @@ void SelectMachineDialog::on_send_print() m_print_job->has_sdcard = obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL; - bool timelapse_option = select_timelapse->IsShown() ? m_checkbox_list["timelapse"]->GetValue() : true; + bool timelapse_option = m_checkbox_list["timelapse"]->IsShown()?true:false; + if (timelapse_option) { + timelapse_option = m_checkbox_list["timelapse"]->getValue() == "on"; + } m_print_job->set_print_config( MachineBedTypeString[0], - m_checkbox_list["bed_leveling"]->GetValue(), - m_checkbox_list["flow_cali"]->GetValue(), + (m_checkbox_list["bed_leveling"]->getValue() == "on"), + (m_checkbox_list["flow_cali"]->getValue() == "on"), false, timelapse_option, true, - 0, // TODO: Orca hack - 0, - 0); + m_checkbox_list["bed_leveling"]->getValueInt(), + m_checkbox_list["flow_cali"]->getValueInt(), + m_checkbox_list["nozzle_offset_cali"]->getValueInt()); if (obj_->has_ams()) { - m_print_job->task_use_ams = m_checkbox_list["use_ams"]->GetValue(); + m_print_job->task_use_ams = (m_checkbox_list["use_ams"]->getValue() == "on"); } else { m_print_job->task_use_ams = false; } @@ -2561,8 +2512,6 @@ void SelectMachineDialog::update_user_printer() if (!mobj->is_avaliable()) continue; if (!mobj->is_online()) continue; if (!mobj->is_lan_mode_printer()) continue; - /*if (mobj->is_in_printing()) {op->set_printer_state(PrinterState::BUSY);}*/ - if (!mobj->has_access_right()) { option_list[mobj->dev_name] = mobj; machine_list.push_back(mobj->dev_name); @@ -2747,15 +2696,15 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event) MachineObject* obj_ = dev->get_selected_machine(); if(!obj_) return; - update_ams_check(obj_); update_select_layout(obj_); + if (!obj_ || obj_->amsList.empty() || obj_->ams_exist_bits == 0 || !obj_->is_support_filament_backup || !obj_->is_support_show_filament_backup || !obj_->ams_auto_switch_filament_flag - || !m_checkbox_list["use_ams"]->GetValue() ) { + || !(m_checkbox_list["use_ams"]->getValue() == "on")) { if (m_ams_backup_tip->IsShown()) { m_ams_backup_tip->Hide(); img_ams_backup->Hide(); @@ -2781,6 +2730,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) m_ams_mapping_res = false; m_ams_mapping_valid = false; m_ams_mapping_result.clear(); + m_printer_update_options_layout = false; auto selection = m_comboBox_printer->GetSelection(); DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); @@ -2820,7 +2770,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) // reset the timelapse check status for I3 structure if (obj->get_printer_arch() == PrinterArch::ARCH_I3) { - m_checkbox_list["timelapse"]->SetValue(false); + m_checkbox_list["timelapse"]->setValue("off"); AppConfig *config = wxGetApp().app_config; if (config) config->set_str("print", "timelapse", "0"); } @@ -2855,14 +2805,14 @@ void SelectMachineDialog::update_flow_cali_check(MachineObject* obj) void SelectMachineDialog::update_ams_check(MachineObject *obj) { if (obj && obj->has_ams() && !obj->is_enable_np) { - select_use_ams->Show(); + m_checkbox_list["use_ams"]->Show(); if (obj->get_printer_ams_type() == "generic") { img_use_ams_tip->Show(); } else { img_use_ams_tip->Hide(); } } - if (obj && obj->is_enable_np) { m_checkbox_list["use_ams"]->SetValue(true); } + if (obj && obj->is_enable_np) { m_checkbox_list["use_ams"]->setValue("on"); } } void SelectMachineDialog::update_show_status() @@ -2944,14 +2894,14 @@ void SelectMachineDialog::update_show_status() // do ams mapping if no ams result bool clean_ams_mapping = false; if (m_ams_mapping_result.empty()) { - if (m_checkbox_list["use_ams"]->GetValue()) { + if (m_checkbox_list["use_ams"]->getValue() == "on") { do_ams_mapping(obj_); } else { clean_ams_mapping = true; } } - if (!obj_->has_ams() || !m_checkbox_list["use_ams"]->GetValue()) { + if (!obj_->has_ams() || !(m_checkbox_list["use_ams"]->getValue() == "on")) { clean_ams_mapping = true; } @@ -3003,7 +2953,7 @@ void SelectMachineDialog::update_show_status() } // no ams - if (!obj_->has_ams() || !m_checkbox_list["use_ams"]->GetValue()) { + if (!obj_->has_ams() || ! (m_checkbox_list["use_ams"]->getValue() == "on")) { if (!has_tips(obj_)) { if (has_timelapse_warning()) { show_status(PrintDialogStatus::PrintStatusTimelapseWarning); @@ -3015,7 +2965,7 @@ void SelectMachineDialog::update_show_status() return; } - if (!m_checkbox_list["use_ams"]->GetValue()) { + if (!(m_checkbox_list["use_ams"]->getValue() == "on")) { m_ams_mapping_result.clear(); sync_ams_mapping_result(m_ams_mapping_result); @@ -3178,13 +3128,13 @@ void SelectMachineDialog::update_timelapse_enable_status() AppConfig *config = wxGetApp().app_config; if (!has_timelapse_warning()) { if (!config || config->get("print", "timelapse") == "0") - m_checkbox_list["timelapse"]->SetValue(false); + m_checkbox_list["timelapse"]->setValue("off"); else - m_checkbox_list["timelapse"]->SetValue(true); - select_timelapse->Enable(true); + m_checkbox_list["timelapse"]->setValue("on"); + m_checkbox_list["timelapse"]->Enable(true); } else { - m_checkbox_list["timelapse"]->SetValue(false); - select_timelapse->Enable(false); + m_checkbox_list["timelapse"]->setValue("off"); + m_checkbox_list["timelapse"]->Enable(false); if (config) { config->set_str("print", "timelapse", "0"); } } } @@ -3302,9 +3252,9 @@ void SelectMachineDialog::on_dpi_changed(const wxRect &suggested_rect) m_button_ensure->SetCornerRadius(FromDIP(12)); m_status_bar->msw_rescale(); - for (auto checkpire : m_checkbox_list) { - checkpire.second->Rescale(); - } + //for (auto checkpire : m_checkbox_list) { + // checkpire.second->Rescale(); + //} for (auto material1 : m_materialList) { material1.second->item->msw_rescale(); @@ -3314,51 +3264,23 @@ void SelectMachineDialog::on_dpi_changed(const wxRect &suggested_rect) Refresh(); } -wxImage *SelectMachineDialog::LoadImageFromBlob(const unsigned char *data, int size) -{ - if (data != NULL) { - wxMemoryInputStream mi(data, size); - wxImage * img = new wxImage(mi, wxBITMAP_TYPE_ANY); - if (img != NULL && img->IsOk()) return img; - // wxLogDebug( wxT("DB::LoadImageFromBlob error: data=%p size=%d"), data, size); - // caller is responsible for deleting the pointer - delete img; - } - return NULL; -} - void SelectMachineDialog::set_flow_calibration_state(bool state, bool show_tips) { if (!state) { - m_checkbox_list["flow_cali"]->SetValue(state); - auto tool_tip = _L("Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface."); - m_checkbox_list["flow_cali"]->SetToolTip(tool_tip); + m_checkbox_list["flow_cali"]->setValue(state ? "on" : "off"); m_checkbox_list["flow_cali"]->Enable(); - for (auto win : select_flow->GetWindowChildren()) { - win->SetToolTip(tool_tip); - } - //select_flow->SetToolTip(tool_tip); } else { AppConfig* config = wxGetApp().app_config; if (config && config->get("print", "flow_cali") == "0") { - m_checkbox_list["flow_cali"]->SetValue(false); + m_checkbox_list["flow_cali"]->setValue("off"); } else { - m_checkbox_list["flow_cali"]->SetValue(true); + m_checkbox_list["flow_cali"]->setValue("on"); } m_checkbox_list["flow_cali"]->Enable(); - for (auto win : select_flow->GetWindowChildren()) { - win->SetToolTip( _L("Automatic flow calibration using Micro Lidar")); - } - } - - if (!show_tips) { - for (auto win : select_flow->GetWindowChildren()) { - win->SetToolTip(wxEmptyString); - } } } @@ -3437,37 +3359,6 @@ void SelectMachineDialog::set_default() show_status(PrintDialogStatus::PrintStatusNoUserLogin); } } - select_bed->Show(); - select_flow->Show(); - - //reset checkbox - select_bed->Show(false); - select_flow->Show(false); - select_timelapse->Show(false); - select_use_ams->Show(false); - - // load checkbox values from app config - AppConfig* config = wxGetApp().app_config; - if (config && config->get("print", "bed_leveling") == "0") { - m_checkbox_list["bed_leveling"]->SetValue(false); - } - else { - m_checkbox_list["bed_leveling"]->SetValue(true); - } - if (config && config->get("print", "flow_cali") == "0") { - m_checkbox_list["flow_cali"]->SetValue(false); - } - else { - m_checkbox_list["flow_cali"]->SetValue(true); - } - if (config && config->get("print", "timelapse") == "0") { - m_checkbox_list["timelapse"]->SetValue(false); - } - else { - m_checkbox_list["timelapse"]->SetValue(true); - } - - m_checkbox_list["use_ams"]->SetValue(true); if (m_print_type == PrintFromType::FROM_NORMAL) { reset_and_sync_ams_list(); @@ -3614,7 +3505,7 @@ void SelectMachineDialog::reset_and_sync_ams_list() pos.y += item->GetRect().height; m_mapping_popup.Move(pos); - if (obj_ && obj_->has_ams() && m_checkbox_list["use_ams"]->GetValue() && obj_->dev_id == m_printer_last_select) { + if (obj_ && (m_checkbox_list["use_ams"]->getValue() == "on") && obj_->dev_id == m_printer_last_select) { m_mapping_popup.set_parent_item(item); m_mapping_popup.set_current_filament_id(extruder); m_mapping_popup.set_tag_texture(materials[extruder]); @@ -3944,13 +3835,12 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) m_basic_panel->Layout(); m_basic_panel->Fit(); - // disable pei bed - DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + //disable pei bed + DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev_manager) return; - MachineObject *obj_ = dev_manager->get_selected_machine(); - update_flow_cali_check(obj_); - wxSize screenSize = wxGetDisplaySize(); - auto dialogSize = this->GetSize(); + MachineObject* obj_ = dev_manager->get_selected_machine(); + wxSize screenSize = wxGetDisplaySize(); + auto dialogSize = this->GetSize(); #ifdef __WINDOWS__ @@ -4054,7 +3944,7 @@ void SelectMachineDialog::set_default_from_sdcard() if (obj_ && obj_->has_ams() && - m_checkbox_list["use_ams"]->GetValue() && + (m_checkbox_list["use_ams"]->getValue() == "on") && obj_->dev_id == m_printer_last_select) { m_mapping_popup.set_parent_item(item); @@ -4313,6 +4203,244 @@ std::string SelectMachineDialog::get_print_status_info(PrintDialogStatus status) ThumbnailPanel::~ThumbnailPanel() {} + PrintOption::PrintOption(wxWindow *parent, wxString title, wxString tips, boost::bimaps::bimap ops, std::string param) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) + { +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + Bind(wxEVT_PAINT, &PrintOption::OnPaint, this); + + if (tips.IsEmpty()) { + SetMinSize(wxSize(-1, FromDIP(50))); + SetMaxSize(wxSize(-1, FromDIP(50))); + } + else { + SetMinSize(wxSize(-1, FromDIP(90))); + SetMaxSize(wxSize(-1, FromDIP(90))); + } + + m_ops = ops; + m_param = param; + + SetBackgroundColour(*wxWHITE); + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *top_sizer = new wxBoxSizer(wxHORIZONTAL); - }} // namespace Slic3r::GUI + m_printoption_title = new Label(this, title); + m_printoption_title->SetFont(Label::Head_13); + m_printoption_title->SetBackgroundColour(0xF8F8F8); + + m_printoption_item = new PrintOptionItem(this, m_ops, param); + + top_sizer->Add(m_printoption_title, 0, wxALIGN_CENTER, 0); + top_sizer->Add(0, 0, 1, wxEXPAND, 0); + top_sizer->Add(m_printoption_item, 0, wxALIGN_CENTER, 0); + + m_label = new Label(this, tips); + m_label->SetFont(::Label::Body_13); + m_label->SetForegroundColour(0x6B6B6B); + m_label->SetBackgroundColour(0xF8F8F8); + + sizer->Add(top_sizer, 1, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, FromDIP(12)); + sizer->Add(0, 0, 1, wxTOP, FromDIP(4)); + sizer->Add(m_label, 1, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, FromDIP(12)); + SetSizer(sizer); + Layout(); + Fit(); + } + +void PrintOption::OnPaint(wxPaintEvent &event) + { + wxPaintDC dc(this); + doRender(dc); + } + +void PrintOption::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void PrintOption::doRender(wxDC &dc) +{ + auto size = GetSize(); + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(0xF8F8F8)); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 5); +} + +void PrintOption::setValue(std::string value) +{ + m_printoption_item->setValue(value); +} + +std::string PrintOption::getValue() +{ + return m_printoption_item->getValue(); +} + +int PrintOption::getValueInt() +{ + if (m_printoption_item->getValue() == "off") { + return 0; + } else if (m_printoption_item->getValue() == "on") { + return 1; + } else if (m_printoption_item->getValue() == "auto") { + return 2; + } else { + return 2; + } +} + +PrintOptionItem::PrintOptionItem(wxWindow *parent, boost::bimaps::bimap ops, std::string param) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + m_ops = ops; + m_param = param; + + Bind(wxEVT_PAINT, &PrintOptionItem::OnPaint, this); + auto width = ops.size() * FromDIP(56) + FromDIP(8); + auto height = FromDIP(22) + FromDIP(8); + SetMinSize(wxSize(width, height)); + SetMaxSize(wxSize(width, height)); + Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_HAND); }); + Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_ARROW); }); + Bind(wxEVT_LEFT_DOWN, &PrintOptionItem::on_left_down, this); + + m_selected_bk = ScalableBitmap(this, "print_options_bg", 22); +} + +void PrintOptionItem::OnPaint(wxPaintEvent &event) +{ + wxPaintDC dc(this); + doRender(dc); +} + +void PrintOptionItem::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void PrintOptionItem::on_left_down(wxMouseEvent &evt) +{ + auto pos = ClientToScreen(evt.GetPosition()); + auto rect = ClientToScreen(wxPoint(0, 0)); + auto select_size = GetSize().x / m_ops.size(); + + int i = 0; + for (const auto& entry : m_ops.left) { + auto left_edge = rect.x + i * select_size; + auto right_edge = rect.x + (i + 1) * select_size; + + if (pos.x > left_edge && pos.x < right_edge) { + selected_key = entry.get_left(); + } + i++; + } + Refresh(); + + if (!m_param.empty()) { + AppConfig *config = wxGetApp().app_config; + if (selected_key == "on") { + config->set_str("print", m_param, "1"); + } else if (selected_key == "off") { + config->set_str("print", m_param, "0"); + } + } +} + +void PrintOptionItem::doRender(wxDC &dc) +{ + auto size = GetSize(); + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(0xEBEBEB)); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 5); + + auto left = FromDIP(4); + + int selected = 0; + for (const auto &entry : m_ops.right) { + if (entry.second == selected_key) { + break; + } + selected++; + } + + /*selected*/ + auto selected_left = selected * FromDIP(50) + FromDIP(4); + dc.DrawBitmap(m_selected_bk.bmp(), selected_left, FromDIP(4)); + + for (auto it = m_ops.begin(); it != m_ops.end(); ++it) { + auto text_key = it->get_left(); + auto text_value = it->get_right(); + auto text_size = dc.GetTextExtent(text_value); + + auto text_left = left + (FromDIP(50) - text_size.x) / 2; + auto text_top = (size.y - text_size.y) / 2; + + if (text_key == selected_key) { + dc.SetPen(wxPen(0x00AE42)); + dc.SetTextForeground(0x00AE42); + dc.SetFont(::Label::Head_13); + dc.DrawText(text_value, wxPoint(text_left, text_top)); + } + else { + dc.SetPen(wxPen(*wxBLACK)); + dc.SetTextForeground(*wxBLACK); + dc.SetFont(::Label::Body_13); + dc.DrawText(text_value, wxPoint(text_left, text_top)); + } + + left += FromDIP(50); + } +} + +void PrintOptionItem::setValue(std::string value) +{ + selected_key = value; + Refresh(); +} + +std::string PrintOptionItem::getValue() +{ + return selected_key; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 509c24cdf2..1c46364a73 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -24,6 +24,7 @@ #include #include +#include "boost/bimap/bimap.hpp" #include "AmsMappingPopup.hpp" #include "ReleaseNote.hpp" #include "GUI_Utils.hpp" @@ -150,6 +151,57 @@ static int get_brightness_value(wxImage image) { return totalLuminance / num_none_transparent; } +class PrintOptionItem : public wxPanel +{ +public: + PrintOptionItem(wxWindow *parent, boost::bimaps::bimap ops, std::string param = ""); + ~PrintOptionItem(){}; + void OnPaint(wxPaintEvent &event); + void render(wxDC &dc); + void on_left_down(wxMouseEvent &evt); + void doRender(wxDC &dc); + + ScalableBitmap m_selected_bk; + boost::bimaps::bimap m_ops; + std::string selected_key; + std::string m_param; + + void setValue(std::string value); + void update_options(boost::bimaps::bimap ops){ + m_ops = ops; + selected_key = ""; + auto width = ops.size() * FromDIP(56) + FromDIP(8); + auto height = FromDIP(22) + FromDIP(8); + SetMinSize(wxSize(width, height)); + SetMaxSize(wxSize(width, height)); + Refresh(); + }; + std::string getValue(); +}; + +class PrintOption : public wxPanel +{ +public: + PrintOption(wxWindow *parent, wxString title, wxString tips, boost::bimaps::bimap ops, std::string param = ""); + ~PrintOption(){}; + void OnPaint(wxPaintEvent &event); + void render(wxDC &dc); + void doRender(wxDC &dc); + + std::string m_param; + boost::bimaps::bimap m_ops; + Label* m_label{nullptr}; + Label* m_printoption_title{nullptr}; + PrintOptionItem* m_printoption_item{nullptr}; + void setValue(std::string value); + void update_options(boost::bimaps::bimap ops){ + m_ops = ops; + m_printoption_item->update_options(ops); + }; + std::string getValue(); + int getValueInt(); +}; + class ThumbnailPanel : public wxPanel { public: @@ -185,6 +237,7 @@ private: bool m_export_3mf_cancel{ false }; bool m_is_canceled{ false }; bool m_is_rename_mode{ false }; + bool m_printer_update_options_layout {false}; PrintPageMode m_print_page_mode{PrintPageMode::PrintPageModePrepare}; std::string m_print_error_msg; std::string m_print_error_extra; @@ -198,8 +251,7 @@ private: Label* m_text_bed_type; std::shared_ptr m_token = std::make_shared(0); - std::map m_checkbox_list; - //std::map m_checkbox_state_list; + std::map m_checkbox_list; std::vector m_bedtype_list; std::vector m_list; std::vector m_filaments; @@ -214,6 +266,9 @@ private: std::string m_required_data_file_name; std::string m_required_data_file_path; + boost::bimaps::bimap ops_auto; + boost::bimaps::bimap ops_no_auto; + protected: PrintFromType m_print_type{FROM_NORMAL}; AmsMapingPopup m_mapping_popup{ nullptr }; @@ -238,10 +293,6 @@ protected: wxStaticBitmap* m_bitmap_next_plate{ nullptr }; wxStaticBitmap* img_amsmapping_tip{nullptr}; ThumbnailPanel* m_thumbnailPanel{ nullptr }; - wxWindow* select_bed{ nullptr }; - wxWindow* select_flow{ nullptr }; - wxWindow* select_timelapse{ nullptr }; - wxWindow* select_use_ams{ nullptr }; wxPanel* m_panel_status{ nullptr }; wxPanel* m_basic_panel; wxPanel* m_rename_normal_panel{nullptr}; @@ -385,13 +436,9 @@ public: PrintFromType get_print_type() {return m_print_type;}; wxString format_steel_name(NozzleType type); wxString format_text(wxString &m_msg); - wxWindow* create_ams_checkbox(wxString title, wxWindow* parent, wxString tooltip); - wxWindow* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, std::string param); - wxImage * LoadImageFromBlob(const unsigned char *data, int size); PrintDialogStatus get_status() { return m_print_status; } std::vector sort_string(std::vector strArray); }; - }} // namespace Slic3r::GUI #endif