From 15b3fb3a54b5d3a44be16853e06b5eb3ba87e2e9 Mon Sep 17 00:00:00 2001 From: tao wang Date: Fri, 19 Apr 2024 17:40:03 +0800 Subject: [PATCH] FIX:fixed can't popup pinbind win on macos jira:[STUDIO-6895] Change-Id: I664bba78cf27420d736b586df19e3c09c6f8ed21 --- src/slic3r/GUI/BindDialog.cpp | 17 +-- src/slic3r/GUI/GUI_App.cpp | 1 + src/slic3r/GUI/MultiMachineManagerPage.hpp | 2 +- src/slic3r/GUI/SelectMachine.cpp | 118 ++++++++++++++++----- src/slic3r/GUI/SelectMachine.hpp | 22 ++++ src/slic3r/GUI/UserManager.cpp | 2 +- 6 files changed, 119 insertions(+), 43 deletions(-) diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 66fb56f74..6678cde76 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -91,14 +91,14 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) request_bind_panel->SetBackgroundColour(*wxWHITE); binding_panel->SetBackgroundColour(*wxWHITE); - m_status_text = new Label(request_bind_panel, _L("Please Find the ping code in Account page on printer screen,\n and type in the ping code below.")); + m_status_text = new Label(request_bind_panel, _L("Please Find the Pin Code in Account page on printer screen,\n and type in the Pin Code below.")); m_status_text->SetBackgroundColour(*wxWHITE); m_status_text->SetFont(Label::Body_14); m_status_text->SetMaxSize(wxSize(FromDIP(440), -1)); m_status_text->Wrap(FromDIP(440)); m_status_text->SetForegroundColour(wxColour(38, 46, 48)); - m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find pin code?")); + m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find Pin Code?")); m_link_show_ping_code_wiki->SetFont(Label::Body_14); m_link_show_ping_code_wiki->SetBackgroundColour(*wxWHITE); m_link_show_ping_code_wiki->SetForegroundColour(wxColour(31, 142, 234)); @@ -203,14 +203,6 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_button_close->SetCornerRadius(FromDIP(12)); m_sizer_binding_button->Add(m_button_close, 0, wxALIGN_CENTER, 0); - m_button_close->Bind(wxEVT_BUTTON, [this](auto& e) { - wxGetApp().remove_ping_bind_dialog(); - }); - - this->Bind(wxEVT_CLOSE_WINDOW, [this](auto& e) { - wxGetApp().remove_ping_bind_dialog(); - }); - auto sizer_binding = new wxBoxSizer(wxVERTICAL); sizer_binding->Add(0, 0, 0, wxTOP, FromDIP(80)); sizer_binding->Add(m_loading_txt, 0, wxALIGN_CENTER, 0); @@ -292,7 +284,7 @@ void PingCodeBindDialog::on_bind_printer(wxCommandEvent& event) auto result = agent->ping_bind(ping_code.ToStdString()); if(result < 0){ - MessageDialog msg_wingow(nullptr, _L("Log in failed. Please check the pin code."), "", wxAPPLY | wxOK); + MessageDialog msg_wingow(nullptr, _L("Log in failed. Please check the Pin Code."), "", wxAPPLY | wxOK); msg_wingow.ShowModal(); return; } @@ -302,7 +294,7 @@ void PingCodeBindDialog::on_bind_printer(wxCommandEvent& event) void PingCodeBindDialog::on_cancel(wxCommandEvent& event) { - wxGetApp().remove_ping_bind_dialog(); + EndModal(wxCLOSE); } void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) @@ -312,6 +304,7 @@ void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) Refresh(); } + PingCodeBindDialog::~PingCodeBindDialog() { m_button_bind->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); m_button_cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 46d113cdf..8ba43db35 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -6346,6 +6346,7 @@ void GUI_App::popup_ping_bind_dialog() if (m_ping_code_binding_dialog == nullptr) { m_ping_code_binding_dialog = new PingCodeBindDialog(); m_ping_code_binding_dialog->ShowModal(); + remove_ping_bind_dialog(); } } diff --git a/src/slic3r/GUI/MultiMachineManagerPage.hpp b/src/slic3r/GUI/MultiMachineManagerPage.hpp index 9c8798aac..4ddc69ab0 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.hpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.hpp @@ -10,7 +10,7 @@ namespace GUI { #define DEVICE_LEFT_PADDING_LEFT 15 #define DEVICE_LEFT_DEV_NAME 180 #define DEVICE_LEFT_PRO_NAME 180 -#define DEVICE_LEFT_PRO_INFO 250 +#define DEVICE_LEFT_PRO_INFO 280 class MultiMachineItem : public DeviceItem { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 6e2907001..d382ea6ee 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -395,38 +395,11 @@ SelectMachinePopup::SelectMachinePopup(wxWindow *parent) m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); - wxWindow* m_panel_ping_code = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL); - m_panel_ping_code->SetBackgroundColour(*wxWHITE); - - wxBoxSizer* sizer_ping_code = new wxBoxSizer(wxHORIZONTAL); - - m_img_ping_code = new wxStaticBitmap(m_panel_ping_code, wxID_ANY, create_scaled_bitmap("bind_device_ping_code", this, 10), wxDefaultPosition, wxSize(FromDIP(10), FromDIP(10)), 0); - m_img_ping_code->SetBackgroundColour(*wxWHITE); - - m_ping_code_text = new Label(m_panel_ping_code, _L("Bind with Pin Code")); - m_ping_code_text->SetFont(::Label::Head_13); - m_ping_code_text->SetForegroundColour(wxColour(38, 46, 48)); - m_ping_code_text->SetBackgroundColour(*wxWHITE); - - m_panel_ping_code->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - wxGetApp().popup_ping_bind_dialog(); - }); - - m_ping_code_text->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - wxGetApp().popup_ping_bind_dialog(); - }); - - - sizer_ping_code->Add(m_img_ping_code, 0, wxEXPAND, 0); - sizer_ping_code->Add(0, 0, 0, wxLEFT, FromDIP(7)); - sizer_ping_code->Add(m_ping_code_text, 0, wxALIGN_CENTER, 0); - - m_panel_ping_code->SetSizer(sizer_ping_code); - m_panel_ping_code->Layout(); + m_panel_ping_code = new PinCodePanel(m_scrolledWindow, 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 | wxLEFT, FromDIP(8)); + m_sizxer_scrolledWindow->Add(m_panel_ping_code, 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); @@ -898,6 +871,17 @@ void SelectMachinePopup::OnLeftUp(wxMouseEvent &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)) { + /*wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = m_panel_ping_code->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(m_panel_ping_code); + wxPostEvent(m_panel_ping_code, event);*/ + wxGetApp().popup_ping_bind_dialog(); + } + //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)) { @@ -4617,4 +4601,80 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) ThumbnailPanel::~ThumbnailPanel() {} + PinCodePanel::PinCodePanel(wxWindow* parent, 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_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(20), (size.y - m_bitmap.GetBmpSize().y) / 2)); + dc.SetFont(::Label::Head_13); + dc.SetTextForeground(wxColour(38, 46, 48)); + wxString txt = _L("Bind with Pin Code"); + auto txt_size = dc.GetTextExtent(txt); + dc.DrawText(txt, wxPoint(FromDIP(40), (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) + { + wxGetApp().popup_ping_bind_dialog(); + } + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 564e02ee5..280f89b51 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -208,6 +208,27 @@ public: MachineObjectPanel *mPanel; }; +class PinCodePanel : public wxPanel +{ +public: + PinCodePanel(wxWindow* parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize); + ~PinCodePanel() {}; + + ScalableBitmap m_bitmap; + bool m_hover{false}; + + 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; @@ -230,6 +251,7 @@ public: private: int m_my_devices_count{0}; int m_other_devices_count{0}; + PinCodePanel* m_panel_ping_code{nullptr}; wxWindow* m_placeholder_panel{nullptr}; wxHyperlinkCtrl* m_hyperlink{nullptr}; Label* m_ping_code_text{nullptr}; diff --git a/src/slic3r/GUI/UserManager.cpp b/src/slic3r/GUI/UserManager.cpp index a4cfa80b1..29f5f2d13 100644 --- a/src/slic3r/GUI/UserManager.cpp +++ b/src/slic3r/GUI/UserManager.cpp @@ -56,9 +56,9 @@ int UserManager::parse_json(std::string payload) if (!dev) {return -1;} if (GUI::wxGetApp().m_ping_code_binding_dialog && GUI::wxGetApp().m_ping_code_binding_dialog->IsShown()) { + GUI::wxGetApp().m_ping_code_binding_dialog->EndModal(wxCLOSE); GUI::MessageDialog msgdialog(nullptr, _L("Log in successful."), "", wxAPPLY | wxOK); msgdialog.ShowModal(); - GUI::wxGetApp().remove_ping_bind_dialog(); } dev->update_user_machine_list_info(); dev->set_selected_machine(dev_id);