From 9afe123026ba5a4ffc13f7f3ce0e04100418db03 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 --- resources/images/print_options_bg.svg | 4 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/CalibrationPanel.cpp | 2 + src/slic3r/GUI/CalibrationPanel.hpp | 8 - src/slic3r/GUI/Jobs/PrintJob.cpp | 3 + src/slic3r/GUI/Jobs/PrintJob.hpp | 13 +- src/slic3r/GUI/Monitor.hpp | 2 +- src/slic3r/GUI/SelectMachine.cpp | 1764 ++++++------------------- src/slic3r/GUI/SelectMachine.hpp | 423 ++---- src/slic3r/GUI/SelectMachinePop.cpp | 1058 +++++++++++++++ src/slic3r/GUI/SelectMachinePop.hpp | 233 ++++ src/slic3r/Utils/CalibUtils.cpp | 2 +- src/slic3r/Utils/bambu_networking.hpp | 3 + 13 files changed, 1845 insertions(+), 1672 deletions(-) create mode 100644 resources/images/print_options_bg.svg create mode 100644 src/slic3r/GUI/SelectMachinePop.cpp create mode 100644 src/slic3r/GUI/SelectMachinePop.hpp diff --git a/resources/images/print_options_bg.svg b/resources/images/print_options_bg.svg new file mode 100644 index 000000000..12363aabd --- /dev/null +++ b/resources/images/print_options_bg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 68b54b17b..298c721b0 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -427,6 +427,8 @@ set(SLIC3R_GUI_SOURCES GUI/ModelMall.cpp GUI/SelectMachine.hpp GUI/SelectMachine.cpp + GUI/SelectMachinePop.hpp + GUI/SelectMachinePop.cpp GUI/SendToPrinter.hpp GUI/SendToPrinter.cpp GUI/AmsMappingPopup.hpp diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp index 858394aee..9f8ab6246 100644 --- a/src/slic3r/GUI/CalibrationPanel.cpp +++ b/src/slic3r/GUI/CalibrationPanel.cpp @@ -4,6 +4,8 @@ #include "MainFrame.hpp" #include "CalibrationPanel.hpp" #include "I18N.hpp" +#include "SelectMachine.hpp" +#include "SelectMachinePop.hpp" namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/CalibrationPanel.hpp b/src/slic3r/GUI/CalibrationPanel.hpp index a1c23e0e6..eafb380c7 100644 --- a/src/slic3r/GUI/CalibrationPanel.hpp +++ b/src/slic3r/GUI/CalibrationPanel.hpp @@ -7,16 +7,8 @@ namespace Slic3r { namespace GUI { -#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48) -#define SELECT_MACHINE_GREY600 wxColour(144,144,144) -#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206) -#define SELECT_MACHINE_BRAND wxColour(0, 174, 66) -#define SELECT_MACHINE_REMIND wxColour(255,111,0) -#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231) - #define CALI_MODE_COUNT 2 - wxString get_calibration_type_name(CalibMode cali_mode); class MObjectPanel : public wxPanel diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 4446b82d7..7b954d37d 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -250,6 +250,9 @@ void PrintJob::process() params.task_use_ams = this->task_use_ams; params.task_bed_type = this->task_bed_type; params.print_type = this->m_print_type; + params.auto_bed_leveling = this->auto_bed_leveling; + params.auto_flow_cali = this->auto_flow_cali; + params.auto_offset_cali = this->auto_offset_cali; if (m_print_type == "from_sdcard_view") { params.dst_file = m_dst_path; diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index b6da50c74..c35d2b3d0 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -82,7 +82,14 @@ public: bool has_sdcard { false }; bool task_use_ams { true }; - void set_print_config(std::string bed_type, bool bed_leveling, bool flow_cali, bool vabration_cali, bool record_timelapse, bool layer_inspect) + int auto_bed_leveling{0}; + int auto_flow_cali{0}; + int auto_offset_cali{0}; + + void set_print_config(std::string bed_type, bool bed_leveling, bool flow_cali, bool vabration_cali, bool record_timelapse, bool layer_inspect, + int auto_bed_levelingt, + int auto_flow_calit, + int auto_offset_calit) { task_bed_type = bed_type; task_bed_leveling = bed_leveling; @@ -90,6 +97,10 @@ public: task_vibration_cali = vabration_cali; task_record_timelapse = record_timelapse; task_layer_inspect = layer_inspect; + + auto_bed_leveling = auto_bed_levelingt; + auto_flow_cali = auto_flow_calit; + auto_offset_cali = auto_offset_calit; } int status_range() const override diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index 935ee3397..0f611ef85 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -48,7 +48,7 @@ #include "slic3r/GUI/HMSPanel.hpp" #include "slic3r/GUI/AmsWidgets.hpp" #include "Widgets/SideTools.hpp" -#include "SelectMachine.hpp" +#include "SelectMachinePop.hpp" namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index ad10aa6dd..db7065788 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -27,15 +27,8 @@ namespace Slic3r { namespace GUI { -wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); -wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_PRINT_JOB_CANCEL, wxCommandEvent); -wxDEFINE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); -wxDEFINE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); -wxDEFINE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); -wxDEFINE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); -wxDEFINE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent); #define INITIAL_NUMBER_OF_MACHINES 0 @@ -46,855 +39,6 @@ wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent); static wxString task_canceled_text = _L("Task canceled"); -std::string get_print_status_info(PrintDialogStatus status) -{ - switch(status) { - case PrintStatusInit: - return "PrintStatusInit"; - case PrintStatusNoUserLogin: - return "PrintStatusNoUserLogin"; - case PrintStatusInvalidPrinter: - return "PrintStatusInvalidPrinter"; - case PrintStatusConnectingServer: - return "PrintStatusConnectingServer"; - case PrintStatusReading: - return "PrintStatusReading"; - case PrintStatusReadingFinished: - return "PrintStatusReadingFinished"; - case PrintStatusReadingTimeout: - return "PrintStatusReadingTimeout"; - case PrintStatusInUpgrading: - return "PrintStatusInUpgrading"; - case PrintStatusNeedUpgradingAms: - return "PrintStatusNeedUpgradingAms"; - case PrintStatusInSystemPrinting: - return "PrintStatusInSystemPrinting"; - case PrintStatusInPrinting: - return "PrintStatusInPrinting"; - case PrintStatusDisableAms: - return "PrintStatusDisableAms"; - case PrintStatusAmsMappingSuccess: - return "PrintStatusAmsMappingSuccess"; - case PrintStatusAmsMappingInvalid: - return "PrintStatusAmsMappingInvalid"; - case PrintStatusAmsMappingU0Invalid: - return "PrintStatusAmsMappingU0Invalid"; - case PrintStatusAmsMappingValid: - return "PrintStatusAmsMappingValid"; - case PrintStatusAmsMappingByOrder: - return "PrintStatusAmsMappingByOrder"; - case PrintStatusRefreshingMachineList: - return "PrintStatusRefreshingMachineList"; - case PrintStatusSending: - return "PrintStatusSending"; - case PrintStatusSendingCanceled: - return "PrintStatusSendingCanceled"; - case PrintStatusLanModeNoSdcard: - return "PrintStatusLanModeNoSdcard"; - case PrintStatusNoSdcard: - return "PrintStatusNoSdcard"; - case PrintStatusUnsupportedPrinter: - return "PrintStatusUnsupportedPrinter"; - case PrintStatusTimelapseNoSdcard: - return "PrintStatusTimelapseNoSdcard"; - case PrintStatusNotSupportedPrintAll: - return "PrintStatusNotSupportedPrintAll"; - } - return "unknown"; -} - -MachineObjectPanel::MachineObjectPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) -{ - wxPanel::Create(parent, id, pos, SELECT_MACHINE_ITEM_SIZE, style, name); - Bind(wxEVT_PAINT, &MachineObjectPanel::OnPaint, this); - - SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); - - m_unbind_img = ScalableBitmap(this, "unbind", 18); - m_edit_name_img = ScalableBitmap(this, "edit_button", 18); - m_select_unbind_img = ScalableBitmap(this, "unbind_selected", 18); - - m_printer_status_offline = ScalableBitmap(this, "printer_status_offline", 12); - m_printer_status_busy = ScalableBitmap(this, "printer_status_busy", 12); - m_printer_status_idle = ScalableBitmap(this, "printer_status_idle", 12); - m_printer_status_lock = ScalableBitmap(this, "printer_status_lock", 16); - m_printer_in_lan = ScalableBitmap(this, "printer_in_lan", 16); - - this->Bind(wxEVT_ENTER_WINDOW, &MachineObjectPanel::on_mouse_enter, this); - this->Bind(wxEVT_LEAVE_WINDOW, &MachineObjectPanel::on_mouse_leave, this); - this->Bind(wxEVT_LEFT_UP, &MachineObjectPanel::on_mouse_left_up, this); - -#ifdef __APPLE__ - wxPlatformInfo platformInfo; - auto major = platformInfo.GetOSMajorVersion(); - auto minor = platformInfo.GetOSMinorVersion(); - auto micro = platformInfo.GetOSMicroVersion(); - - //macos 13.1.0 - if (major >= 13 && minor >= 1 && micro >= 0) { - m_is_macos_special_version = true; - } -#endif - -} - - -MachineObjectPanel::~MachineObjectPanel() {} - -void MachineObjectPanel::show_bind_dialog() -{ - if (wxGetApp().is_user_login()) { - BindMachineDialog dlg; - dlg.update_machine_info(m_info); - dlg.ShowModal(); - } -} - -void MachineObjectPanel::set_printer_state(PrinterState state) -{ - m_state = state; - Refresh(); -} - -void MachineObjectPanel::show_edit_printer_name(bool show) -{ - m_show_edit = show; - Refresh(); -} - -void MachineObjectPanel::show_printer_bind(bool show, PrinterBindState state) -{ - m_show_bind = show; - m_bind_state = state; - Refresh(); -} - -void MachineObjectPanel::OnPaint(wxPaintEvent &event) -{ - wxPaintDC dc(this); - doRender(dc); -} - -void MachineObjectPanel::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 MachineObjectPanel::doRender(wxDC &dc) -{ - auto left = 10; - wxSize size = GetSize(); - dc.SetPen(*wxTRANSPARENT_PEN); - - auto dwbitmap = m_printer_status_offline; - if (m_state == PrinterState::IDLE) { dwbitmap = m_printer_status_idle; } - if (m_state == PrinterState::BUSY) { dwbitmap = m_printer_status_busy; } - if (m_state == PrinterState::OFFLINE) { dwbitmap = m_printer_status_offline; } - if (m_state == PrinterState::LOCK) { dwbitmap = m_printer_status_lock; } - if (m_state == PrinterState::IN_LAN) { dwbitmap = m_printer_in_lan; } - - // dc.DrawCircle(left, size.y / 2, 3); - dc.DrawBitmap(dwbitmap.bmp(), wxPoint(left, (size.y - dwbitmap.GetBmpSize().y) / 2)); - - left += dwbitmap.GetBmpSize().x + 8; - dc.SetFont(Label::Body_13); - dc.SetBackgroundMode(wxTRANSPARENT); - dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); - wxString dev_name = ""; - if (m_info) { - dev_name = from_u8(m_info->dev_name); - - if (m_state == PrinterState::IN_LAN) { - dev_name += _L("(LAN)"); - } - } - auto sizet = dc.GetTextExtent(dev_name); - auto text_end = 0; - - if (m_show_edit) { - text_end = size.x - m_unbind_img.GetBmpSize().x - 30; - } - else { - text_end = size.x - m_unbind_img.GetBmpSize().x; - } - - wxString finally_name = dev_name; - if (sizet.x > (text_end - left)) { - auto limit_width = text_end - left - dc.GetTextExtent("...").x - 15; - for (auto i = 0; i < dev_name.length(); i++) { - auto curr_width = dc.GetTextExtent(dev_name.substr(0, i)); - if (curr_width.x >= limit_width) { - finally_name = dev_name.substr(0, i) + "..."; - break; - } - } - } - - dc.DrawText(finally_name, wxPoint(left, (size.y - sizet.y) / 2)); - - - if (m_hover || m_is_macos_special_version) { - - if (m_hover && !m_is_macos_special_version) { - dc.SetPen(SELECT_MACHINE_BRAND); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRectangle(0, 0, size.x, size.y); - } - - if (m_show_bind) { - if (m_bind_state == ALLOW_UNBIND) { - left = size.x - m_unbind_img.GetBmpSize().x - 6; - dc.DrawBitmap(m_unbind_img.bmp(), left, (size.y - m_unbind_img.GetBmpSize().y) / 2); - } - } - - if (m_show_edit) { - left = size.x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6; - dc.DrawBitmap(m_edit_name_img.bmp(), left, (size.y - m_edit_name_img.GetBmpSize().y) / 2); - } - } - -} - -void MachineObjectPanel::update_machine_info(MachineObject *info, bool is_my_devices) -{ - m_info = info; - m_is_my_devices = is_my_devices; - Refresh(); -} - -void MachineObjectPanel::on_mouse_enter(wxMouseEvent &evt) -{ - m_hover = true; - Refresh(); -} - -void MachineObjectPanel::on_mouse_leave(wxMouseEvent &evt) -{ - m_hover = false; - Refresh(); -} - -void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt) -{ - if (m_is_my_devices) { - // show edit - if (m_show_edit) { - auto edit_left = GetSize().x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6; - auto edit_right = edit_left + m_edit_name_img.GetBmpSize().x; - auto edit_top = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2; - auto edit_bottom = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2 + m_edit_name_img.GetBmpSize().y; - if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) { - wxCommandEvent event(EVT_EDIT_PRINT_NAME); - event.SetEventObject(this); - wxPostEvent(this, event); - return; - } - } - if (m_show_bind) { - auto left = GetSize().x - m_unbind_img.GetBmpSize().x - 6; - auto right = left + m_unbind_img.GetBmpSize().x; - auto top = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2; - auto bottom = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2 + m_unbind_img.GetBmpSize().y; - - if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) { - wxCommandEvent event(EVT_UNBIND_MACHINE, GetId()); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } else { - if (m_info) { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); - } - //wxGetApp().mainframe->SetFocus(); - wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST); - event.SetEventObject(this->GetParent()); - wxPostEvent(this->GetParent(), event); - } - return; - } - if (m_info && m_info->is_lan_mode_printer()) { - if (m_info->has_access_right() && m_info->is_avaliable()) { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); - } else { - wxCommandEvent event(EVT_CONNECT_LAN_PRINT); - event.SetEventObject(this); - wxPostEvent(this, event); - } - } else { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); - } - } else { - if (m_info && m_info->is_lan_mode_printer()) { - wxCommandEvent event(EVT_CONNECT_LAN_PRINT); - event.SetEventObject(this); - wxPostEvent(this, event); - } else { - wxCommandEvent event(EVT_BIND_MACHINE); - event.SetEventObject(this); - wxPostEvent(this, event); - } - } - -} - -SelectMachinePopup::SelectMachinePopup(wxWindow *parent) - : PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS), m_dismiss(false) -{ -#ifdef __WINDOWS__ - SetDoubleBuffered(true); -#endif //__WINDOWS__ - - - SetSize(SELECT_MACHINE_POPUP_SIZE); - SetMinSize(SELECT_MACHINE_POPUP_SIZE); - SetMaxSize(SELECT_MACHINE_POPUP_SIZE); - - Freeze(); - wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL); - SetBackgroundColour(SELECT_MACHINE_GREY400); - - - - m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL); - m_scrolledWindow->SetBackgroundColour(*wxWHITE); - m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE); - m_scrolledWindow->SetScrollRate(0, 5); - auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL); - m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow); - m_scrolledWindow->Layout(); - m_sizxer_scrolledWindow->Fit(m_scrolledWindow); - -#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) - m_sizer_search_bar = new wxBoxSizer(wxVERTICAL); - m_search_bar = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_search_bar->SetDescriptiveText(_L("Search")); - m_search_bar->ShowSearchButton( true ); - m_search_bar->ShowCancelButton( false ); - m_sizer_search_bar->Add( m_search_bar, 1, wxALL| wxEXPAND, 1 ); - m_sizer_main->Add(m_sizer_search_bar, 0, wxALL | wxEXPAND, FromDIP(2)); - m_search_bar->Bind( wxEVT_COMMAND_TEXT_UPDATED, &SelectMachinePopup::update_machine_list, this ); -#endif - auto own_title = create_title_panel(_L("My Device")); - m_sizer_my_devices = new wxBoxSizer(wxVERTICAL); - auto other_title = create_title_panel(_L("Other Device")); - m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); - - - m_panel_ping_code = new PinCodePanel(m_scrolledWindow, 0, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); - m_panel_direct_connection = new PinCodePanel(m_scrolledWindow, 1, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); - - m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); - m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0); - m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0); - m_sizxer_scrolledWindow->Add(m_panel_direct_connection, 0, wxEXPAND, 0); - m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); - m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0); - - m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2)); - - SetSizer(m_sizer_main); - Layout(); - Thaw(); - - #ifdef __APPLE__ - m_scrolledWindow->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this); - #endif // __APPLE__ - - m_refresh_timer = new wxTimer(); - m_refresh_timer->SetOwner(this); - Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachinePopup::update_machine_list, this); - Bind(wxEVT_TIMER, &SelectMachinePopup::on_timer, this); - Bind(EVT_DISSMISS_MACHINE_LIST, &SelectMachinePopup::on_dissmiss_win, this); -} - -SelectMachinePopup::~SelectMachinePopup() { delete m_refresh_timer;} - -void SelectMachinePopup::Popup(wxWindow *WXUNUSED(focus)) -{ - BOOST_LOG_TRIVIAL(trace) << "get_print_info: start"; - start_ssdp(true); - if (m_refresh_timer) { - m_refresh_timer->Stop(); - m_refresh_timer->Start(MACHINE_LIST_REFRESH_INTERVAL); - } - - if (wxGetApp().is_user_login()) { - if (!get_print_info_thread) { - get_print_info_thread = new boost::thread(Slic3r::create_thread([this, token = std::weak_ptr(m_token)] { - NetworkAgent* agent = wxGetApp().getAgent(); - unsigned int http_code; - std::string body; - int result = agent->get_user_print_info(&http_code, &body); - CallAfter([token, this, result, body]() { - if (token.expired()) {return;} - if (result == 0) { - m_print_info = body; - } - else { - m_print_info = ""; - } - wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST); - event.SetEventObject(this); - wxPostEvent(this, event); - }); - })); - } - } - - wxPostEvent(this, wxTimerEvent()); - PopupWindow::Popup(); -} - -void SelectMachinePopup::OnDismiss() -{ - BOOST_LOG_TRIVIAL(trace) << "get_print_info: dismiss"; - start_ssdp(false); - m_dismiss = true; - - if (m_refresh_timer) { - m_refresh_timer->Stop(); - } - if (get_print_info_thread) { - if (get_print_info_thread->joinable()) { - get_print_info_thread->join(); - delete get_print_info_thread; - get_print_info_thread = nullptr; - } - } - - wxCommandEvent event(EVT_FINISHED_UPDATE_MACHINE_LIST); - event.SetEventObject(this); - wxPostEvent(this, event); -} - -bool SelectMachinePopup::ProcessLeftDown(wxMouseEvent &event) { - return PopupWindow::ProcessLeftDown(event); -} - -bool SelectMachinePopup::Show(bool show) { - if (show) { - for (int i = 0; i < m_user_list_machine_panel.size(); i++) { - m_user_list_machine_panel[i]->mPanel->update_machine_info(nullptr); - m_user_list_machine_panel[i]->mPanel->Hide(); - } - - for (int j = 0; j < m_other_list_machine_panel.size(); j++) { - m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr); - m_other_list_machine_panel[j]->mPanel->Hide(); - } - } - return PopupWindow::Show(show); -} - -wxWindow *SelectMachinePopup::create_title_panel(wxString text) -{ - auto m_panel_title_own = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL); - m_panel_title_own->SetBackgroundColour(*wxWHITE); - - wxBoxSizer *m_sizer_title_own = new wxBoxSizer(wxHORIZONTAL); - - auto m_title_own = new wxStaticText(m_panel_title_own, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, 0); - m_title_own->Wrap(-1); - m_sizer_title_own->Add(m_title_own, 0, wxALIGN_CENTER, 0); - - wxBoxSizer *m_sizer_line_own = new wxBoxSizer(wxHORIZONTAL); - - auto m_panel_line_own = new wxPanel(m_panel_title_own, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_ITEM_SIZE.x, FromDIP(1)), wxTAB_TRAVERSAL); - m_panel_line_own->SetBackgroundColour(SELECT_MACHINE_GREY400); - - m_sizer_line_own->Add(m_panel_line_own, 0, wxALIGN_CENTER, 0); - m_sizer_title_own->Add(0, 0, 0, wxLEFT, FromDIP(10)); - m_sizer_title_own->Add(m_sizer_line_own, 1, wxEXPAND | wxRIGHT, FromDIP(10)); - - m_panel_title_own->SetSizer(m_sizer_title_own); - m_panel_title_own->Layout(); - return m_panel_title_own; -} - -void SelectMachinePopup::on_timer(wxTimerEvent &event) -{ - BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup on_timer"; - wxGetApp().reset_to_active(); - wxCommandEvent user_event(EVT_UPDATE_USER_MACHINE_LIST); - user_event.SetEventObject(this); - wxPostEvent(this, user_event); -} - -void SelectMachinePopup::update_other_devices() -{ - DeviceManager* dev = wxGetApp().getDeviceManager(); - if (!dev) return; - m_free_machine_list = dev->get_local_machine_list(); - - BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices start"; - this->Freeze(); - m_scrolledWindow->Freeze(); - int i = 0; - - for (auto &elem : m_free_machine_list) { - MachineObject * mobj = elem.second; - /* do not show printer bind state is empty */ - if (!mobj->is_avaliable()) continue; - - if (!wxGetApp().is_user_login() && !mobj->is_lan_mode_printer()) - continue; - - /* do not show printer in my list */ - auto it = m_bind_machine_list.find(mobj->dev_id); - if (it != m_bind_machine_list.end()) - continue; - - MachineObjectPanel* op = nullptr; - if (i < m_other_list_machine_panel.size()) { - op = m_other_list_machine_panel[i]->mPanel; - } else { - op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); - MachinePanel* mpanel = new MachinePanel(); - mpanel->mIndex = wxString::Format("%d", i); - mpanel->mPanel = op; - m_other_list_machine_panel.push_back(mpanel); - m_sizer_other_devices->Add(op, 0, wxEXPAND, 0); - } -#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) - if (!search_for_printer(mobj)) { - op->Hide(); - } - else { - op->Show(); - } -#else - op->Show(); -#endif - i++; - - op->update_machine_info(mobj); - - if (mobj->is_lan_mode_printer()) { - if (mobj->has_access_right()) { - op->set_printer_state(PrinterState::IN_LAN); - } else { - op->set_printer_state(PrinterState::LOCK); - } - } else { - op->show_edit_printer_name(false); - op->show_printer_bind(true, PrinterBindState::ALLOW_BIND); - if (mobj->is_in_printing()) { - op->set_printer_state(PrinterState::BUSY); - } else { - op->SetToolTip(_L("Online")); - op->set_printer_state(IDLE); - } - } - - op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { - if (mobj) { - if (mobj->is_lan_mode_printer()) { - ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); - dlg.set_machine_object(mobj); - if (dlg.ShowModal() == wxID_OK) { - wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); - } - } - } - }); - - op->Bind(EVT_BIND_MACHINE, [this, mobj](wxCommandEvent &e) { - BindMachineDialog dlg; - dlg.update_machine_info(mobj); - int dlg_result = wxID_CANCEL; - dlg_result = dlg.ShowModal(); - if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); } - }); - } - - for (int j = i; j < m_other_list_machine_panel.size(); j++) { - m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr); - m_other_list_machine_panel[j]->mPanel->Hide(); - } - - if (m_placeholder_panel != nullptr) { - m_scrolledWindow->RemoveChild(m_placeholder_panel); - m_placeholder_panel->Destroy(); - m_placeholder_panel = nullptr; - } - - m_placeholder_panel = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxSize(-1,FromDIP(26))); - wxBoxSizer* placeholder_sizer = new wxBoxSizer(wxVERTICAL); - - m_hyperlink = new wxHyperlinkCtrl(m_placeholder_panel, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - placeholder_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); - - - m_placeholder_panel->SetSizer(placeholder_sizer); - m_placeholder_panel->Layout(); - placeholder_sizer->Fit(m_placeholder_panel); - - m_placeholder_panel->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); - m_sizer_other_devices->Add(m_placeholder_panel, 0, wxEXPAND, 0); - - //m_sizer_other_devices->Layout(); - if(m_other_devices_count != i) { - m_scrolledWindow->Fit(); - } - m_scrolledWindow->Layout(); - m_scrolledWindow->Thaw(); - Layout(); - Fit(); - this->Thaw(); - m_other_devices_count = i; - BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices end"; -} - -void SelectMachinePopup::update_user_devices() -{ - Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - - if (!m_print_info.empty()) { - dev->parse_user_print_info(m_print_info); - m_print_info = ""; - } - - m_bind_machine_list.clear(); - m_bind_machine_list = dev->get_my_machine_list(); - - //sort list - std::vector> user_machine_list; - for (auto& it: m_bind_machine_list) { - user_machine_list.push_back(it); - } - - std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto&b) { - if (a.second && b.second) { - return a.second->dev_name.compare(b.second->dev_name) < 0; - } - return false; - }); - - BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list start"; - this->Freeze(); - m_scrolledWindow->Freeze(); - int i = 0; - - for (auto& elem : user_machine_list) { - MachineObject* mobj = elem.second; - MachineObjectPanel* op = nullptr; - if (i < m_user_list_machine_panel.size()) { - op = m_user_list_machine_panel[i]->mPanel; -#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) - if (!search_for_printer(mobj)) { - op->Hide(); - } else { - op->Show(); - } -#else - op->Show(); -#endif - } else { - op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); - MachinePanel* mpanel = new MachinePanel(); - mpanel->mIndex = wxString::Format("%d", i); - mpanel->mPanel = op; - m_user_list_machine_panel.push_back(mpanel); - m_sizer_my_devices->Add(op, 0, wxEXPAND, 0); - } - i++; - op->update_machine_info(mobj, true); - //set in lan - if (mobj->is_lan_mode_printer()) { - if (!mobj->is_online()) { - continue; - } - else { - op->show_printer_bind(false, PrinterBindState::NONE); - op->show_edit_printer_name(false); - if (mobj->has_access_right() && mobj->is_avaliable()) { - op->set_printer_state(PrinterState::IN_LAN); - op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); - op->SetToolTip(_L("Online")); - } - else { - op->set_printer_state(PrinterState::LOCK); - } - } - op->Bind(EVT_UNBIND_MACHINE, [this, dev, mobj](wxCommandEvent& e) { - dev->set_selected_machine(""); - if (mobj) { - mobj->set_access_code(""); - mobj->erase_user_access_code(); - } - - MessageDialog msg_wingow(nullptr, _L("Log out successful."), "", wxAPPLY | wxOK); - if (msg_wingow.ShowModal() == wxOK) { return; } - }); - } - else { - op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); - op->Bind(EVT_UNBIND_MACHINE, [this, mobj, dev](wxCommandEvent& e) { - // show_unbind_dialog - UnBindMachineDialog dlg; - dlg.update_machine_info(mobj); - if (dlg.ShowModal() == wxID_OK) { - dev->set_selected_machine(""); - } - }); - - if (!mobj->is_online()) { - op->SetToolTip(_L("Offline")); - op->set_printer_state(PrinterState::OFFLINE); - } - else { - op->show_edit_printer_name(true); - op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); - if (mobj->is_in_printing()) { - op->SetToolTip(_L("Busy")); - op->set_printer_state(PrinterState::BUSY); - } - else { - op->SetToolTip(_L("Online")); - op->set_printer_state(PrinterState::IDLE); - } - } - } - - op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { - if (mobj) { - if (mobj->is_lan_mode_printer()) { - ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); - dlg.set_machine_object(mobj); - if (dlg.ShowModal() == wxID_OK) { - wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); - } - } - } - }); - - op->Bind(EVT_EDIT_PRINT_NAME, [this, mobj](wxCommandEvent &e) { - EditDevNameDialog dlg; - dlg.set_machine_obj(mobj); - dlg.ShowModal(); - }); - } - - for (int j = i; j < m_user_list_machine_panel.size(); j++) { - m_user_list_machine_panel[j]->mPanel->update_machine_info(nullptr); - m_user_list_machine_panel[j]->mPanel->Hide(); - } - //m_sizer_my_devices->Layout(); - - if (m_my_devices_count != i) { - m_scrolledWindow->Fit(); - } - m_scrolledWindow->Layout(); - m_scrolledWindow->Thaw(); - Layout(); - Fit(); - this->Thaw(); - m_my_devices_count = i; -} - -bool SelectMachinePopup::search_for_printer(MachineObject* obj) -{ - std::string search_text = std::string((m_search_bar->GetValue()).mb_str()); - if (search_text.empty()) { - return true; - } - auto name = obj->dev_name; - auto ip = obj->dev_ip; - auto name_it = name.find(search_text); - auto ip_it = ip.find(search_text); - if ((name_it != std::string::npos)||(ip_it != std::string::npos)) { - return true; - } - - return false; -} - -void SelectMachinePopup::on_dissmiss_win(wxCommandEvent &event) -{ - Dismiss(); -} - -void SelectMachinePopup::update_machine_list(wxCommandEvent &event) -{ - update_user_devices(); - update_other_devices(); - BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list end"; -} - -void SelectMachinePopup::start_ssdp(bool start) -{ - return; - //if (wxGetApp().getAgent()) { wxGetApp().getAgent()->start_discovery(true, start); } -} - -void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) -{ - auto mouse_pos = ClientToScreen(event.GetPosition()); - auto wxscroll_win_pos = m_scrolledWindow->ClientToScreen(wxPoint(0, 0)); - - if (mouse_pos.x > wxscroll_win_pos.x && mouse_pos.y > wxscroll_win_pos.y && mouse_pos.x < (wxscroll_win_pos.x + m_scrolledWindow->GetSize().x) && - mouse_pos.y < (wxscroll_win_pos.y + m_scrolledWindow->GetSize().y)) { - - for (MachinePanel* p : m_user_list_machine_panel) { - auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); - if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { - wxMouseEvent event(wxEVT_LEFT_UP); - auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); - event.SetPosition(tag_pos); - event.SetEventObject(p->mPanel); - wxPostEvent(p->mPanel, event); - } - } - - for (MachinePanel* p : m_other_list_machine_panel) { - auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); - if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { - wxMouseEvent event(wxEVT_LEFT_UP); - auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); - event.SetPosition(tag_pos); - event.SetEventObject(p->mPanel); - wxPostEvent(p->mPanel, event); - } - } - - //pin code - auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0)); - if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) { - wxGetApp().popup_ping_bind_dialog(); - } - - //bind with access code - auto dc_rect = m_panel_direct_connection->ClientToScreen(wxPoint(0, 0)); - if (mouse_pos.x > dc_rect.x && mouse_pos.y > dc_rect.y && mouse_pos.x < (dc_rect.x + m_panel_direct_connection->GetSize().x) && mouse_pos.y < (dc_rect.y + m_panel_direct_connection->GetSize().y)) { - InputIpAddressDialog dlgo; - dlgo.ShowModal(); - } - - //hyper link - auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0)); - if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) { - wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer")); - } - } -} - static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { //_L("Auto"), _L("Bambu Cool Plate"), @@ -913,6 +57,7 @@ static std::string MachineBedTypeString[BED_TYPE_COUNT] = { "suprtack" }; + void SelectMachineDialog::stripWhiteSpace(std::string& str) { if (str == "") { return; } @@ -961,6 +106,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)); @@ -1312,51 +464,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); @@ -1504,11 +686,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_scrollable_region->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL, 0); - //m_basic_panel_sizer->Add(m_sizer_material_area, 0, wxLEFT, FromDIP(10)); - - - m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(12)); @@ -1519,9 +696,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); @@ -1647,165 +824,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(11)); - - auto text = new wxStaticText(checkbox, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0); - text->SetFont(::Label::Body_13); - 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) @@ -2354,8 +1441,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; @@ -2845,7 +1933,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; } @@ -2908,7 +1996,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; @@ -3091,7 +2179,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(); @@ -3196,18 +2284,24 @@ void SelectMachineDialog::on_send_print() m_print_job->has_sdcard = obj_->has_sdcard(); - 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); + true, + 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; } @@ -3423,8 +2517,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); @@ -3608,15 +2700,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(); @@ -3642,6 +2734,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(); @@ -3681,7 +2774,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"); } @@ -3716,14 +2809,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() @@ -3797,7 +2890,6 @@ void SelectMachineDialog::update_show_status() } reset_timeout(); - //update_ams_check(obj_); if (!obj_->is_support_print_all && m_print_plate_idx == PLATE_ALL_IDX) { show_status(PrintDialogStatus::PrintStatusNotSupportedPrintAll); @@ -3808,14 +2900,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; } @@ -3867,7 +2959,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); @@ -3879,7 +2971,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); @@ -4042,13 +3134,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"); } } } @@ -4166,9 +3258,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(); @@ -4178,51 +3270,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); - } } } @@ -4301,37 +3365,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(); @@ -4479,7 +3512,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]); @@ -4813,8 +3846,6 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) 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(); @@ -4922,7 +3953,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); @@ -5088,7 +4119,6 @@ void SelectMachineDialog::update_lan_machine_list() 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()) { auto b = mobj->dev_name; @@ -5099,158 +4129,45 @@ void SelectMachineDialog::update_lan_machine_list() std::vector machine_list; wxArrayString machine_list_name; std::map option_list; - - // same machine only appear once - - /* machine_list = sort_string(machine_list); - for (auto tt = machine_list.begin(); tt != machine_list.end(); tt++) { - for (auto it = option_list.begin(); it != option_list.end(); it++) { - if (it->second->dev_name == *tt) { - m_list.push_back(it->second); - wxString dev_name_text = from_u8(it->second->dev_name); - if (it->second->is_lan_mode_printer()) { - dev_name_text += "(LAN)"; - } - machine_list_name.Add(dev_name_text); - break; - } - } - } - - m_comboBox_printer->Set(machine_list_name); - - MachineObject* obj = dev->get_selected_machine(); - if (obj) { - m_printer_last_select = obj->dev_id; - } - else { - m_printer_last_select = ""; - }*/ - //op->set_printer_state(PrinterState::LOCK); } } - - - BOOST_LOG_TRIVIAL(trace) << "SelectMachineDialog update_lan_devices end"; } -EditDevNameDialog::EditDevNameDialog(Plater *plater /*= nullptr*/) - : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Modifying the device name"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +std::string SelectMachineDialog::get_print_status_info(PrintDialogStatus status) { - 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), wxTAB_TRAVERSAL); - m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); - m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(38)); - m_textCtr = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(260), FromDIP(40)), wxTE_PROCESS_ENTER); - m_textCtr->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(22))); - m_textCtr->SetMinSize(wxSize(FromDIP(260), FromDIP(40))); - m_sizer_main->Add(m_textCtr, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, FromDIP(40)); - - m_static_valid = new wxStaticText(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0); - m_static_valid->Wrap(-1); - m_static_valid->SetFont(::Label::Body_13); - m_static_valid->SetForegroundColour(wxColour(255, 111, 0)); - m_sizer_main->Add(m_static_valid, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, FromDIP(10)); - - - m_button_confirm = new Button(this, _L("Confirm")); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(0, 174, 66), StateColor::Normal)); - m_button_confirm->SetBackgroundColor(btn_bg_green); - m_button_confirm->SetBorderColor(wxColour(0, 174, 66)); - m_button_confirm->SetTextColor(wxColour(255, 255, 255)); - m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24))); - m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24))); - m_button_confirm->SetCornerRadius(FromDIP(12)); - m_button_confirm->Bind(wxEVT_BUTTON, &EditDevNameDialog::on_edit_name, this); - - m_sizer_main->Add(m_button_confirm, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(10)); - m_sizer_main->Add(0, 0, 0, wxBOTTOM, FromDIP(38)); - - SetSizer(m_sizer_main); - Layout(); - Fit(); - Centre(wxBOTH); - wxGetApp().UpdateDlgDarkUI(this); + switch (status) { + case PrintStatusInit: return "PrintStatusInit"; + case PrintStatusNoUserLogin: return "PrintStatusNoUserLogin"; + case PrintStatusInvalidPrinter: return "PrintStatusInvalidPrinter"; + case PrintStatusConnectingServer: return "PrintStatusConnectingServer"; + case PrintStatusReading: return "PrintStatusReading"; + case PrintStatusReadingFinished: return "PrintStatusReadingFinished"; + case PrintStatusReadingTimeout: return "PrintStatusReadingTimeout"; + case PrintStatusInUpgrading: return "PrintStatusInUpgrading"; + case PrintStatusNeedUpgradingAms: return "PrintStatusNeedUpgradingAms"; + case PrintStatusInSystemPrinting: return "PrintStatusInSystemPrinting"; + case PrintStatusInPrinting: return "PrintStatusInPrinting"; + case PrintStatusDisableAms: return "PrintStatusDisableAms"; + case PrintStatusAmsMappingSuccess: return "PrintStatusAmsMappingSuccess"; + case PrintStatusAmsMappingInvalid: return "PrintStatusAmsMappingInvalid"; + case PrintStatusAmsMappingU0Invalid: return "PrintStatusAmsMappingU0Invalid"; + case PrintStatusAmsMappingValid: return "PrintStatusAmsMappingValid"; + case PrintStatusAmsMappingByOrder: return "PrintStatusAmsMappingByOrder"; + case PrintStatusRefreshingMachineList: return "PrintStatusRefreshingMachineList"; + case PrintStatusSending: return "PrintStatusSending"; + case PrintStatusSendingCanceled: return "PrintStatusSendingCanceled"; + case PrintStatusLanModeNoSdcard: return "PrintStatusLanModeNoSdcard"; + case PrintStatusNoSdcard: return "PrintStatusNoSdcard"; + case PrintStatusUnsupportedPrinter: return "PrintStatusUnsupportedPrinter"; + case PrintStatusTimelapseNoSdcard: return "PrintStatusTimelapseNoSdcard"; + case PrintStatusNotSupportedPrintAll: return "PrintStatusNotSupportedPrintAll"; + } + return "unknown"; } -EditDevNameDialog::~EditDevNameDialog() {} - -void EditDevNameDialog::set_machine_obj(MachineObject *obj) -{ - m_info = obj; - if (m_info) - m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->dev_name)); -} - -void EditDevNameDialog::on_dpi_changed(const wxRect &suggested_rect) -{ - m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24))); - m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24))); -} - -void EditDevNameDialog::on_edit_name(wxCommandEvent &e) -{ - m_static_valid->SetLabel(wxEmptyString); - auto m_valid_type = Valid; - wxString info_line; - auto new_dev_name = m_textCtr->GetTextCtrl()->GetValue(); - - const char * unusable_symbols = "<>[]:/\\|?*\""; - const std::string unusable_suffix = PresetCollection::get_suffix_modified(); - - for (size_t i = 0; i < std::strlen(unusable_symbols); i++) { - if (new_dev_name.find_first_of(unusable_symbols[i]) != std::string::npos) { - info_line = _L("Name is invalid;") + _L("illegal characters:") + " " + unusable_symbols; - m_valid_type = NoValid; - break; - } - } - - if (m_valid_type == Valid && new_dev_name.find(unusable_suffix) != std::string::npos) { - info_line = _L("Name is invalid;") + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified()); - m_valid_type = NoValid; - } - - if (m_valid_type == Valid && new_dev_name.empty()) { - info_line = _L("The name is not allowed to be empty."); - m_valid_type = NoValid; - } - - if (m_valid_type == Valid && new_dev_name.find_first_of(' ') == 0) { - info_line = _L("The name is not allowed to start with space character."); - m_valid_type = NoValid; - } - - if (m_valid_type == Valid && new_dev_name.find_last_of(' ') == new_dev_name.length() - 1) { - info_line = _L("The name is not allowed to end with space character."); - m_valid_type = NoValid; - } - - if (m_valid_type == NoValid) { - m_static_valid->SetLabel(info_line); - Layout(); - } - - if (m_valid_type == Valid) { - m_static_valid->SetLabel(wxEmptyString); - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - auto utf8_str = new_dev_name.ToUTF8(); - auto name = std::string(utf8_str.data(), utf8_str.length()); - if (m_info) - dev->modify_device_name(m_info->dev_id, name); - } - DPIDialog::EndModal(wxID_CLOSE); - } -} ThumbnailPanel::ThumbnailPanel(wxWindow *parent, wxWindowID winid, const wxPoint &pos, const wxSize &size) : wxPanel(parent, winid, pos, size) @@ -5310,109 +4227,244 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) ThumbnailPanel::~ThumbnailPanel() {} - PinCodePanel::PinCodePanel(wxWindow* parent, int type, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/) + PrintOption::PrintOption(wxWindow *parent, wxString title, wxString tips, boost::bimaps::bimap ops, std::string param) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) { - wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE); - Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this); - SetSize(SELECT_MACHINE_ITEM_SIZE); - SetMaxSize(SELECT_MACHINE_ITEM_SIZE); - SetMinSize(SELECT_MACHINE_ITEM_SIZE); +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + Bind(wxEVT_PAINT, &PrintOption::OnPaint, this); - m_type = type; - m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); + if (tips.IsEmpty()) { + SetMinSize(wxSize(-1, FromDIP(50))); + SetMaxSize(wxSize(-1, FromDIP(50))); + } + else { + SetMinSize(wxSize(-1, FromDIP(90))); + SetMaxSize(wxSize(-1, FromDIP(90))); + } - this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this); - this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this); - this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this); + m_ops = ops; + m_param = param; + + SetBackgroundColour(*wxWHITE); + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *top_sizer = new wxBoxSizer(wxHORIZONTAL); + + + 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 PinCodePanel::OnPaint(wxPaintEvent& event) +void PrintOption::OnPaint(wxPaintEvent &event) { wxPaintDC dc(this); - render(dc); - } - - void PinCodePanel::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); + } + +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 PinCodePanel::doRender(wxDC& dc) - { - auto size = GetSize(); +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); +} - //m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); +void PrintOption::setValue(std::string value) +{ + m_printoption_item->setValue(value); +} - m_bitmap = ScalableBitmap(this, wxGetApp().dark_mode() ? "bind_device_ping_code_dark" : "bind_device_ping_code_light", 10); +std::string PrintOption::getValue() +{ + return m_printoption_item->getValue(); +} - dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2)); - dc.SetFont(::Label::Head_13); - dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); - wxString txt; - if (m_type == 0) {txt = _L("Bind with Pin Code");} - else if (m_type == 1) {txt = _L("Bind with Access Code");} +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; + } +} - auto txt_size = dc.GetTextExtent(txt); - dc.DrawText(txt, wxPoint(FromDIP(28), (size.y - txt_size.y) / 2)); +PrintOptionItem::PrintOptionItem(wxWindow *parent, boost::bimaps::bimap ops, std::string param) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ - if (m_hover) { - dc.SetPen(SELECT_MACHINE_BRAND); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRectangle(0, 0, size.x, size.y); - } - } + m_ops = ops; + m_param = param; - void PinCodePanel::on_mouse_enter(wxMouseEvent& evt) - { - m_hover = true; - Refresh(); - } + 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); - void PinCodePanel::on_mouse_leave(wxMouseEvent& evt) - { - m_hover = false; - Refresh(); - } + m_selected_bk = ScalableBitmap(this, "print_options_bg", 22); +} - void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt) - { - if (m_type == 0) { - if (wxGetApp().getAgent() && wxGetApp().getAgent()->is_user_login()){ - wxGetApp().popup_ping_bind_dialog(); - } - else{ - auto m_confirm_login_dlg = new SecondaryCheckDialog(nullptr, wxID_ANY, _L("Bind with Pin Code"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, wxDefaultPosition); - m_confirm_login_dlg->SetSize(wxSize(FromDIP(270), FromDIP(158))); - m_confirm_login_dlg->update_text(_L("Please log in before binding your device with a PIN code.\nAlternatively, you can use LAN mode to bind your device. Learn about LAN mode.")); - m_confirm_login_dlg->update_btn_label(_L("Go to Login"), _L("")); - m_confirm_login_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) { - //m_confirm_login_dlg->on_hide(); - wxGetApp().request_login(); - return; - }); - m_confirm_login_dlg->on_show(); - } - } - else if (m_type == 1) { - InputIpAddressDialog dlgo; - dlgo.ShowModal(); - } - } +void PrintOptionItem::OnPaint(wxPaintEvent &event) +{ + wxPaintDC dc(this); + doRender(dc); +} - }} // namespace Slic3r::GUI +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 4be0365e7..cdcd26adc 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" @@ -43,255 +44,11 @@ namespace Slic3r { namespace GUI { -enum PrinterState { - OFFLINE, - IDLE, - BUSY, - LOCK, - IN_LAN -}; - -enum PrinterBindState { - NONE, - ALLOW_BIND, - ALLOW_UNBIND -}; - enum PrintFromType { FROM_NORMAL, FROM_SDCARD_VIEW, }; -static int get_brightness_value(wxImage image) { - - wxImage grayImage = image.ConvertToGreyscale(); - - int width = grayImage.GetWidth(); - int height = grayImage.GetHeight(); - - int totalLuminance = 0; - unsigned char alpha; - int num_none_transparent = 0; - for (int y = 0; y < height; y += 2) { - - for (int x = 0; x < width; x += 2) { - - alpha = image.GetAlpha(x, y); - if (alpha != 0) { - wxColour pixelColor = grayImage.GetRed(x, y); - totalLuminance += pixelColor.Red(); - num_none_transparent = num_none_transparent + 1; - } - } - } - if (totalLuminance <= 0 || num_none_transparent <= 0) { - return 0; - } - return totalLuminance / num_none_transparent; -} - -class Material -{ -public: - int id; - MaterialItem *item; -}; - -WX_DECLARE_HASH_MAP(int, Material *, wxIntegerHash, wxIntegerEqual, MaterialHash); - -// move to seperate file -class MachineListModel : public wxDataViewVirtualListModel -{ -public: - enum { - Col_MachineName = 0, - Col_MachineSN = 1, - Col_MachineBind = 2, - Col_MachinePrintingStatus = 3, - Col_MachineIPAddress = 4, - Col_MachineConnection = 5, - Col_MachineTaskName = 6, - Col_Max = 7 - }; - MachineListModel(); - - virtual unsigned int GetColumnCount() const wxOVERRIDE { return Col_Max; } - - virtual wxString GetColumnType(unsigned int col) const wxOVERRIDE { return "string"; } - - virtual void GetValueByRow(wxVariant &variant, unsigned int row, unsigned int col) const wxOVERRIDE; - virtual bool GetAttrByRow(unsigned int row, unsigned int col, wxDataViewItemAttr &attr) const wxOVERRIDE; - virtual bool SetValueByRow(const wxVariant &variant, unsigned int row, unsigned int col) wxOVERRIDE; - - void display_machines(std::map list); - void add_machine(MachineObject *obj, bool reset = true); - int find_row_by_sn(wxString sn); - -private: - wxArrayString m_values[Col_Max]; - - wxArrayString m_nameColValues; - wxArrayString m_snColValues; - wxArrayString m_bindColValues; - wxArrayString m_connectionColValues; - wxArrayString m_printingStatusValues; - wxArrayString m_ipAddressValues; -}; - -class MachineObjectPanel : public wxPanel -{ -private: - bool m_is_my_devices {false}; - bool m_show_edit{false}; - bool m_show_bind{false}; - bool m_hover {false}; - bool m_is_macos_special_version{false}; - - - PrinterBindState m_bind_state; - PrinterState m_state; - - ScalableBitmap m_unbind_img; - ScalableBitmap m_edit_name_img; - ScalableBitmap m_select_unbind_img; - - ScalableBitmap m_printer_status_offline; - ScalableBitmap m_printer_status_busy; - ScalableBitmap m_printer_status_idle; - ScalableBitmap m_printer_status_lock; - ScalableBitmap m_printer_in_lan; - - MachineObject *m_info; - -protected: - wxStaticBitmap *m_bitmap_info; - wxStaticBitmap *m_bitmap_bind; - -public: - MachineObjectPanel(wxWindow * parent, - wxWindowID id = wxID_ANY, - const wxPoint & pos = wxDefaultPosition, - const wxSize & size = wxDefaultSize, - long style = wxTAB_TRAVERSAL, - const wxString &name = wxEmptyString); - - ~MachineObjectPanel(); - - void show_bind_dialog(); - void set_printer_state(PrinterState state); - void show_printer_bind(bool show, PrinterBindState state); - void show_edit_printer_name(bool show); - void update_machine_info(MachineObject *info, bool is_my_devices = false); -protected: - void OnPaint(wxPaintEvent &event); - void render(wxDC &dc); - void doRender(wxDC &dc); - void on_mouse_enter(wxMouseEvent &evt); - void on_mouse_leave(wxMouseEvent &evt); - void on_mouse_left_up(wxMouseEvent &evt); -}; - -#define SELECT_MACHINE_POPUP_SIZE wxSize(FromDIP(216), FromDIP(364)) -#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(212), FromDIP(360)) -#define SELECT_MACHINE_ITEM_SIZE wxSize(FromDIP(190), FromDIP(35)) -#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48) -#define SELECT_MACHINE_GREY600 wxColour(144,144,144) -#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206) -#define SELECT_MACHINE_BRAND wxColour(0, 174, 66) -#define SELECT_MACHINE_REMIND wxColour(255,111,0) -#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231) - -class MachinePanel -{ -public: - wxString mIndex; - MachineObjectPanel *mPanel; -}; - -class PinCodePanel : public wxPanel -{ -public: - PinCodePanel(wxWindow* parent, - int type, - wxWindowID winid = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize); - ~PinCodePanel() {}; - - ScalableBitmap m_bitmap; - bool m_hover{false}; - int m_type{0}; - - void OnPaint(wxPaintEvent& event); - void render(wxDC& dc); - void doRender(wxDC& dc); - - void on_mouse_enter(wxMouseEvent& evt); - void on_mouse_leave(wxMouseEvent& evt); - void on_mouse_left_up(wxMouseEvent& evt); -}; - - -class ThumbnailPanel; - -class SelectMachinePopup : public PopupWindow -{ -public: - SelectMachinePopup(wxWindow *parent); - ~SelectMachinePopup(); - - // PopupWindow virtual methods are all overridden to log them - virtual void Popup(wxWindow *focus = NULL) wxOVERRIDE; - virtual void OnDismiss() wxOVERRIDE; - virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE; - virtual bool Show(bool show = true) wxOVERRIDE; - - void update_machine_list(wxCommandEvent &event); - void start_ssdp(bool on_off); - bool was_dismiss() { return m_dismiss; } - -private: - int m_my_devices_count{0}; - int m_other_devices_count{0}; - PinCodePanel* m_panel_ping_code{nullptr}; - PinCodePanel* m_panel_direct_connection{nullptr}; - wxWindow* m_placeholder_panel{nullptr}; - wxHyperlinkCtrl* m_hyperlink{nullptr}; - Label* m_ping_code_text{nullptr}; - wxStaticBitmap* m_img_ping_code{nullptr}; - wxBoxSizer * m_sizer_body{nullptr}; - wxBoxSizer * m_sizer_my_devices{nullptr}; - wxBoxSizer * m_sizer_other_devices{nullptr}; - wxBoxSizer * m_sizer_search_bar{nullptr}; - wxSearchCtrl* m_search_bar{nullptr}; - wxScrolledWindow * m_scrolledWindow{nullptr}; - wxWindow * m_panel_body{nullptr}; - wxTimer * m_refresh_timer{nullptr}; - std::vector m_user_list_machine_panel; - std::vector m_other_list_machine_panel; - boost::thread* get_print_info_thread{ nullptr }; - std::shared_ptr m_token = std::make_shared(0); - std::string m_print_info = ""; - bool m_dismiss { false }; - - std::map m_bind_machine_list; - std::map m_free_machine_list; - -private: - void OnLeftUp(wxMouseEvent &event); - void on_timer(wxTimerEvent &event); - - void update_other_devices(); - void update_user_devices(); - bool search_for_printer(MachineObject* obj); - void on_dissmiss_win(wxCommandEvent &event); - wxWindow *create_title_panel(wxString text); -}; - -#define SELECT_MACHINE_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(23)) -#define SELECT_MACHINE_DIALOG_SIMBOOK_SIZE wxSize(FromDIP(370), FromDIP(64)) - - enum PrintPageMode { PrintPageModePrepare = 0, PrintPageModeSending, @@ -336,8 +93,117 @@ enum PrintDialogStatus { PrintStatusMixAmsAndVtSlotWarning }; +class Material +{ +public: + int id; + MaterialItem *item; +}; -std::string get_print_status_info(PrintDialogStatus status); +WX_DECLARE_HASH_MAP(int, Material *, wxIntegerHash, wxIntegerEqual, MaterialHash); + +#define SELECT_MACHINE_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(23)) +#define SELECT_MACHINE_DIALOG_SIMBOOK_SIZE wxSize(FromDIP(370), FromDIP(64)) + +static int get_brightness_value(wxImage image) { + + wxImage grayImage = image.ConvertToGreyscale(); + + int width = grayImage.GetWidth(); + int height = grayImage.GetHeight(); + + int totalLuminance = 0; + unsigned char alpha; + int num_none_transparent = 0; + for (int y = 0; y < height; y += 2) { + + for (int x = 0; x < width; x += 2) { + + alpha = image.GetAlpha(x, y); + if (alpha != 0) { + wxColour pixelColor = grayImage.GetRed(x, y); + totalLuminance += pixelColor.Red(); + num_none_transparent = num_none_transparent + 1; + } + } + } + if (totalLuminance <= 0 || num_none_transparent <= 0) { + return 0; + } + 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: + wxBitmap m_bitmap; + wxStaticBitmap *m_staticbitmap{nullptr}; + + ThumbnailPanel(wxWindow *parent, wxWindowID winid = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~ThumbnailPanel(); + + void OnPaint(wxPaintEvent &event); + void PaintBackground(wxDC &dc); + void OnEraseBackground(wxEraseEvent &event); + void set_thumbnail(wxImage &img); + void render(wxDC &dc); + +private: + ScalableBitmap m_background_bitmap; + wxBitmap bitmap_with_background; + int m_brightness_value{-1}; +}; class SelectMachineDialog : public DPIDialog { @@ -353,6 +219,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; @@ -366,8 +233,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; @@ -381,6 +247,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 }; @@ -405,10 +274,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}; @@ -547,66 +412,14 @@ public: void auto_supply_with_ext(std::vector slots); bool is_nozzle_type_match(ExtderData data); + std::string get_print_status_info(PrintDialogStatus status); + 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); }; - -wxDECLARE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); -wxDECLARE_EVENT(EVT_REQUEST_BIND_LIST, wxCommandEvent); -wxDECLARE_EVENT(EVT_WILL_DISMISS_MACHINE_LIST, wxCommandEvent); -wxDECLARE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); -wxDECLARE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); -wxDECLARE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); -wxDECLARE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); -wxDECLARE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); -wxDECLARE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); - -class EditDevNameDialog : public DPIDialog -{ -public: - EditDevNameDialog(Plater *plater = nullptr); - ~EditDevNameDialog(); - - void set_machine_obj(MachineObject *obj); - void on_dpi_changed(const wxRect &suggested_rect) override; - void on_edit_name(wxCommandEvent &e); - - Button* m_button_confirm{nullptr}; - TextInput* m_textCtr{nullptr}; - wxStaticText* m_static_valid{nullptr}; - MachineObject* m_info{nullptr}; -}; - - -class ThumbnailPanel : public wxPanel -{ -public: - wxBitmap m_bitmap; - wxStaticBitmap *m_staticbitmap{nullptr}; - - ThumbnailPanel(wxWindow * parent, - wxWindowID winid = wxID_ANY, - const wxPoint & pos = wxDefaultPosition, - const wxSize & size = wxDefaultSize); - ~ThumbnailPanel(); - - void OnPaint(wxPaintEvent &event); - void PaintBackground(wxDC &dc); - void OnEraseBackground(wxEraseEvent &event); - void set_thumbnail(wxImage &img); - void render(wxDC &dc); -private: - ScalableBitmap m_background_bitmap; - wxBitmap bitmap_with_background; - int m_brightness_value{ -1 }; -}; - }} // namespace Slic3r::GUI #endif diff --git a/src/slic3r/GUI/SelectMachinePop.cpp b/src/slic3r/GUI/SelectMachinePop.cpp new file mode 100644 index 000000000..fc23a5019 --- /dev/null +++ b/src/slic3r/GUI/SelectMachinePop.cpp @@ -0,0 +1,1058 @@ +#include "SelectMachinePop.hpp" +#include "I18N.hpp" + +#include "libslic3r/Utils.hpp" +#include "libslic3r/Thread.hpp" +#include "GUI.hpp" +#include "GUI_App.hpp" +#include "GUI_Preview.hpp" +#include "MainFrame.hpp" +#include "format.hpp" +#include "Widgets/ProgressDialog.hpp" +#include "Widgets/RoundedRectangle.hpp" +#include "Widgets/StaticBox.hpp" +#include "ConnectPrinter.hpp" + + +#include +#include +#include +#include +#include +#include +#include "Plater.hpp" +#include "Notebook.hpp" +#include "BitmapCache.hpp" +#include "BindDialog.hpp" + +namespace Slic3r { namespace GUI { + +wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); +wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); +wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent); +wxDEFINE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); +wxDEFINE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); +wxDEFINE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); +wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent); + + +#define INITIAL_NUMBER_OF_MACHINES 0 +#define LIST_REFRESH_INTERVAL 200 +#define MACHINE_LIST_REFRESH_INTERVAL 2000 + +#define WRAP_GAP FromDIP(2) + +MachineObjectPanel::MachineObjectPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) +{ + wxPanel::Create(parent, id, pos, SELECT_MACHINE_ITEM_SIZE, style, name); + Bind(wxEVT_PAINT, &MachineObjectPanel::OnPaint, this); + + SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); + + m_unbind_img = ScalableBitmap(this, "unbind", 18); + m_edit_name_img = ScalableBitmap(this, "edit_button", 18); + m_select_unbind_img = ScalableBitmap(this, "unbind_selected", 18); + + m_printer_status_offline = ScalableBitmap(this, "printer_status_offline", 12); + m_printer_status_busy = ScalableBitmap(this, "printer_status_busy", 12); + m_printer_status_idle = ScalableBitmap(this, "printer_status_idle", 12); + m_printer_status_lock = ScalableBitmap(this, "printer_status_lock", 16); + m_printer_in_lan = ScalableBitmap(this, "printer_in_lan", 16); + + this->Bind(wxEVT_ENTER_WINDOW, &MachineObjectPanel::on_mouse_enter, this); + this->Bind(wxEVT_LEAVE_WINDOW, &MachineObjectPanel::on_mouse_leave, this); + this->Bind(wxEVT_LEFT_UP, &MachineObjectPanel::on_mouse_left_up, this); + +#ifdef __APPLE__ + wxPlatformInfo platformInfo; + auto major = platformInfo.GetOSMajorVersion(); + auto minor = platformInfo.GetOSMinorVersion(); + auto micro = platformInfo.GetOSMicroVersion(); + + //macos 13.1.0 + if (major >= 13 && minor >= 1 && micro >= 0) { + m_is_macos_special_version = true; + } +#endif + +} + + +MachineObjectPanel::~MachineObjectPanel() {} + +void MachineObjectPanel::show_bind_dialog() +{ + if (wxGetApp().is_user_login()) { + BindMachineDialog dlg; + dlg.update_machine_info(m_info); + dlg.ShowModal(); + } +} + +void MachineObjectPanel::set_printer_state(PrinterState state) +{ + m_state = state; + Refresh(); +} + +void MachineObjectPanel::show_edit_printer_name(bool show) +{ + m_show_edit = show; + Refresh(); +} + +void MachineObjectPanel::show_printer_bind(bool show, PrinterBindState state) +{ + m_show_bind = show; + m_bind_state = state; + Refresh(); +} + +void MachineObjectPanel::OnPaint(wxPaintEvent &event) +{ + wxPaintDC dc(this); + doRender(dc); +} + +void MachineObjectPanel::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 MachineObjectPanel::doRender(wxDC &dc) +{ + auto left = 10; + wxSize size = GetSize(); + dc.SetPen(*wxTRANSPARENT_PEN); + + auto dwbitmap = m_printer_status_offline; + if (m_state == PrinterState::IDLE) { dwbitmap = m_printer_status_idle; } + if (m_state == PrinterState::BUSY) { dwbitmap = m_printer_status_busy; } + if (m_state == PrinterState::OFFLINE) { dwbitmap = m_printer_status_offline; } + if (m_state == PrinterState::LOCK) { dwbitmap = m_printer_status_lock; } + if (m_state == PrinterState::IN_LAN) { dwbitmap = m_printer_in_lan; } + + // dc.DrawCircle(left, size.y / 2, 3); + dc.DrawBitmap(dwbitmap.bmp(), wxPoint(left, (size.y - dwbitmap.GetBmpSize().y) / 2)); + + left += dwbitmap.GetBmpSize().x + 8; + dc.SetFont(Label::Body_13); + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); + wxString dev_name = ""; + if (m_info) { + dev_name = from_u8(m_info->dev_name); + + if (m_state == PrinterState::IN_LAN) { + dev_name += _L("(LAN)"); + } + } + auto sizet = dc.GetTextExtent(dev_name); + auto text_end = 0; + + if (m_show_edit) { + text_end = size.x - m_unbind_img.GetBmpSize().x - 30; + } + else { + text_end = size.x - m_unbind_img.GetBmpSize().x; + } + + wxString finally_name = dev_name; + if (sizet.x > (text_end - left)) { + auto limit_width = text_end - left - dc.GetTextExtent("...").x - 15; + for (auto i = 0; i < dev_name.length(); i++) { + auto curr_width = dc.GetTextExtent(dev_name.substr(0, i)); + if (curr_width.x >= limit_width) { + finally_name = dev_name.substr(0, i) + "..."; + break; + } + } + } + + dc.DrawText(finally_name, wxPoint(left, (size.y - sizet.y) / 2)); + + + if (m_hover || m_is_macos_special_version) { + + if (m_hover && !m_is_macos_special_version) { + dc.SetPen(SELECT_MACHINE_BRAND); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + } + + if (m_show_bind) { + if (m_bind_state == ALLOW_UNBIND) { + left = size.x - m_unbind_img.GetBmpSize().x - 6; + dc.DrawBitmap(m_unbind_img.bmp(), left, (size.y - m_unbind_img.GetBmpSize().y) / 2); + } + } + + if (m_show_edit) { + left = size.x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6; + dc.DrawBitmap(m_edit_name_img.bmp(), left, (size.y - m_edit_name_img.GetBmpSize().y) / 2); + } + } + +} + +void MachineObjectPanel::update_machine_info(MachineObject *info, bool is_my_devices) +{ + m_info = info; + m_is_my_devices = is_my_devices; + Refresh(); +} + +void MachineObjectPanel::on_mouse_enter(wxMouseEvent &evt) +{ + m_hover = true; + Refresh(); +} + +void MachineObjectPanel::on_mouse_leave(wxMouseEvent &evt) +{ + m_hover = false; + Refresh(); +} + +void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt) +{ + if (m_is_my_devices) { + // show edit + if (m_show_edit) { + auto edit_left = GetSize().x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6; + auto edit_right = edit_left + m_edit_name_img.GetBmpSize().x; + auto edit_top = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2; + auto edit_bottom = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2 + m_edit_name_img.GetBmpSize().y; + if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) { + wxCommandEvent event(EVT_EDIT_PRINT_NAME); + event.SetEventObject(this); + wxPostEvent(this, event); + return; + } + } + if (m_show_bind) { + auto left = GetSize().x - m_unbind_img.GetBmpSize().x - 6; + auto right = left + m_unbind_img.GetBmpSize().x; + auto top = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2; + auto bottom = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2 + m_unbind_img.GetBmpSize().y; + + if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) { + wxCommandEvent event(EVT_UNBIND_MACHINE, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } else { + if (m_info) { + wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + } + //wxGetApp().mainframe->SetFocus(); + wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST); + event.SetEventObject(this->GetParent()); + wxPostEvent(this->GetParent(), event); + } + return; + } + if (m_info && m_info->is_lan_mode_printer()) { + if (m_info->has_access_right() && m_info->is_avaliable()) { + wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + } else { + wxCommandEvent event(EVT_CONNECT_LAN_PRINT); + event.SetEventObject(this); + wxPostEvent(this, event); + } + } else { + wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + } + } else { + if (m_info && m_info->is_lan_mode_printer()) { + wxCommandEvent event(EVT_CONNECT_LAN_PRINT); + event.SetEventObject(this); + wxPostEvent(this, event); + } else { + wxCommandEvent event(EVT_BIND_MACHINE); + event.SetEventObject(this); + wxPostEvent(this, event); + } + } + +} + +SelectMachinePopup::SelectMachinePopup(wxWindow *parent) + : PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS), m_dismiss(false) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + + SetSize(SELECT_MACHINE_POPUP_SIZE); + SetMinSize(SELECT_MACHINE_POPUP_SIZE); + SetMaxSize(SELECT_MACHINE_POPUP_SIZE); + + Freeze(); + wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL); + SetBackgroundColour(SELECT_MACHINE_GREY400); + + + + m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL); + m_scrolledWindow->SetBackgroundColour(*wxWHITE); + m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE); + m_scrolledWindow->SetScrollRate(0, 5); + auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL); + m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow); + m_scrolledWindow->Layout(); + m_sizxer_scrolledWindow->Fit(m_scrolledWindow); + +#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) + m_sizer_search_bar = new wxBoxSizer(wxVERTICAL); + m_search_bar = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_search_bar->SetDescriptiveText(_L("Search")); + m_search_bar->ShowSearchButton( true ); + m_search_bar->ShowCancelButton( false ); + m_sizer_search_bar->Add( m_search_bar, 1, wxALL| wxEXPAND, 1 ); + m_sizer_main->Add(m_sizer_search_bar, 0, wxALL | wxEXPAND, FromDIP(2)); + m_search_bar->Bind( wxEVT_COMMAND_TEXT_UPDATED, &SelectMachinePopup::update_machine_list, this ); +#endif + auto own_title = create_title_panel(_L("My Device")); + m_sizer_my_devices = new wxBoxSizer(wxVERTICAL); + auto other_title = create_title_panel(_L("Other Device")); + m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); + + + m_panel_ping_code = new PinCodePanel(m_scrolledWindow, 0, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); + m_panel_direct_connection = new PinCodePanel(m_scrolledWindow, 1, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); + + m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); + m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(m_panel_direct_connection, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); + m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0); + + m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2)); + + SetSizer(m_sizer_main); + Layout(); + Thaw(); + + #ifdef __APPLE__ + m_scrolledWindow->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this); + #endif // __APPLE__ + + m_refresh_timer = new wxTimer(); + m_refresh_timer->SetOwner(this); + Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachinePopup::update_machine_list, this); + Bind(wxEVT_TIMER, &SelectMachinePopup::on_timer, this); + Bind(EVT_DISSMISS_MACHINE_LIST, &SelectMachinePopup::on_dissmiss_win, this); +} + +SelectMachinePopup::~SelectMachinePopup() { delete m_refresh_timer;} + +void SelectMachinePopup::Popup(wxWindow *WXUNUSED(focus)) +{ + BOOST_LOG_TRIVIAL(trace) << "get_print_info: start"; + start_ssdp(true); + if (m_refresh_timer) { + m_refresh_timer->Stop(); + m_refresh_timer->Start(MACHINE_LIST_REFRESH_INTERVAL); + } + + if (wxGetApp().is_user_login()) { + if (!get_print_info_thread) { + get_print_info_thread = new boost::thread(Slic3r::create_thread([this, token = std::weak_ptr(m_token)] { + NetworkAgent* agent = wxGetApp().getAgent(); + unsigned int http_code; + std::string body; + int result = agent->get_user_print_info(&http_code, &body); + CallAfter([token, this, result, body]() { + if (token.expired()) {return;} + if (result == 0) { + m_print_info = body; + } + else { + m_print_info = ""; + } + wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST); + event.SetEventObject(this); + wxPostEvent(this, event); + }); + })); + } + } + + wxPostEvent(this, wxTimerEvent()); + PopupWindow::Popup(); +} + +void SelectMachinePopup::OnDismiss() +{ + BOOST_LOG_TRIVIAL(trace) << "get_print_info: dismiss"; + start_ssdp(false); + m_dismiss = true; + + if (m_refresh_timer) { + m_refresh_timer->Stop(); + } + if (get_print_info_thread) { + if (get_print_info_thread->joinable()) { + get_print_info_thread->join(); + delete get_print_info_thread; + get_print_info_thread = nullptr; + } + } + + wxCommandEvent event(EVT_FINISHED_UPDATE_MACHINE_LIST); + event.SetEventObject(this); + wxPostEvent(this, event); +} + +bool SelectMachinePopup::ProcessLeftDown(wxMouseEvent &event) { + return PopupWindow::ProcessLeftDown(event); +} + +bool SelectMachinePopup::Show(bool show) { + if (show) { + for (int i = 0; i < m_user_list_machine_panel.size(); i++) { + m_user_list_machine_panel[i]->mPanel->update_machine_info(nullptr); + m_user_list_machine_panel[i]->mPanel->Hide(); + } + + for (int j = 0; j < m_other_list_machine_panel.size(); j++) { + m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr); + m_other_list_machine_panel[j]->mPanel->Hide(); + } + } + return PopupWindow::Show(show); +} + +wxWindow *SelectMachinePopup::create_title_panel(wxString text) +{ + auto m_panel_title_own = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL); + m_panel_title_own->SetBackgroundColour(*wxWHITE); + + wxBoxSizer *m_sizer_title_own = new wxBoxSizer(wxHORIZONTAL); + + auto m_title_own = new wxStaticText(m_panel_title_own, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, 0); + m_title_own->SetForegroundColour(wxColour(147,147,147)); + m_title_own->Wrap(-1); + m_sizer_title_own->Add(m_title_own, 0, wxALIGN_CENTER, 0); + + wxBoxSizer *m_sizer_line_own = new wxBoxSizer(wxHORIZONTAL); + + auto m_panel_line_own = new wxPanel(m_panel_title_own, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_ITEM_SIZE.x, FromDIP(1)), wxTAB_TRAVERSAL); + m_panel_line_own->SetBackgroundColour(SELECT_MACHINE_GREY400); + + m_sizer_line_own->Add(m_panel_line_own, 0, wxALIGN_CENTER, 0); + m_sizer_title_own->Add(0, 0, 0, wxLEFT, FromDIP(10)); + m_sizer_title_own->Add(m_sizer_line_own, 1, wxEXPAND | wxRIGHT, FromDIP(10)); + + m_panel_title_own->SetSizer(m_sizer_title_own); + m_panel_title_own->Layout(); + return m_panel_title_own; +} + +void SelectMachinePopup::on_timer(wxTimerEvent &event) +{ + BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup on_timer"; + wxGetApp().reset_to_active(); + wxCommandEvent user_event(EVT_UPDATE_USER_MACHINE_LIST); + user_event.SetEventObject(this); + wxPostEvent(this, user_event); +} + +void SelectMachinePopup::update_other_devices() +{ + DeviceManager* dev = wxGetApp().getDeviceManager(); + if (!dev) return; + m_free_machine_list = dev->get_local_machine_list(); + + BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices start"; + this->Freeze(); + m_scrolledWindow->Freeze(); + int i = 0; + + for (auto &elem : m_free_machine_list) { + MachineObject * mobj = elem.second; + /* do not show printer bind state is empty */ + if (!mobj->is_avaliable()) continue; + + if (!wxGetApp().is_user_login() && !mobj->is_lan_mode_printer()) + continue; + + /* do not show printer in my list */ + auto it = m_bind_machine_list.find(mobj->dev_id); + if (it != m_bind_machine_list.end()) + continue; + + MachineObjectPanel* op = nullptr; + if (i < m_other_list_machine_panel.size()) { + op = m_other_list_machine_panel[i]->mPanel; + } else { + op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); + MachinePanel* mpanel = new MachinePanel(); + mpanel->mIndex = wxString::Format("%d", i); + mpanel->mPanel = op; + m_other_list_machine_panel.push_back(mpanel); + m_sizer_other_devices->Add(op, 0, wxEXPAND, 0); + } +#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) + if (!search_for_printer(mobj)) { + op->Hide(); + } + else { + op->Show(); + } +#else + op->Show(); +#endif + i++; + + op->update_machine_info(mobj); + + if (mobj->is_lan_mode_printer()) { + if (mobj->has_access_right()) { + op->set_printer_state(PrinterState::IN_LAN); + } else { + op->set_printer_state(PrinterState::LOCK); + } + } else { + op->show_edit_printer_name(false); + op->show_printer_bind(true, PrinterBindState::ALLOW_BIND); + if (mobj->is_in_printing()) { + op->set_printer_state(PrinterState::BUSY); + } else { + op->SetToolTip(_L("Online")); + op->set_printer_state(IDLE); + } + } + + op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { + if (mobj) { + if (mobj->is_lan_mode_printer()) { + ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); + dlg.set_machine_object(mobj); + if (dlg.ShowModal() == wxID_OK) { + wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); + } + } + } + }); + + op->Bind(EVT_BIND_MACHINE, [this, mobj](wxCommandEvent &e) { + BindMachineDialog dlg; + dlg.update_machine_info(mobj); + int dlg_result = wxID_CANCEL; + dlg_result = dlg.ShowModal(); + if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); } + }); + } + + for (int j = i; j < m_other_list_machine_panel.size(); j++) { + m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr); + m_other_list_machine_panel[j]->mPanel->Hide(); + } + + if (m_placeholder_panel != nullptr) { + m_scrolledWindow->RemoveChild(m_placeholder_panel); + m_placeholder_panel->Destroy(); + m_placeholder_panel = nullptr; + } + + m_placeholder_panel = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxSize(-1,FromDIP(26))); + wxBoxSizer* placeholder_sizer = new wxBoxSizer(wxVERTICAL); + + m_hyperlink = new wxHyperlinkCtrl(m_placeholder_panel, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + placeholder_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); + + + m_placeholder_panel->SetSizer(placeholder_sizer); + m_placeholder_panel->Layout(); + placeholder_sizer->Fit(m_placeholder_panel); + + m_placeholder_panel->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); + m_sizer_other_devices->Add(m_placeholder_panel, 0, wxEXPAND, 0); + + //m_sizer_other_devices->Layout(); + if(m_other_devices_count != i) { + m_scrolledWindow->Fit(); + } + m_scrolledWindow->Layout(); + m_scrolledWindow->Thaw(); + Layout(); + Fit(); + this->Thaw(); + m_other_devices_count = i; + BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices end"; +} + +void SelectMachinePopup::update_user_devices() +{ + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + + if (!m_print_info.empty()) { + dev->parse_user_print_info(m_print_info); + m_print_info = ""; + } + + m_bind_machine_list.clear(); + m_bind_machine_list = dev->get_my_machine_list(); + + //sort list + std::vector> user_machine_list; + for (auto& it: m_bind_machine_list) { + user_machine_list.push_back(it); + } + + std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto&b) { + if (a.second && b.second) { + return a.second->dev_name.compare(b.second->dev_name) < 0; + } + return false; + }); + + BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list start"; + this->Freeze(); + m_scrolledWindow->Freeze(); + int i = 0; + + for (auto& elem : user_machine_list) { + MachineObject* mobj = elem.second; + MachineObjectPanel* op = nullptr; + if (i < m_user_list_machine_panel.size()) { + op = m_user_list_machine_panel[i]->mPanel; +#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__) + if (!search_for_printer(mobj)) { + op->Hide(); + } else { + op->Show(); + } +#else + op->Show(); +#endif + } else { + op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); + MachinePanel* mpanel = new MachinePanel(); + mpanel->mIndex = wxString::Format("%d", i); + mpanel->mPanel = op; + m_user_list_machine_panel.push_back(mpanel); + m_sizer_my_devices->Add(op, 0, wxEXPAND, 0); + } + i++; + op->update_machine_info(mobj, true); + //set in lan + if (mobj->is_lan_mode_printer()) { + if (!mobj->is_online()) { + continue; + } + else { + op->show_printer_bind(false, PrinterBindState::NONE); + op->show_edit_printer_name(false); + if (mobj->has_access_right() && mobj->is_avaliable()) { + op->set_printer_state(PrinterState::IN_LAN); + op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); + op->SetToolTip(_L("Online")); + } + else { + op->set_printer_state(PrinterState::LOCK); + } + } + op->Bind(EVT_UNBIND_MACHINE, [this, dev, mobj](wxCommandEvent& e) { + dev->set_selected_machine(""); + if (mobj) { + mobj->set_access_code(""); + mobj->erase_user_access_code(); + } + + MessageDialog msg_wingow(nullptr, _L("Log out successful."), "", wxAPPLY | wxOK); + if (msg_wingow.ShowModal() == wxOK) { return; } + }); + } + else { + op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); + op->Bind(EVT_UNBIND_MACHINE, [this, mobj, dev](wxCommandEvent& e) { + // show_unbind_dialog + UnBindMachineDialog dlg; + dlg.update_machine_info(mobj); + if (dlg.ShowModal() == wxID_OK) { + dev->set_selected_machine(""); + } + }); + + if (!mobj->is_online()) { + op->SetToolTip(_L("Offline")); + op->set_printer_state(PrinterState::OFFLINE); + } + else { + op->show_edit_printer_name(true); + op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND); + if (mobj->is_in_printing()) { + op->SetToolTip(_L("Busy")); + op->set_printer_state(PrinterState::BUSY); + } + else { + op->SetToolTip(_L("Online")); + op->set_printer_state(PrinterState::IDLE); + } + } + } + + op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { + if (mobj) { + if (mobj->is_lan_mode_printer()) { + ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); + dlg.set_machine_object(mobj); + if (dlg.ShowModal() == wxID_OK) { + wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); + } + } + } + }); + + op->Bind(EVT_EDIT_PRINT_NAME, [this, mobj](wxCommandEvent &e) { + EditDevNameDialog dlg; + dlg.set_machine_obj(mobj); + dlg.ShowModal(); + }); + } + + for (int j = i; j < m_user_list_machine_panel.size(); j++) { + m_user_list_machine_panel[j]->mPanel->update_machine_info(nullptr); + m_user_list_machine_panel[j]->mPanel->Hide(); + } + //m_sizer_my_devices->Layout(); + + if (m_my_devices_count != i) { + m_scrolledWindow->Fit(); + } + m_scrolledWindow->Layout(); + m_scrolledWindow->Thaw(); + Layout(); + Fit(); + this->Thaw(); + m_my_devices_count = i; +} + +bool SelectMachinePopup::search_for_printer(MachineObject* obj) +{ + std::string search_text = std::string((m_search_bar->GetValue()).mb_str()); + if (search_text.empty()) { + return true; + } + auto name = obj->dev_name; + auto ip = obj->dev_ip; + auto name_it = name.find(search_text); + auto ip_it = ip.find(search_text); + if ((name_it != std::string::npos)||(ip_it != std::string::npos)) { + return true; + } + + return false; +} + +void SelectMachinePopup::on_dissmiss_win(wxCommandEvent &event) +{ + Dismiss(); +} + +void SelectMachinePopup::update_machine_list(wxCommandEvent &event) +{ + update_user_devices(); + update_other_devices(); + BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list end"; +} + +void SelectMachinePopup::start_ssdp(bool start) +{ + return; + //if (wxGetApp().getAgent()) { wxGetApp().getAgent()->start_discovery(true, start); } +} + +void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) +{ + auto mouse_pos = ClientToScreen(event.GetPosition()); + auto wxscroll_win_pos = m_scrolledWindow->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > wxscroll_win_pos.x && mouse_pos.y > wxscroll_win_pos.y && mouse_pos.x < (wxscroll_win_pos.x + m_scrolledWindow->GetSize().x) && + mouse_pos.y < (wxscroll_win_pos.y + m_scrolledWindow->GetSize().y)) { + + for (MachinePanel* p : m_user_list_machine_panel) { + auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { + wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(p->mPanel); + wxPostEvent(p->mPanel, event); + } + } + + for (MachinePanel* p : m_other_list_machine_panel) { + auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { + wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(p->mPanel); + wxPostEvent(p->mPanel, event); + } + } + + //pin code + auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) { + wxGetApp().popup_ping_bind_dialog(); + } + + //bind with access code + auto dc_rect = m_panel_direct_connection->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > dc_rect.x && mouse_pos.y > dc_rect.y && mouse_pos.x < (dc_rect.x + m_panel_direct_connection->GetSize().x) && mouse_pos.y < (dc_rect.y + m_panel_direct_connection->GetSize().y)) { + InputIpAddressDialog dlgo; + dlgo.ShowModal(); + } + + //hyper link + auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) { + wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer")); + } + } +} + +EditDevNameDialog::EditDevNameDialog(Plater *plater /*= nullptr*/) + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Modifying the device name"), 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), wxTAB_TRAVERSAL); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(38)); + m_textCtr = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(260), FromDIP(40)), wxTE_PROCESS_ENTER); + m_textCtr->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(22))); + m_textCtr->SetMinSize(wxSize(FromDIP(260), FromDIP(40))); + m_sizer_main->Add(m_textCtr, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, FromDIP(40)); + + m_static_valid = new wxStaticText(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0); + m_static_valid->Wrap(-1); + m_static_valid->SetFont(::Label::Body_13); + m_static_valid->SetForegroundColour(wxColour(255, 111, 0)); + m_sizer_main->Add(m_static_valid, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, FromDIP(10)); + + + m_button_confirm = new Button(this, _L("Confirm")); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(0, 174, 66), StateColor::Normal)); + m_button_confirm->SetBackgroundColor(btn_bg_green); + m_button_confirm->SetBorderColor(wxColour(0, 174, 66)); + m_button_confirm->SetTextColor(wxColour(255, 255, 255)); + m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24))); + m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24))); + m_button_confirm->SetCornerRadius(FromDIP(12)); + m_button_confirm->Bind(wxEVT_BUTTON, &EditDevNameDialog::on_edit_name, this); + + m_sizer_main->Add(m_button_confirm, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(10)); + m_sizer_main->Add(0, 0, 0, wxBOTTOM, FromDIP(38)); + + SetSizer(m_sizer_main); + Layout(); + Fit(); + Centre(wxBOTH); + wxGetApp().UpdateDlgDarkUI(this); +} + +EditDevNameDialog::~EditDevNameDialog() {} + +void EditDevNameDialog::set_machine_obj(MachineObject *obj) +{ + m_info = obj; + if (m_info) + m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->dev_name)); +} + +void EditDevNameDialog::on_dpi_changed(const wxRect &suggested_rect) +{ + m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24))); + m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24))); +} + +void EditDevNameDialog::on_edit_name(wxCommandEvent &e) +{ + m_static_valid->SetLabel(wxEmptyString); + auto m_valid_type = Valid; + wxString info_line; + auto new_dev_name = m_textCtr->GetTextCtrl()->GetValue(); + + const char * unusable_symbols = "<>[]:/\\|?*\""; + const std::string unusable_suffix = PresetCollection::get_suffix_modified(); + + for (size_t i = 0; i < std::strlen(unusable_symbols); i++) { + if (new_dev_name.find_first_of(unusable_symbols[i]) != std::string::npos) { + info_line = _L("Name is invalid;") + _L("illegal characters:") + " " + unusable_symbols; + m_valid_type = NoValid; + break; + } + } + + if (m_valid_type == Valid && new_dev_name.find(unusable_suffix) != std::string::npos) { + info_line = _L("Name is invalid;") + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified()); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_dev_name.empty()) { + info_line = _L("The name is not allowed to be empty."); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_dev_name.find_first_of(' ') == 0) { + info_line = _L("The name is not allowed to start with space character."); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_dev_name.find_last_of(' ') == new_dev_name.length() - 1) { + info_line = _L("The name is not allowed to end with space character."); + m_valid_type = NoValid; + } + + if (m_valid_type == NoValid) { + m_static_valid->SetLabel(info_line); + Layout(); + } + + if (m_valid_type == Valid) { + m_static_valid->SetLabel(wxEmptyString); + DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + auto utf8_str = new_dev_name.ToUTF8(); + auto name = std::string(utf8_str.data(), utf8_str.length()); + if (m_info) + dev->modify_device_name(m_info->dev_id, name); + } + DPIDialog::EndModal(wxID_CLOSE); + } +} + + PinCodePanel::PinCodePanel(wxWindow* parent, int type, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/) + { + wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE); + Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this); + SetSize(SELECT_MACHINE_ITEM_SIZE); + SetMaxSize(SELECT_MACHINE_ITEM_SIZE); + SetMinSize(SELECT_MACHINE_ITEM_SIZE); + + m_type = type; + this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this); + this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this); + this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this); + } + + void PinCodePanel::OnPaint(wxPaintEvent& event) + { + wxPaintDC dc(this); + render(dc); + } + + void PinCodePanel::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 PinCodePanel::doRender(wxDC& dc) + { + auto size = GetSize(); + + //m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); + + m_bitmap = ScalableBitmap(this, wxGetApp().dark_mode() ? "bind_device_ping_code_dark" : "bind_device_ping_code_light", 10); + + dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2)); + dc.SetFont(::Label::Head_13); + dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); + wxString txt; + if (m_type == 0) {txt = _L("Bind with Pin Code");} + else if (m_type == 1) {txt = _L("Bind with Access Code");} + + auto txt_size = dc.GetTextExtent(txt); + dc.DrawText(txt, wxPoint(FromDIP(28), (size.y - txt_size.y) / 2)); + + if (m_hover) { + dc.SetPen(SELECT_MACHINE_BRAND); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + } + } + + void PinCodePanel::on_mouse_enter(wxMouseEvent& evt) + { + m_hover = true; + Refresh(); + } + + void PinCodePanel::on_mouse_leave(wxMouseEvent& evt) + { + m_hover = false; + Refresh(); + } + + void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt) + { + if (m_type == 0) { + if (wxGetApp().getAgent() && wxGetApp().getAgent()->is_user_login()){ + wxGetApp().popup_ping_bind_dialog(); + } + else{ + auto m_confirm_login_dlg = new SecondaryCheckDialog(nullptr, wxID_ANY, _L("Bind with Pin Code"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, wxDefaultPosition); + m_confirm_login_dlg->SetSize(wxSize(FromDIP(270), FromDIP(158))); + m_confirm_login_dlg->update_text(_L("Please log in before binding your device with a PIN code.\nAlternatively, you can use LAN mode to bind your device. Learn about LAN mode.")); + m_confirm_login_dlg->update_btn_label(_L("Go to Login"), _L("")); + m_confirm_login_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) { + //m_confirm_login_dlg->on_hide(); + wxGetApp().request_login(); + return; + }); + m_confirm_login_dlg->on_show(); + } + } + else if (m_type == 1) { + InputIpAddressDialog dlgo; + dlgo.ShowModal(); + } + } + + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachinePop.hpp b/src/slic3r/GUI/SelectMachinePop.hpp new file mode 100644 index 000000000..854c40834 --- /dev/null +++ b/src/slic3r/GUI/SelectMachinePop.hpp @@ -0,0 +1,233 @@ +#ifndef slic3r_GUI_SelectMachinePop_hpp_ +#define slic3r_GUI_SelectMachinePop_hpp_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ReleaseNote.hpp" +#include "GUI_Utils.hpp" +#include "wxExtensions.hpp" +#include "DeviceManager.hpp" +#include "Plater.hpp" +#include "BBLStatusBar.hpp" +#include "BBLStatusBarSend.hpp" +#include "Widgets/Label.hpp" +#include "Widgets/Button.hpp" +#include "Widgets/CheckBox.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/ScrolledWindow.hpp" +#include "Widgets/PopupWindow.hpp" +#include +#include + +namespace Slic3r { namespace GUI { + +enum PrinterState { + OFFLINE, + IDLE, + BUSY, + LOCK, + IN_LAN +}; + +enum PrinterBindState { + NONE, + ALLOW_BIND, + ALLOW_UNBIND +}; + +wxDECLARE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); +wxDECLARE_EVENT(EVT_WILL_DISMISS_MACHINE_LIST, wxCommandEvent); +wxDECLARE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); +wxDECLARE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); +wxDECLARE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); +wxDECLARE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); +wxDECLARE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); +wxDECLARE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); + +#define SELECT_MACHINE_POPUP_SIZE wxSize(FromDIP(216), FromDIP(364)) +#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(212), FromDIP(360)) +#define SELECT_MACHINE_ITEM_SIZE wxSize(FromDIP(190), FromDIP(35)) +#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48) +#define SELECT_MACHINE_GREY600 wxColour(144, 144, 144) +#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206) +#define SELECT_MACHINE_BRAND wxColour(0, 174, 66) +#define SELECT_MACHINE_REMIND wxColour(255, 111, 0) +#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231) + +class MachineObjectPanel : public wxPanel +{ +private: + bool m_is_my_devices {false}; + bool m_show_edit{false}; + bool m_show_bind{false}; + bool m_hover {false}; + bool m_is_macos_special_version{false}; + + + PrinterBindState m_bind_state; + PrinterState m_state; + + ScalableBitmap m_unbind_img; + ScalableBitmap m_edit_name_img; + ScalableBitmap m_select_unbind_img; + + ScalableBitmap m_printer_status_offline; + ScalableBitmap m_printer_status_busy; + ScalableBitmap m_printer_status_idle; + ScalableBitmap m_printer_status_lock; + ScalableBitmap m_printer_in_lan; + + MachineObject *m_info; + +protected: + wxStaticBitmap *m_bitmap_info; + wxStaticBitmap *m_bitmap_bind; + +public: + MachineObjectPanel(wxWindow * parent, + wxWindowID id = wxID_ANY, + const wxPoint & pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = wxTAB_TRAVERSAL, + const wxString &name = wxEmptyString); + + ~MachineObjectPanel(); + + void show_bind_dialog(); + void set_printer_state(PrinterState state); + void show_printer_bind(bool show, PrinterBindState state); + void show_edit_printer_name(bool show); + void update_machine_info(MachineObject *info, bool is_my_devices = false); +protected: + void OnPaint(wxPaintEvent &event); + void render(wxDC &dc); + void doRender(wxDC &dc); + void on_mouse_enter(wxMouseEvent &evt); + void on_mouse_leave(wxMouseEvent &evt); + void on_mouse_left_up(wxMouseEvent &evt); +}; + +class MachinePanel +{ +public: + wxString mIndex; + MachineObjectPanel *mPanel; +}; + +class PinCodePanel : public wxPanel +{ +public: + PinCodePanel(wxWindow* parent, + int type, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize); + ~PinCodePanel() {}; + + ScalableBitmap m_bitmap; + bool m_hover{false}; + int m_type{0}; + + void OnPaint(wxPaintEvent& event); + void render(wxDC& dc); + void doRender(wxDC& dc); + + void on_mouse_enter(wxMouseEvent& evt); + void on_mouse_leave(wxMouseEvent& evt); + void on_mouse_left_up(wxMouseEvent& evt); +}; + +class SelectMachinePopup : public PopupWindow +{ +public: + SelectMachinePopup(wxWindow *parent); + ~SelectMachinePopup(); + + // PopupWindow virtual methods are all overridden to log them + virtual void Popup(wxWindow *focus = NULL) wxOVERRIDE; + virtual void OnDismiss() wxOVERRIDE; + virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE; + virtual bool Show(bool show = true) wxOVERRIDE; + + void update_machine_list(wxCommandEvent &event); + void start_ssdp(bool on_off); + bool was_dismiss() { return m_dismiss; } + +private: + int m_my_devices_count{0}; + int m_other_devices_count{0}; + PinCodePanel* m_panel_ping_code{nullptr}; + PinCodePanel* m_panel_direct_connection{nullptr}; + wxWindow* m_placeholder_panel{nullptr}; + wxHyperlinkCtrl* m_hyperlink{nullptr}; + Label* m_ping_code_text{nullptr}; + wxStaticBitmap* m_img_ping_code{nullptr}; + wxBoxSizer * m_sizer_body{nullptr}; + wxBoxSizer * m_sizer_my_devices{nullptr}; + wxBoxSizer * m_sizer_other_devices{nullptr}; + wxBoxSizer * m_sizer_search_bar{nullptr}; + wxSearchCtrl* m_search_bar{nullptr}; + wxScrolledWindow * m_scrolledWindow{nullptr}; + wxWindow * m_panel_body{nullptr}; + wxTimer * m_refresh_timer{nullptr}; + std::vector m_user_list_machine_panel; + std::vector m_other_list_machine_panel; + boost::thread* get_print_info_thread{ nullptr }; + std::shared_ptr m_token = std::make_shared(0); + std::string m_print_info = ""; + bool m_dismiss { false }; + + std::map m_bind_machine_list; + std::map m_free_machine_list; + +private: + void OnLeftUp(wxMouseEvent &event); + void on_timer(wxTimerEvent &event); + + void update_other_devices(); + void update_user_devices(); + bool search_for_printer(MachineObject* obj); + void on_dissmiss_win(wxCommandEvent &event); + wxWindow *create_title_panel(wxString text); +}; + +class EditDevNameDialog : public DPIDialog +{ +public: + EditDevNameDialog(Plater *plater = nullptr); + ~EditDevNameDialog(); + + void set_machine_obj(MachineObject *obj); + void on_dpi_changed(const wxRect &suggested_rect) override; + void on_edit_name(wxCommandEvent &e); + + Button* m_button_confirm{nullptr}; + TextInput* m_textCtr{nullptr}; + wxStaticText* m_static_valid{nullptr}; + MachineObject* m_info{nullptr}; +}; + +}} // namespace Slic3r::GUI + +#endif diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 207ae2271..26c19f666 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -1318,7 +1318,7 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess print_job->set_calibration_task(true); print_job->has_sdcard = obj_->has_sdcard(); - print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true); + print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, 0, 0, 0); print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name); { // after send: record the print job diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp index 99cee59ee..8d124aa84 100644 --- a/src/slic3r/Utils/bambu_networking.hpp +++ b/src/slic3r/Utils/bambu_networking.hpp @@ -229,6 +229,9 @@ struct PrintParams { bool task_use_ams; std::string task_bed_type; std::string extra_options; + int auto_bed_leveling{0}; + int auto_flow_cali{0}; + int auto_offset_cali{0}; }; struct TaskQueryParams