From 9a8f832498cc09cd578166415340fa8b28b58740 Mon Sep 17 00:00:00 2001 From: tao wang Date: Mon, 16 Jan 2023 18:53:35 +0800 Subject: [PATCH] ENH:Update IP address input process Change-Id: Iaf1c187dac117ba10ac16045049a346f7c2b9478 Signed-off-by: Stone Li --- resources/check_access_code.txt | 1 + resources/images/input_accesscode_help1.png | Bin 0 -> 9563 bytes resources/images/input_accesscode_help2.png | Bin 0 -> 8770 bytes src/slic3r/GUI/DeviceManager.cpp | 29 +- src/slic3r/GUI/DeviceManager.hpp | 7 +- src/slic3r/GUI/GUI_App.cpp | 31 +- src/slic3r/GUI/GUI_App.hpp | 4 +- src/slic3r/GUI/Jobs/PrintJob.hpp | 1 + src/slic3r/GUI/Jobs/SendJob.cpp | 52 ++- src/slic3r/GUI/Jobs/SendJob.hpp | 8 +- src/slic3r/GUI/MainFrame.cpp | 1 + src/slic3r/GUI/MainFrame.hpp | 1 + src/slic3r/GUI/MediaFilePanel.cpp | 2 +- src/slic3r/GUI/MediaPlayCtrl.cpp | 4 +- src/slic3r/GUI/MsgDialog.cpp | 251 -------------- src/slic3r/GUI/MsgDialog.hpp | 27 -- src/slic3r/GUI/Plater.cpp | 2 + src/slic3r/GUI/ReleaseNote.cpp | 349 ++++++++++++++++++++ src/slic3r/GUI/ReleaseNote.hpp | 46 +++ src/slic3r/GUI/SelectMachine.cpp | 2 +- src/slic3r/GUI/SendToPrinter.cpp | 27 +- 21 files changed, 527 insertions(+), 318 deletions(-) create mode 100644 resources/check_access_code.txt create mode 100644 resources/images/input_accesscode_help1.png create mode 100644 resources/images/input_accesscode_help2.png diff --git a/resources/check_access_code.txt b/resources/check_access_code.txt new file mode 100644 index 000000000..8919ffbe0 --- /dev/null +++ b/resources/check_access_code.txt @@ -0,0 +1 @@ +just a test file \ No newline at end of file diff --git a/resources/images/input_accesscode_help1.png b/resources/images/input_accesscode_help1.png new file mode 100644 index 0000000000000000000000000000000000000000..b23f40a951e6929437759dd726f4429c17ed03b6 GIT binary patch literal 9563 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 NK}J=&Leezk{{S?Rb0z=) literal 0 HcmV?d00001 diff --git a/resources/images/input_accesscode_help2.png b/resources/images/input_accesscode_help2.png new file mode 100644 index 0000000000000000000000000000000000000000..0bff847ce3ea19cfab7b6d5966a789e0cc182465 GIT binary patch literal 8770 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 = code; AppConfig *config = GUI::wxGetApp().app_config; - if (config) { + if (config && !code.empty()) { GUI::wxGetApp().app_config->set_str("access_code", dev_id, code); } } +std::string MachineObject::get_access_code() +{ + if (get_user_access_code().empty()) + return access_code; + return get_user_access_code(); +} + +void MachineObject::set_user_access_code(std::string code) +{ + this->user_access_code = code; + AppConfig* config = GUI::wxGetApp().app_config; + if (config) { + GUI::wxGetApp().app_config->set_str("user_access_code", dev_id, code); + } +} + +std::string MachineObject::get_user_access_code() +{ + AppConfig* config = GUI::wxGetApp().app_config; + if (config) { + return GUI::wxGetApp().app_config->get("user_access_code", dev_id); + } + return ""; +} + bool MachineObject::is_lan_mode_printer() { bool result = false; @@ -3618,7 +3643,7 @@ void DeviceManager::on_machine_alive(std::string json_str) //load access code AppConfig* config = Slic3r::GUI::wxGetApp().app_config; if (config) { - obj->access_code = Slic3r::GUI::wxGetApp().app_config->get("access_code", dev_id); + obj->set_access_code(Slic3r::GUI::wxGetApp().app_config->get("access_code", dev_id)); } localMachineList.insert(std::make_pair(dev_id, obj)); diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 37930dee7..cadfef418 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -321,6 +321,9 @@ private: bool check_valid_ip(); void _parse_print_option_ack(int option); + std::string access_code; + std::string user_access_code; + public: enum LIGHT_EFFECT { @@ -398,12 +401,14 @@ public: std::string dev_ip; std::string dev_id; bool local_use_ssl { false }; - std::string access_code; std::string dev_connection_type; /* lan | cloud */ std::string connection_type() { return dev_connection_type; } void set_dev_ip(std::string ip) {dev_ip = ip;}; bool has_access_right() { return !access_code.empty(); } void set_access_code(std::string code); + std::string get_access_code(); + void set_user_access_code(std::string code); + std::string get_user_access_code(); bool is_lan_mode_printer(); //PRINTER_TYPE printer_type = PRINTER_3DPrinter_UKNOWN; std::string printer_type; /* model_id */ diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 3e4056db1..342dbd82f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2327,6 +2327,8 @@ bool GUI_App::on_init_inner() Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); + Bind(EVT_SHOW_IP_DIALOG, &GUI_App::show_ip_address_enter_dialog_handler, this); + copy_network_if_available(); on_init_network(); @@ -4559,17 +4561,27 @@ void GUI_App::update_mode() plater()->canvas3D()->update_gizmos_on_off_state(); } -bool GUI_App::show_ip_address_enter_dialog() +void GUI_App::show_ip_address_enter_dialog(wxString title) +{ + auto evt = new wxCommandEvent(EVT_SHOW_IP_DIALOG); + evt->SetString(title); + wxQueueEvent(this, evt); +} + +bool GUI_App::show_modal_ip_address_enter_dialog(wxString title) { DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return false; if (!dev->get_selected_machine()) return false; auto obj = dev->get_selected_machine(); - InputIpAddressDialog dlg(nullptr, from_u8(dev->get_selected_machine()->dev_name), dev->get_selected_machine()->dev_ip, dev->get_selected_machine()->access_code); + InputIpAddressDialog dlg(nullptr); + dlg.set_machine_obj(obj); + if (!title.empty()) dlg.update_title(title); + dlg.Bind(EVT_ENTER_IP_ADDRESS, [this, obj](wxCommandEvent& e) { auto selection_data_arr = wxSplit(e.GetString().ToStdString(), '|'); - if (selection_data_arr.size() != 2) return false; + if (selection_data_arr.size() != 2) return; auto ip_address = selection_data_arr[0]; auto access_code = selection_data_arr[1]; @@ -4579,20 +4591,23 @@ bool GUI_App::show_ip_address_enter_dialog() wxGetApp().app_config->set_str("ip_address", obj->dev_id, ip_address.ToStdString()); wxGetApp().app_config->save(); - obj->set_access_code(access_code.ToStdString()); obj->dev_ip = ip_address.ToStdString(); - obj->access_code = access_code.ToStdString(); - } - return true; + obj->set_user_access_code(access_code.ToStdString()); + } }); if (dlg.ShowModal() == wxID_YES) { return true; } - return false; } +void GUI_App::show_ip_address_enter_dialog_handler(wxCommandEvent& evt) +{ + wxString title = evt.GetString(); + show_modal_ip_address_enter_dialog(title); +} + //void GUI_App::add_config_menu(wxMenuBar *menu) //void GUI_App::add_config_menu(wxMenu *menu) //{ diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 021ddd780..028d56f3e 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -437,7 +437,9 @@ public: ConfigOptionMode get_mode(); void save_mode(const /*ConfigOptionMode*/int mode) ; void update_mode(); - bool show_ip_address_enter_dialog(); + void show_ip_address_enter_dialog(wxString title = wxEmptyString); + void show_ip_address_enter_dialog_handler(wxCommandEvent &evt); + bool show_modal_ip_address_enter_dialog(wxString title); // BBS //void add_config_menu(wxMenuBar *menu); diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index 91ce76de9..56aed8fa7 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -16,6 +16,7 @@ public: int plate_idx; fs::path _3mf_path; fs::path _3mf_config_path; + fs::path _temp_path; PrintPrepareData() { plate_idx = 0; } diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp index 1d10974b6..2c65b40d1 100644 --- a/src/slic3r/GUI/Jobs/SendJob.cpp +++ b/src/slic3r/GUI/Jobs/SendJob.cpp @@ -104,11 +104,46 @@ inline std::string get_transform_string(int bytes) void SendJob::process() { - /* display info */ + BBL::PrintParams params; wxString msg; int curr_percent = 10; NetworkAgent* m_agent = wxGetApp().getAgent(); AppConfig* config = wxGetApp().app_config; + int result = -1; + unsigned int http_code; + std::string http_body; + + + // check access code and ip address + params.dev_id = m_dev_id; + params.project_name = "verify_job"; + params.filename = job_data._temp_path.string(); + params.connection_type = this->connection_type; + + // local print access + params.dev_ip = m_dev_ip; + params.username = "bblp"; + params.password = m_access_code; + params.use_ssl = m_local_use_ssl; + + result = m_agent->start_send_gcode_to_sdcard(params, nullptr, nullptr); + if (result != 0) { + BOOST_LOG_TRIVIAL(error) << "access code is invalid"; + m_enter_ip_address_fun_fail(); + if (m_is_check_mode) { + m_job_finished = true; + return; + } + } + else { + if (m_is_check_mode) { + m_enter_ip_address_fun_success(); + m_job_finished = true; + return; + } + } + + /* display info */ if (this->connection_type == "lan") { msg = _L("Sending gcode file over LAN"); @@ -117,10 +152,6 @@ void SendJob::process() msg = _L("Sending gcode file through cloud service"); } - int result = -1; - unsigned int http_code; - std::string http_body; - int total_plate_num = m_plater->get_partplate_list().get_plate_count(); PartPlate* plate = m_plater->get_partplate_list().get_plate(job_data.plate_idx); @@ -148,7 +179,6 @@ void SendJob::process() else if (job_data.plate_idx == PLATE_CURRENT_IDX) curr_plate_idx = m_plater->get_partplate_list().get_curr_plate_index() + 1; - BBL::PrintParams params; params.dev_id = m_dev_id; params.project_name = m_project_name + ".gcode.3mf"; params.preset_name = wxGetApp().preset_bundle->prints.get_selected_preset_name(); @@ -305,7 +335,6 @@ void SendJob::process() if (result == BAMBU_NETWORK_ERR_FTP_LOGIN_DENIED) { msg_text += ". "; msg_text += _L("Please log out and login to the printer again."); - m_enter_ip_address_fun(); } else { msg_text += wxString::Format("[%s]", error_text); @@ -314,7 +343,6 @@ void SendJob::process() if (result == BAMBU_NETWORK_ERR_WRONG_IP_ADDRESS) { msg_text = _L("Failed uploading print file. Please enter ip address again."); - m_enter_ip_address_fun(); } update_status(curr_percent, msg_text); @@ -333,11 +361,15 @@ void SendJob::on_success(std::function success) m_success_fun = success; } -void SendJob::on_enter_ip_address(std::function success) +void SendJob::on_check_ip_address_fail(std::function func) { - m_enter_ip_address_fun = success; + m_enter_ip_address_fun_fail = func; } +void SendJob::on_check_ip_address_success(std::function func) +{ + m_enter_ip_address_fun_success = func; +} void SendJob::finalize() { diff --git a/src/slic3r/GUI/Jobs/SendJob.hpp b/src/slic3r/GUI/Jobs/SendJob.hpp index ad94e237f..6945ddcba 100644 --- a/src/slic3r/GUI/Jobs/SendJob.hpp +++ b/src/slic3r/GUI/Jobs/SendJob.hpp @@ -20,8 +20,10 @@ class SendJob : public PlaterJob std::string m_dev_id; bool m_job_finished{ false }; int m_print_job_completed_id = 0; + bool m_is_check_mode{false}; std::function m_success_fun{nullptr}; - std::function m_enter_ip_address_fun{nullptr}; + std::function m_enter_ip_address_fun_fail{nullptr}; + std::function m_enter_ip_address_fun_success{nullptr}; protected: @@ -51,10 +53,12 @@ public: } wxString get_http_error_msg(unsigned int status, std::string body); + void set_check_mode() {m_is_check_mode = true;}; bool is_finished() { return m_job_finished; } void process() override; void on_success(std::function success); - void on_enter_ip_address(std::function success); + void on_check_ip_address_fail(std::function func); + void on_check_ip_address_success(std::function func); void finalize() override; void set_project_name(std::string name); }; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 18b4ad5c7..65aca3827 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -71,6 +71,7 @@ namespace GUI { wxDEFINE_EVENT(EVT_SELECT_TAB, wxCommandEvent); wxDEFINE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); wxDEFINE_EVENT(EVT_USER_LOGIN, wxCommandEvent); +wxDEFINE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); // BBS: backup diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 1412daee0..d53caa156 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -373,6 +373,7 @@ public: wxDECLARE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); wxDECLARE_EVENT(EVT_USER_LOGIN, wxCommandEvent); +wxDECLARE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); } // GUI diff --git a/src/slic3r/GUI/MediaFilePanel.cpp b/src/slic3r/GUI/MediaFilePanel.cpp index d7de0fe41..502e7a56e 100644 --- a/src/slic3r/GUI/MediaFilePanel.cpp +++ b/src/slic3r/GUI/MediaFilePanel.cpp @@ -181,7 +181,7 @@ void MediaFilePanel::SetMachineObject(MachineObject* obj) m_supported = true; m_lan_mode = obj->is_lan_mode_printer(); m_lan_ip = obj->is_function_supported(PrinterFunction::FUNC_LOCAL_TUNNEL) ? obj->dev_ip : ""; - m_lan_passwd = obj->access_code; + m_lan_passwd = obj->get_access_code(); m_tutk_support = obj->is_function_supported(PrinterFunction::FUNC_REMOTE_TUNNEL); } else { m_supported = false; diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 9bcae571f..33c2b33a4 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -85,7 +85,7 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj) m_camera_exists = obj->has_ipcam; m_lan_mode = obj->is_lan_mode_printer(); m_lan_ip = obj->is_function_supported(PrinterFunction::FUNC_LOCAL_TUNNEL) ? obj->dev_ip : ""; - m_lan_passwd = obj->is_function_supported(PrinterFunction::FUNC_LOCAL_TUNNEL) ? obj->access_code : ""; + m_lan_passwd = obj->is_function_supported(PrinterFunction::FUNC_LOCAL_TUNNEL) ? obj->get_access_code() : ""; m_tutk_support = obj->is_function_supported(PrinterFunction::FUNC_REMOTE_TUNNEL); } else { m_camera_exists = false; @@ -233,7 +233,7 @@ void MediaPlayCtrl::Stop(wxString const &msg) ++m_failed_retry; if (m_failed_code != 0 && !m_tutk_support) { m_next_retry = wxDateTime(); // stop retry - if (wxGetApp().show_ip_address_enter_dialog()) { + if (wxGetApp().show_modal_ip_address_enter_dialog(_L("Failed to start liveview"))) { m_failed_retry = 0; m_next_retry = wxDateTime::Now(); } diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 69f227add..dd60d6fa6 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -26,9 +26,6 @@ namespace Slic3r { namespace GUI { -wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); -wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); - MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, long style, wxBitmap bitmap) : DPIDialog(parent ? parent : dynamic_cast(wxGetApp().mainframe), wxID_ANY, title, wxDefaultPosition, wxSize(360, -1),wxDEFAULT_DIALOG_STYLE) , boldfont(wxGetApp().normal_font()) @@ -422,252 +419,4 @@ void DownloadDialog::SetExtendedMessage(const wxString &extendedMessage) Fit(); } -InputIpAddressDialog::InputIpAddressDialog(wxWindow* parent, wxString name, wxString ip, wxString access_code) - :DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Unable to connect printer"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) -{ - std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); - SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); - - SetBackgroundColour(*wxWHITE); - wxBoxSizer* m_sizer_main = new wxBoxSizer(wxVERTICAL); - auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); - m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); - m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); - - //comfirm_before_enter_text = wxString::Format(_L("Cannot detect the LAN IP address of %s. Are %s and Bambu Studio in the same LAN?"), name, name); - - //comfirm_after_enter_text = _L("Please input the LAN IP address of your printer manually. You can find the IP address on device's screen, Settings > Network > IP."); - - comfirm_after_enter_text = _L("Failed to connect to the printer through LAN. Please enter the correct printer IP address and access code."); - - - tip = new Label(this, comfirm_before_enter_text); - - tip->SetMinSize(wxSize(FromDIP(420), -1)); - tip->SetMaxSize(wxSize(FromDIP(420), -1)); - tip->Wrap(FromDIP(420)); - - m_tips_ip = new Label(this, _L("IP")); - m_input_ip = new TextInput(this, ip, wxEmptyString); - m_input_ip->Bind(wxEVT_TEXT, &InputIpAddressDialog::on_text, this); - m_input_ip->SetMinSize(wxSize(FromDIP(420), FromDIP(28))); - m_input_ip->SetMaxSize(wxSize(FromDIP(420), FromDIP(28))); - - m_tips_access_code = new Label(this, _L("Access Code")); - m_input_access_code = new TextInput(this, access_code, wxEmptyString); - m_input_access_code->Bind(wxEVT_TEXT, &InputIpAddressDialog::on_text, this); - m_input_access_code->SetMinSize(wxSize(FromDIP(420), FromDIP(28))); - m_input_access_code->SetMaxSize(wxSize(FromDIP(420), FromDIP(28))); - - m_tips_note1 = new Label(this, _L("Note : The location of IP and access code on the machine is as follows :")); - m_tips_note2 = new Label(this, _L("X1 General Settings - Network Settings in the side bar of X1 main screen")); - m_tips_note3 = new Label(this, _L("P1P General Settings - WLAN in the sidebar of the main screen")); - - m_tips_note1->SetFont(::Label::Body_12); - m_tips_note2->SetFont(::Label::Body_12); - m_tips_note3->SetFont(::Label::Body_12); - - m_tips_note1->SetForegroundColour(wxColour(0x898989)); - m_tips_note2->SetForegroundColour(wxColour(0x898989)); - m_tips_note3->SetForegroundColour(wxColour(0x898989)); - - m_tips_note1->SetMinSize(wxSize(FromDIP(400),-1)); - m_tips_note1->Wrap(FromDIP(400)); - - m_tips_note2->SetMinSize(wxSize(FromDIP(400), -1)); - m_tips_note2->Wrap(FromDIP(400)); - - m_tips_note3->SetMinSize(wxSize(FromDIP(400), -1)); - m_tips_note3->Wrap(FromDIP(400)); - - /* m_tips_ip->Hide(); - m_input_ip->Hide(); - m_tips_access_code->Hide(); - m_input_access_code->Hide(); - m_tips_note1->Hide(); - m_tips_note2->Hide(); - m_tips_note3->Hide();*/ - - auto sizer_button = new wxBoxSizer(wxHORIZONTAL); - - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - - StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), - std::pair(*wxWHITE, StateColor::Normal)); - - m_button_ok = new Button(this, _L("OK")); - m_button_ok->SetBackgroundColor(btn_bg_green); - m_button_ok->SetBorderColor(*wxWHITE); - m_button_ok->SetTextColor(wxColour(0xFFFFFE)); - m_button_ok->SetFont(Label::Body_12); - m_button_ok->SetSize(wxSize(FromDIP(58), FromDIP(24))); - m_button_ok->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); - m_button_ok->SetCornerRadius(FromDIP(12)); - - - m_button_ok->Bind(wxEVT_LEFT_DOWN, &InputIpAddressDialog::on_ok, this); - - auto m_button_cancel = new Button(this, _L("Cancel")); - m_button_cancel->SetBackgroundColor(btn_bg_white); - m_button_cancel->SetBorderColor(wxColour(38, 46, 48)); - m_button_cancel->SetFont(Label::Body_12); - m_button_cancel->SetSize(wxSize(FromDIP(58), FromDIP(24))); - m_button_cancel->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); - m_button_cancel->SetCornerRadius(FromDIP(12)); - - m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - EndModal(wxID_CANCEL); - }); - - sizer_button->AddStretchSpacer(); - sizer_button->Add(m_button_ok, 0, wxALL, FromDIP(5)); - sizer_button->Add(m_button_cancel, 0, wxALL, FromDIP(5)); - - - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(15)); - m_sizer_main->Add(tip, 1, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(5)); - m_sizer_main->Add(m_tips_ip, 0, wxLEFT, FromDIP(18)); - m_sizer_main->Add(m_input_ip, 1, wxALIGN_CENTER, FromDIP(18)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); - m_sizer_main->Add(m_tips_access_code, 0, wxLEFT, FromDIP(18)); - m_sizer_main->Add(m_input_access_code, 1, wxALIGN_CENTER, FromDIP(18)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); - m_sizer_main->Add(m_tips_note1, 0, wxALIGN_CENTER, FromDIP(5)); - m_sizer_main->Add(m_tips_note2, 0, wxALIGN_CENTER, FromDIP(2)); - m_sizer_main->Add(m_tips_note3, 0, wxALIGN_CENTER, FromDIP(2)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); - m_sizer_main->Add(sizer_button, 1, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(5)); - - - tip->SetLabel(comfirm_after_enter_text); - tip->SetMinSize(wxSize(FromDIP(420), -1)); - tip->SetMaxSize(wxSize(FromDIP(420), -1)); - tip->Wrap(FromDIP(420)); - - m_tips_ip->Show(); - m_input_ip->Show(); - m_tips_access_code->Show(); - m_input_access_code->Show(); - m_tips_note1->Show(); - m_tips_note2->Show(); - m_tips_note3->Show(); - m_button_ok->Enable(false); - m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); - m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); - Layout(); - Fit(); - - SetSizer(m_sizer_main); - Layout(); - m_sizer_main->Fit(this); - - Centre(wxBOTH); - wxGetApp().UpdateDlgDarkUI(this); -} - -bool InputIpAddressDialog::isIp(std::string ipstr) -{ - istringstream ipstream(ipstr); - int num[4]; - char point[3]; - string end; - ipstream >> num[0] >> point[0] >> num[1] >> point[1] >> num[2] >> point[2] >> num[3] >> end; - for (int i = 0; i < 3; ++i) { - if (num[i] < 0 || num[i]>255) return false; - if (point[i] != '.') return false; - } - if (num[3] < 0 || num[3]>255) return false; - if (!end.empty()) return false; - return true; -} - -void InputIpAddressDialog::on_ok(wxMouseEvent& evt) -{ - /*if (!m_input_ip->IsShown()) { - tip->SetLabel(comfirm_after_enter_text); - tip->SetMinSize(wxSize(FromDIP(420), -1)); - tip->SetMaxSize(wxSize(FromDIP(420), -1)); - tip->Wrap(FromDIP(420)); - - m_tips_ip->Show(); - m_input_ip->Show(); - m_tips_access_code->Show(); - m_input_access_code->Show(); - m_tips_note1->Show(); - m_tips_note2->Show(); - m_tips_note3->Show(); - - auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); - auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); - if (isIp(str_ip.ToStdString()) && str_access_code.Length() == 8) { - m_button_ok->Enable(true); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - m_button_ok->SetBorderColor(*wxWHITE); - m_button_ok->SetBackgroundColor(btn_bg_green); - } - else { - m_button_ok->Enable(false); - m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); - m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); - } - - - Layout(); - Fit(); - } - else { - wxString ip = m_input_ip->GetTextCtrl()->GetValue(); - wxString str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); - wxString input_str = wxString::Format("%s|%s", ip, str_access_code); - - auto event = wxCommandEvent(EVT_ENTER_IP_ADDRESS); - event.SetString(input_str); - event.SetEventObject(this); - wxPostEvent(this, event); - EndModal(wxID_YES); - }*/ - wxString ip = m_input_ip->GetTextCtrl()->GetValue(); - wxString str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); - wxString input_str = wxString::Format("%s|%s", ip, str_access_code); - - auto event = wxCommandEvent(EVT_ENTER_IP_ADDRESS); - event.SetString(input_str); - event.SetEventObject(this); - wxPostEvent(this, event); - EndModal(wxID_YES); -} - -void InputIpAddressDialog::on_text(wxCommandEvent& evt) -{ - auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); - auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); - - if (isIp(str_ip.ToStdString()) && str_access_code.Length() == 8) { - m_button_ok->Enable(true); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - m_button_ok->SetBorderColor(*wxWHITE); - m_button_ok->SetBackgroundColor(btn_bg_green); - } - else { - m_button_ok->Enable(false); - m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); - m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); - } -} - -InputIpAddressDialog::~InputIpAddressDialog() -{ - -} - -void InputIpAddressDialog::on_dpi_changed(const wxRect& suggested_rect) -{ - -} - }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 90674d654..32c4a339c 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -371,33 +371,6 @@ private: wxString msg; }; -class InputIpAddressDialog: public DPIDialog -{ -public: - wxString comfirm_before_enter_text; - wxString comfirm_after_enter_text; - std::string m_ip; - Label* tip{nullptr}; - InputIpAddressDialog(wxWindow* parent = nullptr, wxString name = wxEmptyString, wxString id = wxEmptyString, wxString access_code = wxEmptyString); - ~InputIpAddressDialog(); - - Button* m_button_ok{nullptr}; - Label* m_tips_ip{nullptr}; - Label* m_tips_access_code{nullptr}; - TextInput* m_input_ip{nullptr}; - TextInput* m_input_access_code{nullptr}; - Label* m_tips_note1{nullptr}; - Label* m_tips_note2{nullptr}; - Label* m_tips_note3{nullptr}; - bool isIp(std::string ipstr); - void on_ok(wxMouseEvent& evt); - void on_text(wxCommandEvent& evt); - void on_dpi_changed(const wxRect& suggested_rect) override; -}; - - -wxDECLARE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); -wxDECLARE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 61be2cc29..81043978b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6558,6 +6558,8 @@ void Plater::get_print_job_data(PrintPrepareData* data) data->plate_idx = p->m_print_job_data.plate_idx; data->_3mf_path = p->m_print_job_data._3mf_path; data->_3mf_config_path = p->m_print_job_data._3mf_config_path; + std::string temp_file = Slic3r::resources_dir() + "/check_access_code.txt"; + data->_temp_path = encode_path(temp_file.c_str()); } } diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 538af4d59..a6d5568f7 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -26,6 +26,10 @@ namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); +wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); +wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); +wxDEFINE_EVENT(EVT_CLOSE_IPADDRESS_DLG, wxCommandEvent); +wxDEFINE_EVENT(EVT_CHECK_IP_ADDRESS_FAILED, wxCommandEvent); ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/) : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Release Note"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) @@ -871,4 +875,349 @@ void ConfirmBeforeSendDialog::rescale() m_button_cancel->Rescale(); } +InputIpAddressDialog::InputIpAddressDialog(wxWindow* parent) + :DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Unable to connect printer"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +{ + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + SetBackgroundColour(*wxWHITE); + wxBoxSizer* m_sizer_main = new wxBoxSizer(wxVERTICAL); + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + + comfirm_before_enter_text = _L("First,please confirm Bambu Studio and your printer are in same LAN."); + comfirm_after_enter_text = _L("Then,if the IP and Access Code below are different from the actual values on your printer,please correct them."); + + + m_tip1 = new Label(this, comfirm_before_enter_text); + m_tip1->SetFont(::Label::Body_12); + m_tip1->SetMinSize(wxSize(FromDIP(390), -1)); + m_tip1->SetMaxSize(wxSize(FromDIP(390), -1)); + m_tip1->Wrap(FromDIP(390)); + + auto m_line_tips = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_tips->SetBackgroundColour(wxColour(0xEEEEEE)); + + m_tip2 = new Label(this, comfirm_after_enter_text); + m_tip2->SetFont(::Label::Body_12); + m_tip2->SetMinSize(wxSize(FromDIP(390), -1)); + m_tip2->SetMaxSize(wxSize(FromDIP(390), -1)); + m_tip2->Wrap(FromDIP(390)); + + auto m_input_tip_area = new wxBoxSizer(wxHORIZONTAL); + auto m_input_area = new wxBoxSizer(wxHORIZONTAL); + + m_tips_ip = new Label(this, _L("IP")); + m_tips_ip->SetMinSize(wxSize(FromDIP(180), FromDIP(28))); + m_tips_ip->SetMaxSize(wxSize(FromDIP(180), FromDIP(28))); + + m_input_ip = new TextInput(this, wxEmptyString, wxEmptyString); + m_input_ip->Bind(wxEVT_TEXT, &InputIpAddressDialog::on_text, this); + m_input_ip->SetMinSize(wxSize(FromDIP(180), FromDIP(28))); + m_input_ip->SetMaxSize(wxSize(FromDIP(180), FromDIP(28))); + + m_tips_access_code = new Label(this, _L("Access Code")); + m_tips_access_code->SetMinSize(wxSize(FromDIP(180), FromDIP(28))); + m_tips_access_code->SetMaxSize(wxSize(FromDIP(180), FromDIP(28))); + + m_input_access_code = new TextInput(this, wxEmptyString, wxEmptyString); + m_input_access_code->Bind(wxEVT_TEXT, &InputIpAddressDialog::on_text, this); + m_input_access_code->SetMinSize(wxSize(FromDIP(180), FromDIP(28))); + m_input_access_code->SetMaxSize(wxSize(FromDIP(180), FromDIP(28))); + + m_input_tip_area->Add(m_tips_ip, 0, wxALIGN_CENTER, 0); + m_input_tip_area->Add(0, 0, 0, wxLEFT, FromDIP(16)); + m_input_tip_area->Add(m_tips_access_code, 0, wxALIGN_CENTER, 0); + + m_input_area->Add(m_input_ip, 0, wxALIGN_CENTER, 0); + m_input_area->Add(0, 0, 0, wxLEFT, FromDIP(16)); + m_input_area->Add(m_input_access_code, 0, wxALIGN_CENTER, 0); + + m_error_msg = new Label(this, wxEmptyString); + m_error_msg->SetFont(::Label::Body_13); + m_error_msg->SetForegroundColour(wxColour(208,27,27)); + m_error_msg->Hide(); + + m_tip3 = new Label(this, _L("Where to find your printer's IP and Access Code?")); + m_tip3->SetFont(::Label::Body_12); + m_tip3->SetMinSize(wxSize(FromDIP(390), -1)); + m_tip3->SetMaxSize(wxSize(FromDIP(390), -1)); + m_tip3->Wrap(FromDIP(390)); + + m_img_help1 = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("input_accesscode_help1", this, 198), wxDefaultPosition, wxSize(FromDIP(352), FromDIP(198)), 0); + + m_img_help2 = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("input_accesscode_help2", this, 118), wxDefaultPosition, wxSize(FromDIP(352), FromDIP(118)), 0); + + m_img_help1->Hide(); + m_img_help2->Hide(); + + + auto sizer_button = new wxBoxSizer(wxHORIZONTAL); + + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + + StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + m_button_ok = new Button(this, _L("OK")); + m_button_ok->SetBackgroundColor(btn_bg_green); + m_button_ok->SetBorderColor(*wxWHITE); + m_button_ok->SetTextColor(wxColour(0xFFFFFE)); + m_button_ok->SetFont(Label::Body_12); + m_button_ok->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_ok->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_ok->SetCornerRadius(FromDIP(12)); + + + m_button_ok->Bind(wxEVT_LEFT_DOWN, &InputIpAddressDialog::on_ok, this); + + auto m_button_cancel = new Button(this, _L("Cancel")); + m_button_cancel->SetBackgroundColor(btn_bg_white); + m_button_cancel->SetBorderColor(wxColour(38, 46, 48)); + m_button_cancel->SetFont(Label::Body_12); + m_button_cancel->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_cancel->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_cancel->SetCornerRadius(FromDIP(12)); + + m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + on_cancel(); + }); + + sizer_button->AddStretchSpacer(); + sizer_button->Add(m_button_ok, 0, wxALL, FromDIP(5)); + sizer_button->Add(m_button_cancel, 0, wxALL, FromDIP(5)); + + m_status_bar = std::make_shared(this); + m_status_bar->get_panel()->Hide(); + + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(18)); + m_sizer_main->Add(m_tip1, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_sizer_main->Add(m_line_tips, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_sizer_main->Add(m_tip2, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(18)); + m_sizer_main->Add(m_input_tip_area, 1, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(m_input_area, 1, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(m_error_msg, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_sizer_main->Add(m_tip3, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(4)); + m_sizer_main->Add(m_img_help1, 0, wxALIGN_CENTER, FromDIP(18)); + m_sizer_main->Add(m_img_help2, 0, wxALIGN_CENTER, FromDIP(18)); + + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(12)); + m_sizer_main->Add(sizer_button, 1, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(12)); + m_sizer_main->Add(m_status_bar->get_panel(), 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(18)); + + auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); + auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); + if (isIp(str_ip.ToStdString()) && str_access_code.Length() == 8) { + m_button_ok->Enable(true); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + m_button_ok->SetTextColor(StateColor::darkModeColorFor("#FFFFFE")); + m_button_ok->SetBackgroundColor(btn_bg_green); + } + else { + m_button_ok->Enable(false); + m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); + m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); + } + + + SetSizer(m_sizer_main); + Layout(); + Fit(); + + CentreOnParent(wxBOTH); + Move(wxPoint(GetScreenPosition().x, GetScreenPosition().y - FromDIP(50))); + wxGetApp().UpdateDlgDarkUI(this); + + Bind(EVT_CHECK_IP_ADDRESS_FAILED, &InputIpAddressDialog::on_check_ip_address_failed, this); + + Bind(EVT_CLOSE_IPADDRESS_DLG, [this](auto& e) { + m_status_bar->reset(); + this->EndModal(wxID_OK); + }); + Bind(wxEVT_CLOSE_WINDOW, [this](auto& e) {on_cancel();}); +} + +void InputIpAddressDialog::on_cancel() +{ + if (m_send_job) { + if (m_send_job->is_running()) { + m_send_job->cancel(); + m_send_job->join(); + } + } + this->EndModal(wxID_CANCEL); +} + + +void InputIpAddressDialog::update_title(wxString title) +{ + SetTitle(title); +} + +void InputIpAddressDialog::set_machine_obj(MachineObject* obj) +{ + m_obj = obj; + m_input_ip->GetTextCtrl()->SetLabelText(m_obj->dev_ip); + m_input_access_code->GetTextCtrl()->SetLabelText(m_obj->get_access_code()); + + if (m_obj->printer_type == "C11") { + m_img_help1->Hide(); + m_img_help2->Show(); + } + else if (m_obj->printer_type == "BL-P001" || m_obj->printer_type == "BL-P002") { + m_img_help1->Show(); + m_img_help2->Hide(); + } + Layout(); + Fit(); +} + +void InputIpAddressDialog::update_error_msg(wxString msg) +{ + if (msg.empty()) { + m_error_msg->Hide(); + } + else { + m_error_msg->Show(); + m_error_msg->SetLabelText(msg); + m_error_msg->SetMinSize(wxSize(FromDIP(390), -1)); + m_error_msg->SetMaxSize(wxSize(FromDIP(390), -1)); + m_error_msg->Wrap(FromDIP(390)); + } + + Layout(); + Fit(); +} + +bool InputIpAddressDialog::isIp(std::string ipstr) +{ + istringstream ipstream(ipstr); + int num[4]; + char point[3]; + string end; + ipstream >> num[0] >> point[0] >> num[1] >> point[1] >> num[2] >> point[2] >> num[3] >> end; + for (int i = 0; i < 3; ++i) { + if (num[i] < 0 || num[i]>255) return false; + if (point[i] != '.') return false; + } + if (num[3] < 0 || num[3]>255) return false; + if (!end.empty()) return false; + return true; +} + +void InputIpAddressDialog::on_ok(wxMouseEvent& evt) +{ + m_button_ok->Enable(false); + m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); + m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); + + if (m_send_job) { + m_send_job->join(); + } + + m_status_bar->reset(); + m_status_bar->set_prog_block(); + m_status_bar->set_cancel_callback_fina([this]() { + BOOST_LOG_TRIVIAL(info) << "print_job: enter canceled"; + if (m_send_job) { + if (m_send_job->is_running()) { + BOOST_LOG_TRIVIAL(info) << "send_job: canceled"; + m_send_job->cancel(); + } + m_send_job->join(); + } + }); + + + m_send_job = std::make_shared(m_status_bar, wxGetApp().plater(), m_obj->dev_id); + + wxString ip = m_input_ip->GetTextCtrl()->GetValue(); + wxString str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); + + m_send_job->m_dev_ip = ip.ToStdString(); + m_send_job->m_access_code = str_access_code.ToStdString(); + m_send_job->m_local_use_ssl = m_obj->local_use_ssl; + m_send_job->connection_type = m_obj->connection_type(); + m_send_job->cloud_print_only = true; + m_send_job->has_sdcard = m_obj->has_sdcard(); + m_send_job->set_check_mode(); + m_send_job->set_project_name("verify_job"); + + m_send_job->on_check_ip_address_fail([this]() { + this->check_ip_address_failed(); + }); + + m_send_job->on_check_ip_address_success([this, ip, str_access_code]() { + wxString input_str = wxString::Format("%s|%s", ip, str_access_code); + auto event = wxCommandEvent(EVT_ENTER_IP_ADDRESS); + event.SetString(input_str); + event.SetEventObject(this); + wxPostEvent(this, event); + + auto event_close = wxCommandEvent(EVT_CLOSE_IPADDRESS_DLG); + event_close.SetEventObject(this); + wxPostEvent(this, event_close); + }); + + m_send_job->start(); +} + +void InputIpAddressDialog::check_ip_address_failed() +{ + auto evt = new wxCommandEvent(EVT_CHECK_IP_ADDRESS_FAILED); + wxQueueEvent(this, evt); +} + +void InputIpAddressDialog::on_check_ip_address_failed(wxCommandEvent& evt) +{ + update_error_msg("Error: IP or Access Code are not correct"); + m_button_ok->Enable(true); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + m_button_ok->SetTextColor(StateColor::darkModeColorFor("#FFFFFE")); + m_button_ok->SetBackgroundColor(btn_bg_green); +} + +void InputIpAddressDialog::on_text(wxCommandEvent& evt) +{ + auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); + auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); + + if (isIp(str_ip.ToStdString()) && str_access_code.Length() == 8) { + m_button_ok->Enable(true); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + m_button_ok->SetTextColor(StateColor::darkModeColorFor("#FFFFFE")); + m_button_ok->SetBackgroundColor(btn_bg_green); + } + else { + m_button_ok->Enable(false); + m_button_ok->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); + m_button_ok->SetBorderColor(wxColour(0x90, 0x90, 0x90)); + } +} + +InputIpAddressDialog::~InputIpAddressDialog() +{ + +} + +void InputIpAddressDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + +} + + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index 8b8056a08..b9b0ee220 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -169,6 +169,52 @@ public: std::string show_again_config_text = ""; }; +class InputIpAddressDialog : public DPIDialog +{ +public: + wxString comfirm_before_enter_text; + wxString comfirm_after_enter_text; + + std::string m_ip; + Label* m_tip1{ nullptr }; + Label* m_tip2{ nullptr }; + Label* m_tip3{ nullptr }; + InputIpAddressDialog(wxWindow* parent = nullptr); + ~InputIpAddressDialog(); + + MachineObject* m_obj{nullptr}; + Button* m_button_ok{ nullptr }; + Label* m_tips_ip{ nullptr }; + Label* m_tips_access_code{ nullptr }; + Label* m_error_msg{ nullptr }; + TextInput* m_input_ip{ nullptr }; + TextInput* m_input_access_code{ nullptr }; + wxStaticBitmap* m_img_help1{ nullptr }; + wxStaticBitmap* m_img_help2{ nullptr }; + bool m_show_access_code{ false }; + + std::shared_ptr m_send_job{nullptr}; + std::shared_ptr m_status_bar; + + void on_cancel(); + void update_title(wxString title); + void set_machine_obj(MachineObject* obj); + void update_error_msg(wxString msg); + bool isIp(std::string ipstr); + void check_ip_address_failed(); + void on_check_ip_address_failed(wxCommandEvent& evt); + void on_ok(wxMouseEvent& evt); + void on_text(wxCommandEvent& evt); + void on_dpi_changed(const wxRect& suggested_rect) override; +}; + + +wxDECLARE_EVENT(EVT_CLOSE_IPADDRESS_DLG, wxCommandEvent); +wxDECLARE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); +wxDECLARE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); +wxDECLARE_EVENT(EVT_CHECK_IP_ADDRESS_FAILED, wxCommandEvent); + + }} // namespace Slic3r::GUI #endif diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index fda8a3e51..0e64aa8eb 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -2141,7 +2141,7 @@ void SelectMachineDialog::on_ok() m_print_job = std::make_shared(m_status_bar, m_plater, m_printer_last_select); m_print_job->m_dev_ip = obj_->dev_ip; - m_print_job->m_access_code = obj_->access_code; + m_print_job->m_access_code = obj_->get_access_code(); m_print_job->m_local_use_ssl = obj_->local_use_ssl; m_print_job->connection_type = obj_->connection_type(); m_print_job->set_project_name(m_current_project_name.utf8_string()); diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index e4eec885d..de243a89a 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -649,16 +649,23 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) m_send_job = std::make_shared(m_status_bar, m_plater, m_printer_last_select); m_send_job->m_dev_ip = obj_->dev_ip; - m_send_job->m_access_code = obj_->access_code; + + m_send_job->m_access_code = obj_->get_access_code(); m_send_job->m_local_use_ssl = obj_->local_use_ssl; m_send_job->connection_type = obj_->connection_type(); m_send_job->cloud_print_only = true; m_send_job->has_sdcard = obj_->has_sdcard(); m_send_job->set_project_name(m_current_project_name.utf8_string()); - m_send_job->on_enter_ip_address([this, obj_]() { + /*m_send_job->on_check_ip_address_success([this, obj_]() { wxCommandEvent* evt = new wxCommandEvent(EVT_CLEAR_IPADDRESS); wxQueueEvent(this, evt); + });*/ + + m_send_job->on_check_ip_address_fail([this]() { + wxCommandEvent* evt = new wxCommandEvent(EVT_CLEAR_IPADDRESS); + wxQueueEvent(this, evt); + wxGetApp().show_ip_address_enter_dialog(); }); enable_prepare_mode = false; @@ -668,13 +675,15 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) void SendToPrinterDialog::clear_ip_address_config(wxCommandEvent& e) { - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + enable_prepare_mode = true; + prepare_mode(); + /*DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; if (!dev->get_selected_machine()) return; auto obj = dev->get_selected_machine(); Slic3r::GUI::wxGetApp().app_config->set_str("ip_address", obj->dev_id, ""); Slic3r::GUI::wxGetApp().app_config->save(); - wxGetApp().show_ip_address_enter_dialog(); + wxGetApp().show_ip_address_enter_dialog();*/ } void SendToPrinterDialog::update_user_machine_list() @@ -859,18 +868,12 @@ void SendToPrinterDialog::on_selection_changed(wxCommandEvent &event) } //check ip address - if (obj->dev_ip.empty()) { + if (obj->dev_ip.empty() || obj->get_access_code().empty()) { BOOST_LOG_TRIVIAL(info) << "MachineObject IP is empty "; std::string app_config_dev_ip = Slic3r::GUI::wxGetApp().app_config->get("ip_address", obj->dev_id); - std::string app_config_access_code = Slic3r::GUI::wxGetApp().app_config->get("access_code", obj->dev_id); - - if (app_config_dev_ip.empty()) { + if (app_config_dev_ip.empty() || obj->get_access_code().empty()) { wxGetApp().show_ip_address_enter_dialog(); } - else { - obj->dev_ip = app_config_dev_ip; - obj->access_code = app_config_access_code; - } } update_show_status();