diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index cd22de6ef0..ec1fce8996 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -440,6 +440,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 9a16c13322..8fa07b924f 100644 --- a/src/slic3r/GUI/CalibrationPanel.cpp +++ b/src/slic3r/GUI/CalibrationPanel.cpp @@ -4,11 +4,13 @@ #include "MainFrame.hpp" #include "CalibrationPanel.hpp" #include "I18N.hpp" +#include "SelectMachine.hpp" +#include "SelectMachinePop.hpp" namespace Slic3r { namespace GUI { #define REFRESH_INTERVAL 1000 - + #define INITIAL_NUMBER_OF_MACHINES 0 #define LIST_REFRESH_INTERVAL 200 #define MACHINE_LIST_REFRESH_INTERVAL 2000 diff --git a/src/slic3r/GUI/CalibrationPanel.hpp b/src/slic3r/GUI/CalibrationPanel.hpp index a993ff2886..eafb380c79 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, 150, 136) -#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/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index 8da56ddc3b..75cf204ac0 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 b77a50893b..f0627712a2 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -30,881 +30,18 @@ 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 -#define LIST_REFRESH_INTERVAL 200 + #define MACHINE_LIST_REFRESH_INTERVAL 2000 #define WRAP_GAP FromDIP(2) 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); - m_hyperlink->SetNormalColour(StateColor::darkModeColorFor("#009789")); - 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) { - AppConfig* config = wxGetApp().app_config; - if (config) { - config->erase_local_machine(mobj->dev_id); - } - - 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") + " / " + _L("PLA Plate"), @@ -912,14 +49,6 @@ static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { _L("Bambu Smooth PEI Plate") + "/" + _L("High temperature Plate"), _L("Bambu Textured PEI Plate")}; -static std::string MachineBedTypeString[BED_TYPE_COUNT] = { - //"auto", - "pc", - "pe", - "pei", - "pte", -}; - void SelectMachineDialog::stripWhiteSpace(std::string& str) { if (str == "") { return; } @@ -937,6 +66,14 @@ void SelectMachineDialog::stripWhiteSpace(std::string& str) } } +static std::string MachineBedTypeString[BED_TYPE_COUNT] = { + //"auto", + "pc", + "pe", + "pei", + "pte", +}; + wxString SelectMachineDialog::format_text(wxString &m_msg) { if (wxGetApp().app_config->get("language") != "zh_CN") {return m_msg; } @@ -956,7 +93,6 @@ wxString SelectMachineDialog::format_text(wxString &m_msg) } return out_txt; } - SelectMachineDialog::SelectMachineDialog(Plater *plater) : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Send print job to"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) , m_plater(plater), m_export_3mf_cancel(false) @@ -996,7 +132,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_basicl_sizer = new wxBoxSizer(wxHORIZONTAL); /*basic info*/ - /*thumbnail*/ auto m_sizer_thumbnail_area = new wxBoxSizer(wxHORIZONTAL); @@ -1014,7 +149,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_thumbnail_area->Add(m_panel_image, 0, wxALIGN_CENTER, 0); m_sizer_thumbnail_area->Layout(); - + /*basic info right*/ auto sizer_basic_right_info = new wxBoxSizer(wxVERTICAL); @@ -1115,8 +250,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_text_bed_type->SetFont(Label::Body_13); /*last & next page*/ - - auto last_plate_sizer = new wxBoxSizer(wxVERTICAL); m_bitmap_last_plate = new wxStaticBitmap(m_basic_panel, wxID_ANY, create_scaled_bitmap("go_last_plate", this, 25), wxDefaultPosition, wxSize(FromDIP(25), FromDIP(25)), 0); m_bitmap_last_plate->Hide(); @@ -1191,7 +324,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_basicl_sizer->Add(m_sizer_thumbnail_area, 0, wxLEFT, 0); m_basicl_sizer->Add(0, 0, 0, wxLEFT, FromDIP(8)); m_basicl_sizer->Add(sizer_basic_right_info, 0, wxLEFT, 0); - + m_basic_panel->SetSizer(m_basicl_sizer); @@ -1239,37 +372,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) sizer_split_filament->Add(m_split_line_filament, 1, wxALIGN_CENTER_VERTICAL, 0); sizer_split_filament->Add(m_sizer_autorefill, 0, wxALIGN_CENTER, 0); - //wxBoxSizer* m_sizer_ams_mapping_tips = new wxBoxSizer(wxHORIZONTAL); - - - - /* ams_mapping_help_icon = new ScalableBitmap(this, "enable_ams", 16); - img_amsmapping_tip = new wxStaticBitmap(this, wxID_ANY, ams_mapping_help_icon->bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - m_sizer_ams_mapping_tips->Add(img_amsmapping_tip, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5)); - - img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - wxPoint img_pos = img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + img_amsmapping_tip->GetRect().height); - m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tutorial_popup.Popup(); - - if (m_mapping_tutorial_popup.ClientToScreen(wxPoint(0, 0)).y < img_pos.y) { - m_mapping_tutorial_popup.Dismiss(); - popup_pos = wxPoint(img_pos.x, img_pos.y - m_mapping_tutorial_popup.GetRect().height); - m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tutorial_popup.Popup(); - } - }); - - img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { - m_mapping_tutorial_popup.Dismiss(); - }); - - - - - m_sizer_filament->Add(m_sizer_ams_mapping_tips, 0, wxALIGN_CENTER|wxLEFT, FromDIP(8));*/ - /*filament area*/ /*1 extruder*/ m_filament_panel = new wxPanel(this, wxID_ANY); @@ -1509,11 +611,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)); @@ -1977,7 +1074,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_) } } sync_ams_mapping_result(m_ams_mapping_result); - return is_valid; + return is_valid; } return true; @@ -2661,7 +1758,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) wxString error_info = Plater::get_slice_warning_string(warning); if (error_info.IsEmpty()) { error_info = wxString::Format("%s\n", warning.msg); - } + } confirm_text.push_back(ConfirmBeforeSendInfo(error_info)); has_slice_warnings = true; @@ -3156,7 +2253,7 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { Material* item = iter->second; - MaterialItem *m = item->item; + MaterialItem *m = item->item; if (item->id == m_current_filament_id) { auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); m->set_ams_info(ams_colour, selection_data_arr[4], ctype, material_cols); @@ -3628,7 +2725,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); @@ -3800,7 +2896,7 @@ bool SelectMachineDialog::has_timelapse_warning() return true; } } - + return false; } @@ -4501,9 +3597,9 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) for (unsigned int r = 0; r < data.height; ++r) { unsigned int rr = (data.height - 1 - r) * data.width; for (unsigned int c = 0; c < data.width; ++c) { - unsigned char* px = (unsigned char*)data.pixels.data() + 4 * (rr + c); - image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); - image.SetAlpha((int)c, (int)r, px[3]); + unsigned char *px = (unsigned char *) data.pixels.data() + 4 * (rr + c); + image.SetRGB((int) c, (int) r, px[0], px[1], px[2]); + image.SetAlpha((int) c, (int) r, px[3]); } } image = image.Rescale(FromDIP(198), FromDIP(198)); @@ -4513,14 +3609,13 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) m_basic_panel->Layout(); m_basic_panel->Fit(); - //disable pei bed - DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + // disable pei bed + DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev_manager) return; - MachineObject* obj_ = dev_manager->get_selected_machine(); + MachineObject *obj_ = dev_manager->get_selected_machine(); update_flow_cali_check(obj_); - - wxSize screenSize = wxGetDisplaySize(); - auto dialogSize = this->GetSize(); + wxSize screenSize = wxGetDisplaySize(); + auto dialogSize = this->GetSize(); #ifdef __WINDOWS__ @@ -4528,7 +3623,7 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) // basic info auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); wxString time; - PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); + PartPlate *plate = m_plater->get_partplate_list().get_curr_plate(); if (plate) { if (plate->get_slice_result()) { time = wxString::Format("%s", short_time(get_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time))); } } @@ -4536,8 +3631,7 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) char weight[64]; if (wxGetApp().app_config->get("use_inches") == "1") { ::sprintf(weight, " %.2f oz", aprint_stats.total_weight * 0.035274); - } - else { + } else { ::sprintf(weight, " %.2f g", aprint_stats.total_weight); } @@ -4558,7 +3652,7 @@ void SelectMachineDialog::set_default_from_sdcard() image = image.Rescale(FromDIP(198), FromDIP(198)); m_thumbnailPanel->set_thumbnail(image); } - + //for black list std::vector materials; std::vector brands; @@ -4586,7 +3680,6 @@ void SelectMachineDialog::set_default_from_sdcard() m_materialList.clear(); m_filaments.clear(); - for (auto i = 0; i < m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size(); i++) { FilamentInfo fo = m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info[i]; @@ -4783,169 +3876,49 @@ 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; - - // clear machine list - - //m_comboBox_printer->Clear(); - 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); - } + std::vector machine_list; + wxArrayString machine_list_name; + std::map option_list; + } } - - - 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/OrcaSlicerTitle.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(0, 137, 123), StateColor::Pressed), std::pair(wxColour(0, 150, 136), StateColor::Normal)); - m_button_confirm->SetBackgroundColor(btn_bg_green); - m_button_confirm->SetBorderColor(wxColour(0, 150, 136)); - 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) @@ -4986,7 +3959,7 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) } void ThumbnailPanel::render(wxDC& dc) { - + if (wxGetApp().dark_mode() && m_brightness_value < SHOW_BACKGROUND_BITMAP_PIXEL_THRESHOLD) { #ifdef __WXMSW__ wxMemoryDC memdc; @@ -5000,95 +3973,11 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) } else dc.DrawBitmap(m_bitmap, 0, 0); - + } ThumbnailPanel::~ThumbnailPanel() {} - 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; - m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); - - 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(); - dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2)); - dc.SetFont(::Label::Head_13); - dc.SetTextForeground(StateColor::darkModeColorFor(wxColour("#262E30"))); // ORCA fix text not visible on dark theme - 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) { - wxGetApp().popup_ping_bind_dialog(); - } - else if (m_type == 1) { - InputIpAddressDialog dlgo; - dlgo.ShowModal(); - } - } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index a31623055f..0c22c4c488 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -45,267 +45,12 @@ namespace Slic3r { namespace GUI { -enum PrinterState { - OFFLINE, - IDLE, - BUSY, - LOCK, - IN_LAN -}; - -enum PrinterBindState { - NONE, - ALLOW_BIND, - ALLOW_UNBIND -}; - +void print_ams_mapping_result(std::vector &result); enum PrintFromType { FROM_NORMAL, FROM_SDCARD_VIEW, }; -enum class CloudTaskNozzleId : int -{ - NOZZLE_RIGHT = 0, - NOZZLE_LEFT = 1, -}; - -enum class ConfigNozzleIdx : int -{ - NOZZLE_LEFT = 0, - NOZZLE_RIGHT = 1, -}; - -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, 150, 136) -#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, @@ -346,7 +91,80 @@ enum PrintDialogStatus { PrintStatusTimelapseWarning }; -std::string get_print_status_info(PrintDialogStatus status); +class Material +{ +public: + int id; + MaterialItem *item; +}; + + +enum class CloudTaskNozzleId : int +{ + NOZZLE_RIGHT = 0, + NOZZLE_LEFT = 1, +}; + +enum class ConfigNozzleIdx : int +{ + NOZZLE_LEFT = 0, + NOZZLE_RIGHT = 1, +}; + + +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)) +#define LIST_REFRESH_INTERVAL 200 +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 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 { @@ -553,6 +371,8 @@ public: bool get_ams_mapping_result(std::string& mapping_array_str, std::string& mapping_array_str2, std::string& ams_mapping_info); bool build_nozzles_info(std::string& nozzles_info); + 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); @@ -563,56 +383,6 @@ public: 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 0000000000..320df17184 --- /dev/null +++ b/src/slic3r/GUI/SelectMachinePop.cpp @@ -0,0 +1,1054 @@ +#include "SelectMachinePop.hpp" +#include "I18N.hpp" + +#include "libslic3r/Utils.hpp" +#include "libslic3r/Thread.hpp" + +#include "slic3r/Utils/WxFontUtils.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, wxDefaultSize, style, name); + + SetSize(SELECT_MACHINE_ITEM_SIZE); + SetMinSize(SELECT_MACHINE_ITEM_SIZE); + SetMaxSize(SELECT_MACHINE_ITEM_SIZE); + + 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); + m_hyperlink->SetNormalColour(StateColor::darkModeColorFor("#009789")); + 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) { + AppConfig* config = wxGetApp().app_config; + if (config) { + config->erase_local_machine(mobj->dev_id); + } + + 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/OrcaSlicerTitle.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(0, 137, 123), StateColor::Pressed), std::pair(wxColour(0, 150, 136), StateColor::Normal)); + m_button_confirm->SetBackgroundColor(btn_bg_green); + m_button_confirm->SetBorderColor(wxColour(0, 150, 136)); + 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); + Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this); + SetSize(SELECT_MACHINE_ITEM_SIZE); + SetMaxSize(SELECT_MACHINE_ITEM_SIZE); + SetMinSize(SELECT_MACHINE_ITEM_SIZE); + + m_type = type; + m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); + + 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(); + dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2)); + dc.SetFont(::Label::Head_13); + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour("#262E30"))); // ORCA fix text not visible on dark theme + 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) { + wxGetApp().popup_ping_bind_dialog(); + } + 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 0000000000..d1a34f9b3a --- /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, 150, 136) +#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