diff --git a/resources/images/print_options_bg.svg b/resources/images/print_options_bg.svg
new file mode 100644
index 000000000..12363aabd
--- /dev/null
+++ b/resources/images/print_options_bg.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index 68b54b17b..298c721b0 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -427,6 +427,8 @@ set(SLIC3R_GUI_SOURCES
GUI/ModelMall.cpp
GUI/SelectMachine.hpp
GUI/SelectMachine.cpp
+ GUI/SelectMachinePop.hpp
+ GUI/SelectMachinePop.cpp
GUI/SendToPrinter.hpp
GUI/SendToPrinter.cpp
GUI/AmsMappingPopup.hpp
diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp
index 858394aee..9f8ab6246 100644
--- a/src/slic3r/GUI/CalibrationPanel.cpp
+++ b/src/slic3r/GUI/CalibrationPanel.cpp
@@ -4,6 +4,8 @@
#include "MainFrame.hpp"
#include "CalibrationPanel.hpp"
#include "I18N.hpp"
+#include "SelectMachine.hpp"
+#include "SelectMachinePop.hpp"
namespace Slic3r { namespace GUI {
diff --git a/src/slic3r/GUI/CalibrationPanel.hpp b/src/slic3r/GUI/CalibrationPanel.hpp
index a1c23e0e6..eafb380c7 100644
--- a/src/slic3r/GUI/CalibrationPanel.hpp
+++ b/src/slic3r/GUI/CalibrationPanel.hpp
@@ -7,16 +7,8 @@
namespace Slic3r { namespace GUI {
-#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48)
-#define SELECT_MACHINE_GREY600 wxColour(144,144,144)
-#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206)
-#define SELECT_MACHINE_BRAND wxColour(0, 174, 66)
-#define SELECT_MACHINE_REMIND wxColour(255,111,0)
-#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231)
-
#define CALI_MODE_COUNT 2
-
wxString get_calibration_type_name(CalibMode cali_mode);
class MObjectPanel : public wxPanel
diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp
index 4446b82d7..7b954d37d 100644
--- a/src/slic3r/GUI/Jobs/PrintJob.cpp
+++ b/src/slic3r/GUI/Jobs/PrintJob.cpp
@@ -250,6 +250,9 @@ void PrintJob::process()
params.task_use_ams = this->task_use_ams;
params.task_bed_type = this->task_bed_type;
params.print_type = this->m_print_type;
+ params.auto_bed_leveling = this->auto_bed_leveling;
+ params.auto_flow_cali = this->auto_flow_cali;
+ params.auto_offset_cali = this->auto_offset_cali;
if (m_print_type == "from_sdcard_view") {
params.dst_file = m_dst_path;
diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp
index b6da50c74..c35d2b3d0 100644
--- a/src/slic3r/GUI/Jobs/PrintJob.hpp
+++ b/src/slic3r/GUI/Jobs/PrintJob.hpp
@@ -82,7 +82,14 @@ public:
bool has_sdcard { false };
bool task_use_ams { true };
- void set_print_config(std::string bed_type, bool bed_leveling, bool flow_cali, bool vabration_cali, bool record_timelapse, bool layer_inspect)
+ int auto_bed_leveling{0};
+ int auto_flow_cali{0};
+ int auto_offset_cali{0};
+
+ void set_print_config(std::string bed_type, bool bed_leveling, bool flow_cali, bool vabration_cali, bool record_timelapse, bool layer_inspect,
+ int auto_bed_levelingt,
+ int auto_flow_calit,
+ int auto_offset_calit)
{
task_bed_type = bed_type;
task_bed_leveling = bed_leveling;
@@ -90,6 +97,10 @@ public:
task_vibration_cali = vabration_cali;
task_record_timelapse = record_timelapse;
task_layer_inspect = layer_inspect;
+
+ auto_bed_leveling = auto_bed_levelingt;
+ auto_flow_cali = auto_flow_calit;
+ auto_offset_cali = auto_offset_calit;
}
int status_range() const override
diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp
index 935ee3397..0f611ef85 100644
--- a/src/slic3r/GUI/Monitor.hpp
+++ b/src/slic3r/GUI/Monitor.hpp
@@ -48,7 +48,7 @@
#include "slic3r/GUI/HMSPanel.hpp"
#include "slic3r/GUI/AmsWidgets.hpp"
#include "Widgets/SideTools.hpp"
-#include "SelectMachine.hpp"
+#include "SelectMachinePop.hpp"
namespace Slic3r {
namespace GUI {
diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp
index ad10aa6dd..db7065788 100644
--- a/src/slic3r/GUI/SelectMachine.cpp
+++ b/src/slic3r/GUI/SelectMachine.cpp
@@ -27,15 +27,8 @@
namespace Slic3r { namespace GUI {
-wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent);
-wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent);
wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent);
wxDEFINE_EVENT(EVT_PRINT_JOB_CANCEL, wxCommandEvent);
-wxDEFINE_EVENT(EVT_BIND_MACHINE, wxCommandEvent);
-wxDEFINE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent);
-wxDEFINE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent);
-wxDEFINE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent);
-wxDEFINE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent);
wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent);
#define INITIAL_NUMBER_OF_MACHINES 0
@@ -46,855 +39,6 @@ wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent);
static wxString task_canceled_text = _L("Task canceled");
-std::string get_print_status_info(PrintDialogStatus status)
-{
- switch(status) {
- case PrintStatusInit:
- return "PrintStatusInit";
- case PrintStatusNoUserLogin:
- return "PrintStatusNoUserLogin";
- case PrintStatusInvalidPrinter:
- return "PrintStatusInvalidPrinter";
- case PrintStatusConnectingServer:
- return "PrintStatusConnectingServer";
- case PrintStatusReading:
- return "PrintStatusReading";
- case PrintStatusReadingFinished:
- return "PrintStatusReadingFinished";
- case PrintStatusReadingTimeout:
- return "PrintStatusReadingTimeout";
- case PrintStatusInUpgrading:
- return "PrintStatusInUpgrading";
- case PrintStatusNeedUpgradingAms:
- return "PrintStatusNeedUpgradingAms";
- case PrintStatusInSystemPrinting:
- return "PrintStatusInSystemPrinting";
- case PrintStatusInPrinting:
- return "PrintStatusInPrinting";
- case PrintStatusDisableAms:
- return "PrintStatusDisableAms";
- case PrintStatusAmsMappingSuccess:
- return "PrintStatusAmsMappingSuccess";
- case PrintStatusAmsMappingInvalid:
- return "PrintStatusAmsMappingInvalid";
- case PrintStatusAmsMappingU0Invalid:
- return "PrintStatusAmsMappingU0Invalid";
- case PrintStatusAmsMappingValid:
- return "PrintStatusAmsMappingValid";
- case PrintStatusAmsMappingByOrder:
- return "PrintStatusAmsMappingByOrder";
- case PrintStatusRefreshingMachineList:
- return "PrintStatusRefreshingMachineList";
- case PrintStatusSending:
- return "PrintStatusSending";
- case PrintStatusSendingCanceled:
- return "PrintStatusSendingCanceled";
- case PrintStatusLanModeNoSdcard:
- return "PrintStatusLanModeNoSdcard";
- case PrintStatusNoSdcard:
- return "PrintStatusNoSdcard";
- case PrintStatusUnsupportedPrinter:
- return "PrintStatusUnsupportedPrinter";
- case PrintStatusTimelapseNoSdcard:
- return "PrintStatusTimelapseNoSdcard";
- case PrintStatusNotSupportedPrintAll:
- return "PrintStatusNotSupportedPrintAll";
- }
- return "unknown";
-}
-
-MachineObjectPanel::MachineObjectPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name)
-{
- wxPanel::Create(parent, id, pos, SELECT_MACHINE_ITEM_SIZE, style, name);
- Bind(wxEVT_PAINT, &MachineObjectPanel::OnPaint, this);
-
- SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
-
- m_unbind_img = ScalableBitmap(this, "unbind", 18);
- m_edit_name_img = ScalableBitmap(this, "edit_button", 18);
- m_select_unbind_img = ScalableBitmap(this, "unbind_selected", 18);
-
- m_printer_status_offline = ScalableBitmap(this, "printer_status_offline", 12);
- m_printer_status_busy = ScalableBitmap(this, "printer_status_busy", 12);
- m_printer_status_idle = ScalableBitmap(this, "printer_status_idle", 12);
- m_printer_status_lock = ScalableBitmap(this, "printer_status_lock", 16);
- m_printer_in_lan = ScalableBitmap(this, "printer_in_lan", 16);
-
- this->Bind(wxEVT_ENTER_WINDOW, &MachineObjectPanel::on_mouse_enter, this);
- this->Bind(wxEVT_LEAVE_WINDOW, &MachineObjectPanel::on_mouse_leave, this);
- this->Bind(wxEVT_LEFT_UP, &MachineObjectPanel::on_mouse_left_up, this);
-
-#ifdef __APPLE__
- wxPlatformInfo platformInfo;
- auto major = platformInfo.GetOSMajorVersion();
- auto minor = platformInfo.GetOSMinorVersion();
- auto micro = platformInfo.GetOSMicroVersion();
-
- //macos 13.1.0
- if (major >= 13 && minor >= 1 && micro >= 0) {
- m_is_macos_special_version = true;
- }
-#endif
-
-}
-
-
-MachineObjectPanel::~MachineObjectPanel() {}
-
-void MachineObjectPanel::show_bind_dialog()
-{
- if (wxGetApp().is_user_login()) {
- BindMachineDialog dlg;
- dlg.update_machine_info(m_info);
- dlg.ShowModal();
- }
-}
-
-void MachineObjectPanel::set_printer_state(PrinterState state)
-{
- m_state = state;
- Refresh();
-}
-
-void MachineObjectPanel::show_edit_printer_name(bool show)
-{
- m_show_edit = show;
- Refresh();
-}
-
-void MachineObjectPanel::show_printer_bind(bool show, PrinterBindState state)
-{
- m_show_bind = show;
- m_bind_state = state;
- Refresh();
-}
-
-void MachineObjectPanel::OnPaint(wxPaintEvent &event)
-{
- wxPaintDC dc(this);
- doRender(dc);
-}
-
-void MachineObjectPanel::render(wxDC &dc)
-{
-#ifdef __WXMSW__
- wxSize size = GetSize();
- wxMemoryDC memdc;
- wxBitmap bmp(size.x, size.y);
- memdc.SelectObject(bmp);
- memdc.Blit({0, 0}, size, &dc, {0, 0});
-
- {
- wxGCDC dc2(memdc);
- doRender(dc2);
- }
-
- memdc.SelectObject(wxNullBitmap);
- dc.DrawBitmap(bmp, 0, 0);
-#else
- doRender(dc);
-#endif
-}
-
-void MachineObjectPanel::doRender(wxDC &dc)
-{
- auto left = 10;
- wxSize size = GetSize();
- dc.SetPen(*wxTRANSPARENT_PEN);
-
- auto dwbitmap = m_printer_status_offline;
- if (m_state == PrinterState::IDLE) { dwbitmap = m_printer_status_idle; }
- if (m_state == PrinterState::BUSY) { dwbitmap = m_printer_status_busy; }
- if (m_state == PrinterState::OFFLINE) { dwbitmap = m_printer_status_offline; }
- if (m_state == PrinterState::LOCK) { dwbitmap = m_printer_status_lock; }
- if (m_state == PrinterState::IN_LAN) { dwbitmap = m_printer_in_lan; }
-
- // dc.DrawCircle(left, size.y / 2, 3);
- dc.DrawBitmap(dwbitmap.bmp(), wxPoint(left, (size.y - dwbitmap.GetBmpSize().y) / 2));
-
- left += dwbitmap.GetBmpSize().x + 8;
- dc.SetFont(Label::Body_13);
- dc.SetBackgroundMode(wxTRANSPARENT);
- dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900));
- wxString dev_name = "";
- if (m_info) {
- dev_name = from_u8(m_info->dev_name);
-
- if (m_state == PrinterState::IN_LAN) {
- dev_name += _L("(LAN)");
- }
- }
- auto sizet = dc.GetTextExtent(dev_name);
- auto text_end = 0;
-
- if (m_show_edit) {
- text_end = size.x - m_unbind_img.GetBmpSize().x - 30;
- }
- else {
- text_end = size.x - m_unbind_img.GetBmpSize().x;
- }
-
- wxString finally_name = dev_name;
- if (sizet.x > (text_end - left)) {
- auto limit_width = text_end - left - dc.GetTextExtent("...").x - 15;
- for (auto i = 0; i < dev_name.length(); i++) {
- auto curr_width = dc.GetTextExtent(dev_name.substr(0, i));
- if (curr_width.x >= limit_width) {
- finally_name = dev_name.substr(0, i) + "...";
- break;
- }
- }
- }
-
- dc.DrawText(finally_name, wxPoint(left, (size.y - sizet.y) / 2));
-
-
- if (m_hover || m_is_macos_special_version) {
-
- if (m_hover && !m_is_macos_special_version) {
- dc.SetPen(SELECT_MACHINE_BRAND);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle(0, 0, size.x, size.y);
- }
-
- if (m_show_bind) {
- if (m_bind_state == ALLOW_UNBIND) {
- left = size.x - m_unbind_img.GetBmpSize().x - 6;
- dc.DrawBitmap(m_unbind_img.bmp(), left, (size.y - m_unbind_img.GetBmpSize().y) / 2);
- }
- }
-
- if (m_show_edit) {
- left = size.x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6;
- dc.DrawBitmap(m_edit_name_img.bmp(), left, (size.y - m_edit_name_img.GetBmpSize().y) / 2);
- }
- }
-
-}
-
-void MachineObjectPanel::update_machine_info(MachineObject *info, bool is_my_devices)
-{
- m_info = info;
- m_is_my_devices = is_my_devices;
- Refresh();
-}
-
-void MachineObjectPanel::on_mouse_enter(wxMouseEvent &evt)
-{
- m_hover = true;
- Refresh();
-}
-
-void MachineObjectPanel::on_mouse_leave(wxMouseEvent &evt)
-{
- m_hover = false;
- Refresh();
-}
-
-void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt)
-{
- if (m_is_my_devices) {
- // show edit
- if (m_show_edit) {
- auto edit_left = GetSize().x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6;
- auto edit_right = edit_left + m_edit_name_img.GetBmpSize().x;
- auto edit_top = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2;
- auto edit_bottom = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2 + m_edit_name_img.GetBmpSize().y;
- if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) {
- wxCommandEvent event(EVT_EDIT_PRINT_NAME);
- event.SetEventObject(this);
- wxPostEvent(this, event);
- return;
- }
- }
- if (m_show_bind) {
- auto left = GetSize().x - m_unbind_img.GetBmpSize().x - 6;
- auto right = left + m_unbind_img.GetBmpSize().x;
- auto top = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2;
- auto bottom = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2 + m_unbind_img.GetBmpSize().y;
-
- if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) {
- wxCommandEvent event(EVT_UNBIND_MACHINE, GetId());
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
- } else {
- if (m_info) {
- wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
- }
- //wxGetApp().mainframe->SetFocus();
- wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST);
- event.SetEventObject(this->GetParent());
- wxPostEvent(this->GetParent(), event);
- }
- return;
- }
- if (m_info && m_info->is_lan_mode_printer()) {
- if (m_info->has_access_right() && m_info->is_avaliable()) {
- wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
- } else {
- wxCommandEvent event(EVT_CONNECT_LAN_PRINT);
- event.SetEventObject(this);
- wxPostEvent(this, event);
- }
- } else {
- wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
- }
- } else {
- if (m_info && m_info->is_lan_mode_printer()) {
- wxCommandEvent event(EVT_CONNECT_LAN_PRINT);
- event.SetEventObject(this);
- wxPostEvent(this, event);
- } else {
- wxCommandEvent event(EVT_BIND_MACHINE);
- event.SetEventObject(this);
- wxPostEvent(this, event);
- }
- }
-
-}
-
-SelectMachinePopup::SelectMachinePopup(wxWindow *parent)
- : PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS), m_dismiss(false)
-{
-#ifdef __WINDOWS__
- SetDoubleBuffered(true);
-#endif //__WINDOWS__
-
-
- SetSize(SELECT_MACHINE_POPUP_SIZE);
- SetMinSize(SELECT_MACHINE_POPUP_SIZE);
- SetMaxSize(SELECT_MACHINE_POPUP_SIZE);
-
- Freeze();
- wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
- SetBackgroundColour(SELECT_MACHINE_GREY400);
-
-
-
- m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
- m_scrolledWindow->SetBackgroundColour(*wxWHITE);
- m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
- m_scrolledWindow->SetScrollRate(0, 5);
- auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
- m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
- m_scrolledWindow->Layout();
- m_sizxer_scrolledWindow->Fit(m_scrolledWindow);
-
-#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
- m_sizer_search_bar = new wxBoxSizer(wxVERTICAL);
- m_search_bar = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_search_bar->SetDescriptiveText(_L("Search"));
- m_search_bar->ShowSearchButton( true );
- m_search_bar->ShowCancelButton( false );
- m_sizer_search_bar->Add( m_search_bar, 1, wxALL| wxEXPAND, 1 );
- m_sizer_main->Add(m_sizer_search_bar, 0, wxALL | wxEXPAND, FromDIP(2));
- m_search_bar->Bind( wxEVT_COMMAND_TEXT_UPDATED, &SelectMachinePopup::update_machine_list, this );
-#endif
- auto own_title = create_title_panel(_L("My Device"));
- m_sizer_my_devices = new wxBoxSizer(wxVERTICAL);
- auto other_title = create_title_panel(_L("Other Device"));
- m_sizer_other_devices = new wxBoxSizer(wxVERTICAL);
-
-
- m_panel_ping_code = new PinCodePanel(m_scrolledWindow, 0, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE);
- m_panel_direct_connection = new PinCodePanel(m_scrolledWindow, 1, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE);
-
- m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15));
- m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0);
- m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0);
- m_sizxer_scrolledWindow->Add(m_panel_direct_connection, 0, wxEXPAND, 0);
- m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15));
- m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0);
-
- m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2));
-
- SetSizer(m_sizer_main);
- Layout();
- Thaw();
-
- #ifdef __APPLE__
- m_scrolledWindow->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this);
- #endif // __APPLE__
-
- m_refresh_timer = new wxTimer();
- m_refresh_timer->SetOwner(this);
- Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachinePopup::update_machine_list, this);
- Bind(wxEVT_TIMER, &SelectMachinePopup::on_timer, this);
- Bind(EVT_DISSMISS_MACHINE_LIST, &SelectMachinePopup::on_dissmiss_win, this);
-}
-
-SelectMachinePopup::~SelectMachinePopup() { delete m_refresh_timer;}
-
-void SelectMachinePopup::Popup(wxWindow *WXUNUSED(focus))
-{
- BOOST_LOG_TRIVIAL(trace) << "get_print_info: start";
- start_ssdp(true);
- if (m_refresh_timer) {
- m_refresh_timer->Stop();
- m_refresh_timer->Start(MACHINE_LIST_REFRESH_INTERVAL);
- }
-
- if (wxGetApp().is_user_login()) {
- if (!get_print_info_thread) {
- get_print_info_thread = new boost::thread(Slic3r::create_thread([this, token = std::weak_ptr(m_token)] {
- NetworkAgent* agent = wxGetApp().getAgent();
- unsigned int http_code;
- std::string body;
- int result = agent->get_user_print_info(&http_code, &body);
- CallAfter([token, this, result, body]() {
- if (token.expired()) {return;}
- if (result == 0) {
- m_print_info = body;
- }
- else {
- m_print_info = "";
- }
- wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST);
- event.SetEventObject(this);
- wxPostEvent(this, event);
- });
- }));
- }
- }
-
- wxPostEvent(this, wxTimerEvent());
- PopupWindow::Popup();
-}
-
-void SelectMachinePopup::OnDismiss()
-{
- BOOST_LOG_TRIVIAL(trace) << "get_print_info: dismiss";
- start_ssdp(false);
- m_dismiss = true;
-
- if (m_refresh_timer) {
- m_refresh_timer->Stop();
- }
- if (get_print_info_thread) {
- if (get_print_info_thread->joinable()) {
- get_print_info_thread->join();
- delete get_print_info_thread;
- get_print_info_thread = nullptr;
- }
- }
-
- wxCommandEvent event(EVT_FINISHED_UPDATE_MACHINE_LIST);
- event.SetEventObject(this);
- wxPostEvent(this, event);
-}
-
-bool SelectMachinePopup::ProcessLeftDown(wxMouseEvent &event) {
- return PopupWindow::ProcessLeftDown(event);
-}
-
-bool SelectMachinePopup::Show(bool show) {
- if (show) {
- for (int i = 0; i < m_user_list_machine_panel.size(); i++) {
- m_user_list_machine_panel[i]->mPanel->update_machine_info(nullptr);
- m_user_list_machine_panel[i]->mPanel->Hide();
- }
-
- for (int j = 0; j < m_other_list_machine_panel.size(); j++) {
- m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
- m_other_list_machine_panel[j]->mPanel->Hide();
- }
- }
- return PopupWindow::Show(show);
-}
-
-wxWindow *SelectMachinePopup::create_title_panel(wxString text)
-{
- auto m_panel_title_own = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL);
- m_panel_title_own->SetBackgroundColour(*wxWHITE);
-
- wxBoxSizer *m_sizer_title_own = new wxBoxSizer(wxHORIZONTAL);
-
- auto m_title_own = new wxStaticText(m_panel_title_own, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, 0);
- m_title_own->Wrap(-1);
- m_sizer_title_own->Add(m_title_own, 0, wxALIGN_CENTER, 0);
-
- wxBoxSizer *m_sizer_line_own = new wxBoxSizer(wxHORIZONTAL);
-
- auto m_panel_line_own = new wxPanel(m_panel_title_own, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_ITEM_SIZE.x, FromDIP(1)), wxTAB_TRAVERSAL);
- m_panel_line_own->SetBackgroundColour(SELECT_MACHINE_GREY400);
-
- m_sizer_line_own->Add(m_panel_line_own, 0, wxALIGN_CENTER, 0);
- m_sizer_title_own->Add(0, 0, 0, wxLEFT, FromDIP(10));
- m_sizer_title_own->Add(m_sizer_line_own, 1, wxEXPAND | wxRIGHT, FromDIP(10));
-
- m_panel_title_own->SetSizer(m_sizer_title_own);
- m_panel_title_own->Layout();
- return m_panel_title_own;
-}
-
-void SelectMachinePopup::on_timer(wxTimerEvent &event)
-{
- BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup on_timer";
- wxGetApp().reset_to_active();
- wxCommandEvent user_event(EVT_UPDATE_USER_MACHINE_LIST);
- user_event.SetEventObject(this);
- wxPostEvent(this, user_event);
-}
-
-void SelectMachinePopup::update_other_devices()
-{
- DeviceManager* dev = wxGetApp().getDeviceManager();
- if (!dev) return;
- m_free_machine_list = dev->get_local_machine_list();
-
- BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices start";
- this->Freeze();
- m_scrolledWindow->Freeze();
- int i = 0;
-
- for (auto &elem : m_free_machine_list) {
- MachineObject * mobj = elem.second;
- /* do not show printer bind state is empty */
- if (!mobj->is_avaliable()) continue;
-
- if (!wxGetApp().is_user_login() && !mobj->is_lan_mode_printer())
- continue;
-
- /* do not show printer in my list */
- auto it = m_bind_machine_list.find(mobj->dev_id);
- if (it != m_bind_machine_list.end())
- continue;
-
- MachineObjectPanel* op = nullptr;
- if (i < m_other_list_machine_panel.size()) {
- op = m_other_list_machine_panel[i]->mPanel;
- } else {
- op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY);
- MachinePanel* mpanel = new MachinePanel();
- mpanel->mIndex = wxString::Format("%d", i);
- mpanel->mPanel = op;
- m_other_list_machine_panel.push_back(mpanel);
- m_sizer_other_devices->Add(op, 0, wxEXPAND, 0);
- }
-#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
- if (!search_for_printer(mobj)) {
- op->Hide();
- }
- else {
- op->Show();
- }
-#else
- op->Show();
-#endif
- i++;
-
- op->update_machine_info(mobj);
-
- if (mobj->is_lan_mode_printer()) {
- if (mobj->has_access_right()) {
- op->set_printer_state(PrinterState::IN_LAN);
- } else {
- op->set_printer_state(PrinterState::LOCK);
- }
- } else {
- op->show_edit_printer_name(false);
- op->show_printer_bind(true, PrinterBindState::ALLOW_BIND);
- if (mobj->is_in_printing()) {
- op->set_printer_state(PrinterState::BUSY);
- } else {
- op->SetToolTip(_L("Online"));
- op->set_printer_state(IDLE);
- }
- }
-
- op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) {
- if (mobj) {
- if (mobj->is_lan_mode_printer()) {
- ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code"));
- dlg.set_machine_object(mobj);
- if (dlg.ShowModal() == wxID_OK) {
- wxGetApp().mainframe->jump_to_monitor(mobj->dev_id);
- }
- }
- }
- });
-
- op->Bind(EVT_BIND_MACHINE, [this, mobj](wxCommandEvent &e) {
- BindMachineDialog dlg;
- dlg.update_machine_info(mobj);
- int dlg_result = wxID_CANCEL;
- dlg_result = dlg.ShowModal();
- if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); }
- });
- }
-
- for (int j = i; j < m_other_list_machine_panel.size(); j++) {
- m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
- m_other_list_machine_panel[j]->mPanel->Hide();
- }
-
- if (m_placeholder_panel != nullptr) {
- m_scrolledWindow->RemoveChild(m_placeholder_panel);
- m_placeholder_panel->Destroy();
- m_placeholder_panel = nullptr;
- }
-
- m_placeholder_panel = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxSize(-1,FromDIP(26)));
- wxBoxSizer* placeholder_sizer = new wxBoxSizer(wxVERTICAL);
-
- m_hyperlink = new wxHyperlinkCtrl(m_placeholder_panel, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
- placeholder_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5);
-
-
- m_placeholder_panel->SetSizer(placeholder_sizer);
- m_placeholder_panel->Layout();
- placeholder_sizer->Fit(m_placeholder_panel);
-
- m_placeholder_panel->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
- m_sizer_other_devices->Add(m_placeholder_panel, 0, wxEXPAND, 0);
-
- //m_sizer_other_devices->Layout();
- if(m_other_devices_count != i) {
- m_scrolledWindow->Fit();
- }
- m_scrolledWindow->Layout();
- m_scrolledWindow->Thaw();
- Layout();
- Fit();
- this->Thaw();
- m_other_devices_count = i;
- BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices end";
-}
-
-void SelectMachinePopup::update_user_devices()
-{
- Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (!dev) return;
-
- if (!m_print_info.empty()) {
- dev->parse_user_print_info(m_print_info);
- m_print_info = "";
- }
-
- m_bind_machine_list.clear();
- m_bind_machine_list = dev->get_my_machine_list();
-
- //sort list
- std::vector> user_machine_list;
- for (auto& it: m_bind_machine_list) {
- user_machine_list.push_back(it);
- }
-
- std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto&b) {
- if (a.second && b.second) {
- return a.second->dev_name.compare(b.second->dev_name) < 0;
- }
- return false;
- });
-
- BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list start";
- this->Freeze();
- m_scrolledWindow->Freeze();
- int i = 0;
-
- for (auto& elem : user_machine_list) {
- MachineObject* mobj = elem.second;
- MachineObjectPanel* op = nullptr;
- if (i < m_user_list_machine_panel.size()) {
- op = m_user_list_machine_panel[i]->mPanel;
-#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
- if (!search_for_printer(mobj)) {
- op->Hide();
- } else {
- op->Show();
- }
-#else
- op->Show();
-#endif
- } else {
- op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY);
- MachinePanel* mpanel = new MachinePanel();
- mpanel->mIndex = wxString::Format("%d", i);
- mpanel->mPanel = op;
- m_user_list_machine_panel.push_back(mpanel);
- m_sizer_my_devices->Add(op, 0, wxEXPAND, 0);
- }
- i++;
- op->update_machine_info(mobj, true);
- //set in lan
- if (mobj->is_lan_mode_printer()) {
- if (!mobj->is_online()) {
- continue;
- }
- else {
- op->show_printer_bind(false, PrinterBindState::NONE);
- op->show_edit_printer_name(false);
- if (mobj->has_access_right() && mobj->is_avaliable()) {
- op->set_printer_state(PrinterState::IN_LAN);
- op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
- op->SetToolTip(_L("Online"));
- }
- else {
- op->set_printer_state(PrinterState::LOCK);
- }
- }
- op->Bind(EVT_UNBIND_MACHINE, [this, dev, mobj](wxCommandEvent& e) {
- dev->set_selected_machine("");
- if (mobj) {
- mobj->set_access_code("");
- mobj->erase_user_access_code();
- }
-
- MessageDialog msg_wingow(nullptr, _L("Log out successful."), "", wxAPPLY | wxOK);
- if (msg_wingow.ShowModal() == wxOK) { return; }
- });
- }
- else {
- op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
- op->Bind(EVT_UNBIND_MACHINE, [this, mobj, dev](wxCommandEvent& e) {
- // show_unbind_dialog
- UnBindMachineDialog dlg;
- dlg.update_machine_info(mobj);
- if (dlg.ShowModal() == wxID_OK) {
- dev->set_selected_machine("");
- }
- });
-
- if (!mobj->is_online()) {
- op->SetToolTip(_L("Offline"));
- op->set_printer_state(PrinterState::OFFLINE);
- }
- else {
- op->show_edit_printer_name(true);
- op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
- if (mobj->is_in_printing()) {
- op->SetToolTip(_L("Busy"));
- op->set_printer_state(PrinterState::BUSY);
- }
- else {
- op->SetToolTip(_L("Online"));
- op->set_printer_state(PrinterState::IDLE);
- }
- }
- }
-
- op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) {
- if (mobj) {
- if (mobj->is_lan_mode_printer()) {
- ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code"));
- dlg.set_machine_object(mobj);
- if (dlg.ShowModal() == wxID_OK) {
- wxGetApp().mainframe->jump_to_monitor(mobj->dev_id);
- }
- }
- }
- });
-
- op->Bind(EVT_EDIT_PRINT_NAME, [this, mobj](wxCommandEvent &e) {
- EditDevNameDialog dlg;
- dlg.set_machine_obj(mobj);
- dlg.ShowModal();
- });
- }
-
- for (int j = i; j < m_user_list_machine_panel.size(); j++) {
- m_user_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
- m_user_list_machine_panel[j]->mPanel->Hide();
- }
- //m_sizer_my_devices->Layout();
-
- if (m_my_devices_count != i) {
- m_scrolledWindow->Fit();
- }
- m_scrolledWindow->Layout();
- m_scrolledWindow->Thaw();
- Layout();
- Fit();
- this->Thaw();
- m_my_devices_count = i;
-}
-
-bool SelectMachinePopup::search_for_printer(MachineObject* obj)
-{
- std::string search_text = std::string((m_search_bar->GetValue()).mb_str());
- if (search_text.empty()) {
- return true;
- }
- auto name = obj->dev_name;
- auto ip = obj->dev_ip;
- auto name_it = name.find(search_text);
- auto ip_it = ip.find(search_text);
- if ((name_it != std::string::npos)||(ip_it != std::string::npos)) {
- return true;
- }
-
- return false;
-}
-
-void SelectMachinePopup::on_dissmiss_win(wxCommandEvent &event)
-{
- Dismiss();
-}
-
-void SelectMachinePopup::update_machine_list(wxCommandEvent &event)
-{
- update_user_devices();
- update_other_devices();
- BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list end";
-}
-
-void SelectMachinePopup::start_ssdp(bool start)
-{
- return;
- //if (wxGetApp().getAgent()) { wxGetApp().getAgent()->start_discovery(true, start); }
-}
-
-void SelectMachinePopup::OnLeftUp(wxMouseEvent &event)
-{
- auto mouse_pos = ClientToScreen(event.GetPosition());
- auto wxscroll_win_pos = m_scrolledWindow->ClientToScreen(wxPoint(0, 0));
-
- if (mouse_pos.x > wxscroll_win_pos.x && mouse_pos.y > wxscroll_win_pos.y && mouse_pos.x < (wxscroll_win_pos.x + m_scrolledWindow->GetSize().x) &&
- mouse_pos.y < (wxscroll_win_pos.y + m_scrolledWindow->GetSize().y)) {
-
- for (MachinePanel* p : m_user_list_machine_panel) {
- auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0));
- if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) {
- wxMouseEvent event(wxEVT_LEFT_UP);
- auto tag_pos = p->mPanel->ScreenToClient(mouse_pos);
- event.SetPosition(tag_pos);
- event.SetEventObject(p->mPanel);
- wxPostEvent(p->mPanel, event);
- }
- }
-
- for (MachinePanel* p : m_other_list_machine_panel) {
- auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0));
- if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) {
- wxMouseEvent event(wxEVT_LEFT_UP);
- auto tag_pos = p->mPanel->ScreenToClient(mouse_pos);
- event.SetPosition(tag_pos);
- event.SetEventObject(p->mPanel);
- wxPostEvent(p->mPanel, event);
- }
- }
-
- //pin code
- auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0));
- if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) {
- wxGetApp().popup_ping_bind_dialog();
- }
-
- //bind with access code
- auto dc_rect = m_panel_direct_connection->ClientToScreen(wxPoint(0, 0));
- if (mouse_pos.x > dc_rect.x && mouse_pos.y > dc_rect.y && mouse_pos.x < (dc_rect.x + m_panel_direct_connection->GetSize().x) && mouse_pos.y < (dc_rect.y + m_panel_direct_connection->GetSize().y)) {
- InputIpAddressDialog dlgo;
- dlgo.ShowModal();
- }
-
- //hyper link
- auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0));
- if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) {
- wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"));
- }
- }
-}
-
static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = {
//_L("Auto"),
_L("Bambu Cool Plate"),
@@ -913,6 +57,7 @@ static std::string MachineBedTypeString[BED_TYPE_COUNT] = {
"suprtack"
};
+
void SelectMachineDialog::stripWhiteSpace(std::string& str)
{
if (str == "") { return; }
@@ -961,6 +106,13 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
SetDoubleBuffered(true);
#endif //__WINDOWS__
+ ops_auto.left.insert(make_pair("auto", "Auto"));
+ ops_auto.left.insert(make_pair("on", "On"));
+ ops_auto.left.insert(make_pair("off", "Off"));
+
+ ops_no_auto.left.insert(make_pair("on", "On"));
+ ops_no_auto.left.insert(make_pair("off", "Off"));
+
SetMinSize(wxSize(FromDIP(688), -1));
SetMaxSize(wxSize(FromDIP(688), -1));
@@ -1312,51 +464,81 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
//m_filament_right_panel->Hide();
m_filament_panel->Hide();
-
-
-
-
m_statictext_ams_msg = new Label(this, wxEmptyString);
m_statictext_ams_msg->SetMinSize(wxSize(FromDIP(600), -1));
m_statictext_ams_msg->SetMaxSize(wxSize(FromDIP(600), -1));
m_statictext_ams_msg->SetFont(::Label::Body_13);
m_statictext_ams_msg->Hide();
-
-
- /*options*/
+ /*Advanced Options*/
wxBoxSizer* sizer_split_options = new wxBoxSizer(wxHORIZONTAL);
- auto m_stext_options_title = new Label(this, _L("Print Options"));
- m_stext_options_title->SetFont(::Label::Body_14);
- m_stext_options_title->SetForegroundColour(0x909090);
auto m_split_options_line = new wxPanel(this, wxID_ANY);
m_split_options_line->SetBackgroundColour(0xeeeeee);
m_split_options_line->SetSize(wxSize(-1, FromDIP(1)));
m_split_options_line->SetMinSize(wxSize(-1, FromDIP(1)));
m_split_options_line->SetMaxSize(wxSize(-1, FromDIP(1)));
sizer_split_options->Add(0, 0, 0, wxEXPAND, 0);
- sizer_split_options->Add(m_stext_options_title, 0, wxALIGN_CENTER, 0);
- sizer_split_options->Add(m_split_options_line, 1, wxALIGN_CENTER_VERTICAL, 0);
+ sizer_split_options->Add(m_split_options_line, 1, wxALIGN_CENTER, 0);
+
+ wxBoxSizer *sizer_advanced_options_title = new wxBoxSizer(wxHORIZONTAL);
+ auto advanced_options_title = new Label(this, _L("Advanced Options"));
+ advanced_options_title->SetFont(::Label::Body_13);
+ advanced_options_title->SetForegroundColour(wxColour(38, 46, 48));
+ sizer_advanced_options_title->Add(0, 0, 1, wxEXPAND, 0);
+ sizer_advanced_options_title->Add(advanced_options_title, 0, wxRIGHT, 0);
+
+ m_sizer_options = new wxBoxSizer(wxVERTICAL);
- m_sizer_options = new wxBoxSizer(wxHORIZONTAL);
- select_bed = create_item_checkbox(_L("Bed Leveling"), this, _L("Bed Leveling"), "bed_leveling");
- select_flow = create_item_checkbox(_L("Flow Dynamics Calibration"), this, _L("Flow Dynamics Calibration"), "flow_cali");
- select_timelapse = create_item_checkbox(_L("Timelapse"), this, _L("Timelapse"), "timelapse");
- select_use_ams = create_ams_checkbox(_L("Enable AMS"), this, _L("Enable AMS"));
+ auto option_timelapse = new PrintOption(this, _L("Timelapse"), wxEmptyString, ops_no_auto, "timelapse");
- m_sizer_options->Add(select_bed, 0, wxLEFT | wxRIGHT, WRAP_GAP);
- m_sizer_options->Add(select_flow, 0, wxLEFT | wxRIGHT, WRAP_GAP);
- m_sizer_options->Add(select_timelapse, 0, wxLEFT | wxRIGHT, WRAP_GAP);
- m_sizer_options->Add(select_use_ams, 0, wxLEFT | wxRIGHT, WRAP_GAP);
+ auto option_auto_bed_level = new PrintOption(
+ this,
+ _L("Auto Bed Leveling"),
+ _L("Check heatbed flatness. Leveling makes extruded height uniform.\n*Automatic mode: Level first (about 10 seconds). Skip if surface is fine."),
+ ops_auto,
+ "bed_leveling"
+ );
- select_bed->Show(false);
- select_flow->Show(false);
- select_timelapse->Show(false);
- select_use_ams->Show(false);
+ auto option_flow_dynamics_cali = new PrintOption(
+ this,
+ _L("Flow Dynamics Calibration"),
+ _L("Find the best coefficient for dynamic flow calibration to enhance print quality.\n*Automatic mode: Skip if the filament was calibrated recently."),
+ ops_auto,
+ "flow_cali"
+ );
- m_sizer_options->Layout();
+ auto option_nozzle_offset_cali_cali = new PrintOption(
+ this,
+ _L("Nozzle Offset Calibration"),
+ _L("Calibrate nozzle offsets to enhance print quality.\n*Automatic mode: Check for calibration before printing; skip if unnecessary."),
+ ops_auto
+ );
+ auto option_use_ams = new PrintOption(
+ this,
+ _L("Use AMS"),
+ _L("Calibrate nozzle offsets to enhance print quality.\n*Automatic mode: Check for calibration before printing; skip if unnecessary."),
+ ops_no_auto
+ );
+
+ m_sizer_options->Add(option_timelapse, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
+ m_sizer_options->Add(option_auto_bed_level, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
+ m_sizer_options->Add(option_flow_dynamics_cali, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
+ m_sizer_options->Add(option_nozzle_offset_cali_cali, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
+ m_sizer_options->Add(option_use_ams, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
+
+ m_checkbox_list["timelapse"] = option_timelapse;
+ m_checkbox_list["bed_leveling"] = option_auto_bed_level;
+ m_checkbox_list["use_ams"] = option_use_ams;
+ m_checkbox_list["flow_cali"] = option_flow_dynamics_cali;
+ m_checkbox_list["nozzle_offset_cali"] = option_nozzle_offset_cali_cali;
+
+ option_timelapse->Hide();
+ option_auto_bed_level->Hide();
+ option_flow_dynamics_cali->Hide();
+ option_nozzle_offset_cali_cali->Hide();
+ option_use_ams->Hide();
m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_DIALOG_SIMBOOK_SIZE, 0);
@@ -1504,11 +686,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5);
- //m_sizer_scrollable_region->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL, 0);
- //m_basic_panel_sizer->Add(m_sizer_material_area, 0, wxLEFT, FromDIP(10));
-
-
-
m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0);
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(12));
@@ -1519,9 +696,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_sizer_main->Add(m_sizer_filament_2extruder, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(6));
m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15));
- m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(16));
m_sizer_main->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
- m_sizer_main->Add(m_sizer_options, 0, wxLEFT|wxRIGHT, FromDIP(15));
+ m_sizer_main->Add(sizer_advanced_options_title, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
+ m_sizer_main->Add(m_sizer_options, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10));
m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_main->Add(m_sw_print_failed_info, 0, wxALIGN_CENTER, 0);
@@ -1647,165 +824,75 @@ void SelectMachineDialog::popup_filament_backup()
}
}
-wxWindow *SelectMachineDialog::create_ams_checkbox(wxString title, wxWindow *parent, wxString tooltip)
-{
- auto checkbox = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- checkbox->SetBackgroundColour(m_colour_def_color);
-
- wxBoxSizer *sizer_checkbox = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer *sizer_check = new wxBoxSizer(wxVERTICAL);
-
- auto check = new ::CheckBox(checkbox);
-
- sizer_check->Add(check, 0, wxBOTTOM | wxEXPAND | wxTOP, FromDIP(5));
-
- sizer_checkbox->Add(sizer_check, 0, wxEXPAND, FromDIP(5));
- sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(11));
-
- auto text = new wxStaticText(checkbox, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0);
- text->SetFont(::Label::Body_13);
- text->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#323A3C")));
- text->Wrap(-1);
- sizer_checkbox->Add(text, 0, wxALIGN_CENTER, 0);
-
- enable_ams = new ScalableBitmap(this, "enable_ams", 16);
- img_use_ams_tip = new wxStaticBitmap(checkbox, wxID_ANY, enable_ams->bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0);
- sizer_checkbox->Add(img_use_ams_tip, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5));
-
- img_use_ams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
- wxPoint img_pos = img_use_ams_tip->ClientToScreen(wxPoint(0, 0));
- wxPoint popup_pos(img_pos.x, img_pos.y + img_use_ams_tip->GetRect().height);
- m_mapping_tip_popup.Position(popup_pos, wxSize(0, 0));
- m_mapping_tip_popup.Popup();
-
- if (m_mapping_tip_popup.ClientToScreen(wxPoint(0, 0)).y < img_pos.y) {
- m_mapping_tip_popup.Dismiss();
- popup_pos = wxPoint(img_pos.x, img_pos.y - m_mapping_tip_popup.GetRect().height);
- m_mapping_tip_popup.Position(popup_pos, wxSize(0, 0));
- m_mapping_tip_popup.Popup();
- }
- });
-
- img_use_ams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) {
- m_mapping_tip_popup.Dismiss();
- });
-
- checkbox->SetSizer(sizer_checkbox);
- checkbox->Layout();
- sizer_checkbox->Fit(checkbox);
-
- checkbox->SetToolTip(tooltip);
- text->SetToolTip(tooltip);
-
- text->Bind(wxEVT_LEFT_DOWN, [this, check](wxMouseEvent& event) {
- check->SetValue(check->GetValue() ? false : true);
- });
-
- checkbox->Bind(wxEVT_LEFT_DOWN, [this, check](wxMouseEvent& event) {
- check->SetValue(check->GetValue() ? false : true);
- });
-
- m_checkbox_list["use_ams"] = check;
- return checkbox;
-}
-
-wxWindow *SelectMachineDialog::create_item_checkbox(wxString title, wxWindow *parent, wxString tooltip, std::string param)
-{
- auto checkbox = new wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- checkbox->SetBackgroundColour(m_colour_def_color);
-
- wxBoxSizer *sizer_checkbox = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer *sizer_check = new wxBoxSizer(wxVERTICAL);
-
- auto check = new ::CheckBox(checkbox);
-
- sizer_check->Add(check, 0, wxBOTTOM | wxEXPAND | wxTOP, FromDIP(5));
-
- auto text = new wxStaticText(checkbox, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
- text->SetFont(::Label::Body_12);
- text->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#323A3C")));
- text->Wrap(-1);
- text->SetMinSize(wxSize(FromDIP(140), -1));
- text->SetMaxSize(wxSize(FromDIP(140), -1));
-
- sizer_checkbox->Add(sizer_check, 0, wxEXPAND, FromDIP(5));
- sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(7));
- sizer_checkbox->Add(text, 0, wxALIGN_CENTER, 0);
-
- checkbox->SetSizer(sizer_checkbox);
- checkbox->Layout();
- sizer_checkbox->Fit(checkbox);
-
- check->SetToolTip(tooltip);
- text->SetToolTip(tooltip);
-
-
-
- check->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent &e) {
- //if (!m_checkbox_state_list[param]) {return;}
- AppConfig* config = wxGetApp().app_config;
- if (config) {
- if (check->GetValue())
- config->set_str("print", param, "0");
- else
- config->set_str("print", param, "1");
- }
- e.Skip();
- });
-
- checkbox->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent&) {
- //if (!m_checkbox_state_list[param]) {return;}
- check->SetValue(check->GetValue() ? false : true);
- AppConfig* config = wxGetApp().app_config;
- if (config) {
- if (check->GetValue())
- config->set_str("print", param, "1");
- else
- config->set_str("print", param, "0");
- }
- });
-
- text->Bind(wxEVT_LEFT_DOWN, [this, check, param](wxMouseEvent &) {
- //if (!m_checkbox_state_list[param]) {return;}
- check->SetValue(check->GetValue() ? false : true);
- AppConfig* config = wxGetApp().app_config;
- if (config) {
- if (check->GetValue())
- config->set_str("print", param, "1");
- else
- config->set_str("print", param, "0");
- }
- });
-
- //m_checkbox_state_list[param] = true;
- m_checkbox_list[param] = check;
- return checkbox;
-}
-
void SelectMachineDialog::update_select_layout(MachineObject *obj)
{
+ if (m_printer_update_options_layout) {
+ return;
+ }
+
+ // reset checkbox
+ m_checkbox_list["timelapse"]->Hide();
+ m_checkbox_list["bed_leveling"]->Hide();
+ m_checkbox_list["use_ams"]->Hide();
+ m_checkbox_list["flow_cali"]->Hide();
+ m_checkbox_list["nozzle_offset_cali"]->Hide();
+
+ if (obj->is_enable_np) {
+ m_checkbox_list["bed_leveling"]->update_options(ops_auto);
+ m_checkbox_list["flow_cali"]->update_options(ops_auto);
+ }
+ else {
+ m_checkbox_list["bed_leveling"]->update_options(ops_no_auto);
+ m_checkbox_list["flow_cali"]->update_options(ops_auto);
+ }
+
if (obj && obj->is_support_auto_flow_calibration) {
- select_flow->Show();
+ m_checkbox_list["flow_cali"]->Show();
} else {
- select_flow->Hide();
+ m_checkbox_list["flow_cali"]->Hide();
}
if (obj && obj->is_support_auto_leveling) {
- select_bed->Show();
+ m_checkbox_list["bed_leveling"]->Show();
} else {
- select_bed->Hide();
+ m_checkbox_list["bed_leveling"]->Hide();
}
if (obj && obj->is_support_timelapse && is_show_timelapse()) {
- select_timelapse->Show();
+ m_checkbox_list["timelapse"]->Show();
update_timelapse_enable_status();
} else {
- select_timelapse->Hide();
+ m_checkbox_list["timelapse"]->Hide();
}
+ // load checkbox values from app config
+ AppConfig *config = wxGetApp().app_config;
+ if (config && config->get("print", "bed_leveling") == "0") {
+ m_checkbox_list["bed_leveling"]->setValue("off");
+ } else {
+ m_checkbox_list["bed_leveling"]->setValue("on");
+ }
+ if (config && config->get("print", "flow_cali") == "0") {
+ m_checkbox_list["flow_cali"]->setValue("off");
+ } else {
+ m_checkbox_list["flow_cali"]->setValue("on");
+ }
+ if (config && config->get("print", "timelapse") == "0") {
+ m_checkbox_list["timelapse"]->setValue("off");
+ } else {
+ m_checkbox_list["timelapse"]->setValue("on");
+ }
+
+ update_ams_check(obj);
+ update_flow_cali_check(obj);
+
m_sizer_options->Layout();
Layout();
Fit();
+
+ if (obj->is_info_ready() && !m_printer_update_options_layout) {
+ m_printer_update_options_layout = true;
+ }
}
void SelectMachineDialog::prepare_mode(bool refresh_button)
@@ -2354,8 +1441,9 @@ bool SelectMachineDialog::has_tips(MachineObject* obj)
if (!obj) return false;
// must set to a status if return true
- if (select_timelapse->IsShown() &&
- m_checkbox_list["timelapse"]->GetValue()) {
+ if (m_checkbox_list["timelapse"]->IsShown() &&
+ (m_checkbox_list["timelapse"]->getValue() == "on"))
+ {
if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) {
show_status(PrintDialogStatus::PrintStatusTimelapseNoSdcard);
return true;
@@ -2845,7 +1933,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event)
}
}
else if (warning.msg == NOT_SUPPORT_TRADITIONAL_TIMELAPSE) {
- if (obj_->get_printer_arch() == PrinterArch::ARCH_I3 && m_checkbox_list["timelapse"]->GetValue()) {
+ if (obj_->get_printer_arch() == PrinterArch::ARCH_I3 && (m_checkbox_list["timelapse"]->getValue() == "on")) {
confirm_text.push_back(ConfirmBeforeSendInfo(Plater::get_slice_warning_string(warning)));
has_slice_warnings = true;
}
@@ -2908,7 +1996,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event)
}
}
- if (has_prohibited_filament && obj_->has_ams() && m_checkbox_list["use_ams"]->GetValue()) {
+ if (has_prohibited_filament && obj_->has_ams() && (m_checkbox_list["use_ams"]->getValue() == "on")) {
wxString tpu_tips = prohibited_error;
show_errors(tpu_tips);
return;
@@ -3091,7 +2179,7 @@ void SelectMachineDialog::on_send_print()
std::string ams_mapping_array;
std::string ams_mapping_array2;
std::string ams_mapping_info;
- if (m_checkbox_list["use_ams"]->GetValue())
+ if (m_checkbox_list["use_ams"]->getValue() == "on")
get_ams_mapping_result(ams_mapping_array,ams_mapping_array2, ams_mapping_info);
else {
json mapping_info_json = json::array();
@@ -3196,18 +2284,24 @@ void SelectMachineDialog::on_send_print()
m_print_job->has_sdcard = obj_->has_sdcard();
- bool timelapse_option = select_timelapse->IsShown() ? m_checkbox_list["timelapse"]->GetValue() : true;
+ bool timelapse_option = m_checkbox_list["timelapse"]->IsShown()?true:false;
+ if (timelapse_option) {
+ timelapse_option = m_checkbox_list["timelapse"]->getValue() == "on";
+ }
m_print_job->set_print_config(
MachineBedTypeString[0],
- m_checkbox_list["bed_leveling"]->GetValue(),
- m_checkbox_list["flow_cali"]->GetValue(),
+ (m_checkbox_list["bed_leveling"]->getValue() == "on"),
+ (m_checkbox_list["flow_cali"]->getValue() == "on"),
false,
timelapse_option,
- true);
+ true,
+ m_checkbox_list["bed_leveling"]->getValueInt(),
+ m_checkbox_list["flow_cali"]->getValueInt(),
+ m_checkbox_list["nozzle_offset_cali"]->getValueInt());
if (obj_->has_ams()) {
- m_print_job->task_use_ams = m_checkbox_list["use_ams"]->GetValue();
+ m_print_job->task_use_ams = (m_checkbox_list["use_ams"]->getValue() == "on");
} else {
m_print_job->task_use_ams = false;
}
@@ -3423,8 +2517,6 @@ void SelectMachineDialog::update_user_printer()
if (!mobj->is_avaliable()) continue;
if (!mobj->is_online()) continue;
if (!mobj->is_lan_mode_printer()) continue;
- /*if (mobj->is_in_printing()) {op->set_printer_state(PrinterState::BUSY);}*/
-
if (!mobj->has_access_right()) {
option_list[mobj->dev_name] = mobj;
machine_list.push_back(mobj->dev_name);
@@ -3608,15 +2700,15 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event)
MachineObject* obj_ = dev->get_selected_machine();
if(!obj_) return;
- update_ams_check(obj_);
update_select_layout(obj_);
+
if (!obj_
|| obj_->amsList.empty()
|| obj_->ams_exist_bits == 0
|| !obj_->is_support_filament_backup
|| !obj_->is_support_show_filament_backup
|| !obj_->ams_auto_switch_filament_flag
- || !m_checkbox_list["use_ams"]->GetValue() ) {
+ || !(m_checkbox_list["use_ams"]->getValue() == "on")) {
if (m_ams_backup_tip->IsShown()) {
m_ams_backup_tip->Hide();
img_ams_backup->Hide();
@@ -3642,6 +2734,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event)
m_ams_mapping_res = false;
m_ams_mapping_valid = false;
m_ams_mapping_result.clear();
+ m_printer_update_options_layout = false;
auto selection = m_comboBox_printer->GetSelection();
DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
@@ -3681,7 +2774,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event)
// reset the timelapse check status for I3 structure
if (obj->get_printer_arch() == PrinterArch::ARCH_I3) {
- m_checkbox_list["timelapse"]->SetValue(false);
+ m_checkbox_list["timelapse"]->setValue("off");
AppConfig *config = wxGetApp().app_config;
if (config) config->set_str("print", "timelapse", "0");
}
@@ -3716,14 +2809,14 @@ void SelectMachineDialog::update_flow_cali_check(MachineObject* obj)
void SelectMachineDialog::update_ams_check(MachineObject *obj)
{
if (obj && obj->has_ams() && !obj->is_enable_np) {
- select_use_ams->Show();
+ m_checkbox_list["use_ams"]->Show();
if (obj->get_printer_ams_type() == "generic") {
img_use_ams_tip->Show();
} else {
img_use_ams_tip->Hide();
}
}
- if (obj && obj->is_enable_np) { m_checkbox_list["use_ams"]->SetValue(true); }
+ if (obj && obj->is_enable_np) { m_checkbox_list["use_ams"]->setValue("on"); }
}
void SelectMachineDialog::update_show_status()
@@ -3797,7 +2890,6 @@ void SelectMachineDialog::update_show_status()
}
reset_timeout();
- //update_ams_check(obj_);
if (!obj_->is_support_print_all && m_print_plate_idx == PLATE_ALL_IDX) {
show_status(PrintDialogStatus::PrintStatusNotSupportedPrintAll);
@@ -3808,14 +2900,14 @@ void SelectMachineDialog::update_show_status()
// do ams mapping if no ams result
bool clean_ams_mapping = false;
if (m_ams_mapping_result.empty()) {
- if (m_checkbox_list["use_ams"]->GetValue()) {
+ if (m_checkbox_list["use_ams"]->getValue() == "on") {
do_ams_mapping(obj_);
} else {
clean_ams_mapping = true;
}
}
- if (!obj_->has_ams() || !m_checkbox_list["use_ams"]->GetValue()) {
+ if (!obj_->has_ams() || !(m_checkbox_list["use_ams"]->getValue() == "on")) {
clean_ams_mapping = true;
}
@@ -3867,7 +2959,7 @@ void SelectMachineDialog::update_show_status()
}
// no ams
- if (!obj_->has_ams() || !m_checkbox_list["use_ams"]->GetValue()) {
+ if (!obj_->has_ams() || ! (m_checkbox_list["use_ams"]->getValue() == "on")) {
if (!has_tips(obj_)) {
if (has_timelapse_warning()) {
show_status(PrintDialogStatus::PrintStatusTimelapseWarning);
@@ -3879,7 +2971,7 @@ void SelectMachineDialog::update_show_status()
return;
}
- if (!m_checkbox_list["use_ams"]->GetValue()) {
+ if (!(m_checkbox_list["use_ams"]->getValue() == "on")) {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
@@ -4042,13 +3134,13 @@ void SelectMachineDialog::update_timelapse_enable_status()
AppConfig *config = wxGetApp().app_config;
if (!has_timelapse_warning()) {
if (!config || config->get("print", "timelapse") == "0")
- m_checkbox_list["timelapse"]->SetValue(false);
+ m_checkbox_list["timelapse"]->setValue("off");
else
- m_checkbox_list["timelapse"]->SetValue(true);
- select_timelapse->Enable(true);
+ m_checkbox_list["timelapse"]->setValue("on");
+ m_checkbox_list["timelapse"]->Enable(true);
} else {
- m_checkbox_list["timelapse"]->SetValue(false);
- select_timelapse->Enable(false);
+ m_checkbox_list["timelapse"]->setValue("off");
+ m_checkbox_list["timelapse"]->Enable(false);
if (config) { config->set_str("print", "timelapse", "0"); }
}
}
@@ -4166,9 +3258,9 @@ void SelectMachineDialog::on_dpi_changed(const wxRect &suggested_rect)
m_button_ensure->SetCornerRadius(FromDIP(12));
m_status_bar->msw_rescale();
- for (auto checkpire : m_checkbox_list) {
- checkpire.second->Rescale();
- }
+ //for (auto checkpire : m_checkbox_list) {
+ // checkpire.second->Rescale();
+ //}
for (auto material1 : m_materialList) {
material1.second->item->msw_rescale();
@@ -4178,51 +3270,23 @@ void SelectMachineDialog::on_dpi_changed(const wxRect &suggested_rect)
Refresh();
}
-wxImage *SelectMachineDialog::LoadImageFromBlob(const unsigned char *data, int size)
-{
- if (data != NULL) {
- wxMemoryInputStream mi(data, size);
- wxImage * img = new wxImage(mi, wxBITMAP_TYPE_ANY);
- if (img != NULL && img->IsOk()) return img;
- // wxLogDebug( wxT("DB::LoadImageFromBlob error: data=%p size=%d"), data, size);
- // caller is responsible for deleting the pointer
- delete img;
- }
- return NULL;
-}
-
void SelectMachineDialog::set_flow_calibration_state(bool state, bool show_tips)
{
if (!state) {
- m_checkbox_list["flow_cali"]->SetValue(state);
- auto tool_tip = _L("Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface.");
- m_checkbox_list["flow_cali"]->SetToolTip(tool_tip);
+ m_checkbox_list["flow_cali"]->setValue(state ? "on" : "off");
m_checkbox_list["flow_cali"]->Enable();
- for (auto win : select_flow->GetWindowChildren()) {
- win->SetToolTip(tool_tip);
- }
- //select_flow->SetToolTip(tool_tip);
}
else {
AppConfig* config = wxGetApp().app_config;
if (config && config->get("print", "flow_cali") == "0") {
- m_checkbox_list["flow_cali"]->SetValue(false);
+ m_checkbox_list["flow_cali"]->setValue("off");
}
else {
- m_checkbox_list["flow_cali"]->SetValue(true);
+ m_checkbox_list["flow_cali"]->setValue("on");
}
m_checkbox_list["flow_cali"]->Enable();
- for (auto win : select_flow->GetWindowChildren()) {
- win->SetToolTip( _L("Automatic flow calibration using Micro Lidar"));
- }
- }
-
- if (!show_tips) {
- for (auto win : select_flow->GetWindowChildren()) {
- win->SetToolTip(wxEmptyString);
- }
}
}
@@ -4301,37 +3365,6 @@ void SelectMachineDialog::set_default()
show_status(PrintDialogStatus::PrintStatusNoUserLogin);
}
}
- select_bed->Show();
- select_flow->Show();
-
- //reset checkbox
- select_bed->Show(false);
- select_flow->Show(false);
- select_timelapse->Show(false);
- select_use_ams->Show(false);
-
- // load checkbox values from app config
- AppConfig* config = wxGetApp().app_config;
- if (config && config->get("print", "bed_leveling") == "0") {
- m_checkbox_list["bed_leveling"]->SetValue(false);
- }
- else {
- m_checkbox_list["bed_leveling"]->SetValue(true);
- }
- if (config && config->get("print", "flow_cali") == "0") {
- m_checkbox_list["flow_cali"]->SetValue(false);
- }
- else {
- m_checkbox_list["flow_cali"]->SetValue(true);
- }
- if (config && config->get("print", "timelapse") == "0") {
- m_checkbox_list["timelapse"]->SetValue(false);
- }
- else {
- m_checkbox_list["timelapse"]->SetValue(true);
- }
-
- m_checkbox_list["use_ams"]->SetValue(true);
if (m_print_type == PrintFromType::FROM_NORMAL) {
reset_and_sync_ams_list();
@@ -4479,7 +3512,7 @@ void SelectMachineDialog::reset_and_sync_ams_list()
pos.y += item->GetRect().height;
m_mapping_popup.Move(pos);
- if (obj_ && obj_->has_ams() && m_checkbox_list["use_ams"]->GetValue() && obj_->dev_id == m_printer_last_select) {
+ if (obj_ && (m_checkbox_list["use_ams"]->getValue() == "on") && obj_->dev_id == m_printer_last_select) {
m_mapping_popup.set_parent_item(item);
m_mapping_popup.set_current_filament_id(extruder);
m_mapping_popup.set_tag_texture(materials[extruder]);
@@ -4813,8 +3846,6 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data)
DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev_manager) return;
MachineObject* obj_ = dev_manager->get_selected_machine();
- update_flow_cali_check(obj_);
-
wxSize screenSize = wxGetDisplaySize();
auto dialogSize = this->GetSize();
@@ -4922,7 +3953,7 @@ void SelectMachineDialog::set_default_from_sdcard()
if (obj_ &&
obj_->has_ams() &&
- m_checkbox_list["use_ams"]->GetValue() &&
+ (m_checkbox_list["use_ams"]->getValue() == "on") &&
obj_->dev_id == m_printer_last_select)
{
m_mapping_popup.set_parent_item(item);
@@ -5088,7 +4119,6 @@ void SelectMachineDialog::update_lan_machine_list()
if (!mobj->is_avaliable()) continue;
if (!mobj->is_online()) continue;
if (!mobj->is_lan_mode_printer()) continue;
- /*if (mobj->is_in_printing()) {op->set_printer_state(PrinterState::BUSY);}*/
if (mobj->has_access_right()) {
auto b = mobj->dev_name;
@@ -5099,158 +4129,45 @@ void SelectMachineDialog::update_lan_machine_list()
std::vector machine_list;
wxArrayString machine_list_name;
std::map option_list;
-
- // same machine only appear once
-
- /* machine_list = sort_string(machine_list);
- for (auto tt = machine_list.begin(); tt != machine_list.end(); tt++) {
- for (auto it = option_list.begin(); it != option_list.end(); it++) {
- if (it->second->dev_name == *tt) {
- m_list.push_back(it->second);
- wxString dev_name_text = from_u8(it->second->dev_name);
- if (it->second->is_lan_mode_printer()) {
- dev_name_text += "(LAN)";
- }
- machine_list_name.Add(dev_name_text);
- break;
- }
- }
- }
-
- m_comboBox_printer->Set(machine_list_name);
-
- MachineObject* obj = dev->get_selected_machine();
- if (obj) {
- m_printer_last_select = obj->dev_id;
- }
- else {
- m_printer_last_select = "";
- }*/
- //op->set_printer_state(PrinterState::LOCK);
}
}
-
-
-
BOOST_LOG_TRIVIAL(trace) << "SelectMachineDialog update_lan_devices end";
}
-EditDevNameDialog::EditDevNameDialog(Plater *plater /*= nullptr*/)
- : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Modifying the device name"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
+std::string SelectMachineDialog::get_print_status_info(PrintDialogStatus status)
{
- std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str();
- SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO));
-
- SetBackgroundColour(*wxWHITE);
- wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
- auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL);
- m_line_top->SetBackgroundColour(wxColour(166, 169, 170));
- m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0);
- m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(38));
- m_textCtr = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(260), FromDIP(40)), wxTE_PROCESS_ENTER);
- m_textCtr->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(22)));
- m_textCtr->SetMinSize(wxSize(FromDIP(260), FromDIP(40)));
- m_sizer_main->Add(m_textCtr, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, FromDIP(40));
-
- m_static_valid = new wxStaticText(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0);
- m_static_valid->Wrap(-1);
- m_static_valid->SetFont(::Label::Body_13);
- m_static_valid->SetForegroundColour(wxColour(255, 111, 0));
- m_sizer_main->Add(m_static_valid, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, FromDIP(10));
-
-
- m_button_confirm = new Button(this, _L("Confirm"));
- StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(0, 174, 66), StateColor::Normal));
- m_button_confirm->SetBackgroundColor(btn_bg_green);
- m_button_confirm->SetBorderColor(wxColour(0, 174, 66));
- m_button_confirm->SetTextColor(wxColour(255, 255, 255));
- m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24)));
- m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24)));
- m_button_confirm->SetCornerRadius(FromDIP(12));
- m_button_confirm->Bind(wxEVT_BUTTON, &EditDevNameDialog::on_edit_name, this);
-
- m_sizer_main->Add(m_button_confirm, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(10));
- m_sizer_main->Add(0, 0, 0, wxBOTTOM, FromDIP(38));
-
- SetSizer(m_sizer_main);
- Layout();
- Fit();
- Centre(wxBOTH);
- wxGetApp().UpdateDlgDarkUI(this);
+ switch (status) {
+ case PrintStatusInit: return "PrintStatusInit";
+ case PrintStatusNoUserLogin: return "PrintStatusNoUserLogin";
+ case PrintStatusInvalidPrinter: return "PrintStatusInvalidPrinter";
+ case PrintStatusConnectingServer: return "PrintStatusConnectingServer";
+ case PrintStatusReading: return "PrintStatusReading";
+ case PrintStatusReadingFinished: return "PrintStatusReadingFinished";
+ case PrintStatusReadingTimeout: return "PrintStatusReadingTimeout";
+ case PrintStatusInUpgrading: return "PrintStatusInUpgrading";
+ case PrintStatusNeedUpgradingAms: return "PrintStatusNeedUpgradingAms";
+ case PrintStatusInSystemPrinting: return "PrintStatusInSystemPrinting";
+ case PrintStatusInPrinting: return "PrintStatusInPrinting";
+ case PrintStatusDisableAms: return "PrintStatusDisableAms";
+ case PrintStatusAmsMappingSuccess: return "PrintStatusAmsMappingSuccess";
+ case PrintStatusAmsMappingInvalid: return "PrintStatusAmsMappingInvalid";
+ case PrintStatusAmsMappingU0Invalid: return "PrintStatusAmsMappingU0Invalid";
+ case PrintStatusAmsMappingValid: return "PrintStatusAmsMappingValid";
+ case PrintStatusAmsMappingByOrder: return "PrintStatusAmsMappingByOrder";
+ case PrintStatusRefreshingMachineList: return "PrintStatusRefreshingMachineList";
+ case PrintStatusSending: return "PrintStatusSending";
+ case PrintStatusSendingCanceled: return "PrintStatusSendingCanceled";
+ case PrintStatusLanModeNoSdcard: return "PrintStatusLanModeNoSdcard";
+ case PrintStatusNoSdcard: return "PrintStatusNoSdcard";
+ case PrintStatusUnsupportedPrinter: return "PrintStatusUnsupportedPrinter";
+ case PrintStatusTimelapseNoSdcard: return "PrintStatusTimelapseNoSdcard";
+ case PrintStatusNotSupportedPrintAll: return "PrintStatusNotSupportedPrintAll";
+ }
+ return "unknown";
}
-EditDevNameDialog::~EditDevNameDialog() {}
-
-void EditDevNameDialog::set_machine_obj(MachineObject *obj)
-{
- m_info = obj;
- if (m_info)
- m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->dev_name));
-}
-
-void EditDevNameDialog::on_dpi_changed(const wxRect &suggested_rect)
-{
- m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24)));
- m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24)));
-}
-
-void EditDevNameDialog::on_edit_name(wxCommandEvent &e)
-{
- m_static_valid->SetLabel(wxEmptyString);
- auto m_valid_type = Valid;
- wxString info_line;
- auto new_dev_name = m_textCtr->GetTextCtrl()->GetValue();
-
- const char * unusable_symbols = "<>[]:/\\|?*\"";
- const std::string unusable_suffix = PresetCollection::get_suffix_modified();
-
- for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
- if (new_dev_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
- info_line = _L("Name is invalid;") + _L("illegal characters:") + " " + unusable_symbols;
- m_valid_type = NoValid;
- break;
- }
- }
-
- if (m_valid_type == Valid && new_dev_name.find(unusable_suffix) != std::string::npos) {
- info_line = _L("Name is invalid;") + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified());
- m_valid_type = NoValid;
- }
-
- if (m_valid_type == Valid && new_dev_name.empty()) {
- info_line = _L("The name is not allowed to be empty.");
- m_valid_type = NoValid;
- }
-
- if (m_valid_type == Valid && new_dev_name.find_first_of(' ') == 0) {
- info_line = _L("The name is not allowed to start with space character.");
- m_valid_type = NoValid;
- }
-
- if (m_valid_type == Valid && new_dev_name.find_last_of(' ') == new_dev_name.length() - 1) {
- info_line = _L("The name is not allowed to end with space character.");
- m_valid_type = NoValid;
- }
-
- if (m_valid_type == NoValid) {
- m_static_valid->SetLabel(info_line);
- Layout();
- }
-
- if (m_valid_type == Valid) {
- m_static_valid->SetLabel(wxEmptyString);
- DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (dev) {
- auto utf8_str = new_dev_name.ToUTF8();
- auto name = std::string(utf8_str.data(), utf8_str.length());
- if (m_info)
- dev->modify_device_name(m_info->dev_id, name);
- }
- DPIDialog::EndModal(wxID_CLOSE);
- }
-}
ThumbnailPanel::ThumbnailPanel(wxWindow *parent, wxWindowID winid, const wxPoint &pos, const wxSize &size)
: wxPanel(parent, winid, pos, size)
@@ -5310,109 +4227,244 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e)
ThumbnailPanel::~ThumbnailPanel() {}
- PinCodePanel::PinCodePanel(wxWindow* parent, int type, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/)
+ PrintOption::PrintOption(wxWindow *parent, wxString title, wxString tips, boost::bimaps::bimap ops, std::string param)
+ : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
{
- wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE);
- Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this);
- SetSize(SELECT_MACHINE_ITEM_SIZE);
- SetMaxSize(SELECT_MACHINE_ITEM_SIZE);
- SetMinSize(SELECT_MACHINE_ITEM_SIZE);
+#ifdef __WINDOWS__
+ SetDoubleBuffered(true);
+#endif //__WINDOWS__
+ Bind(wxEVT_PAINT, &PrintOption::OnPaint, this);
- m_type = type;
- m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10);
+ if (tips.IsEmpty()) {
+ SetMinSize(wxSize(-1, FromDIP(50)));
+ SetMaxSize(wxSize(-1, FromDIP(50)));
+ }
+ else {
+ SetMinSize(wxSize(-1, FromDIP(90)));
+ SetMaxSize(wxSize(-1, FromDIP(90)));
+ }
- this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this);
- this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this);
- this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this);
+ m_ops = ops;
+ m_param = param;
+
+ SetBackgroundColour(*wxWHITE);
+ wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *top_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+
+ m_printoption_title = new Label(this, title);
+ m_printoption_title->SetFont(Label::Head_13);
+ m_printoption_title->SetBackgroundColour(0xF8F8F8);
+
+ m_printoption_item = new PrintOptionItem(this, m_ops, param);
+
+ top_sizer->Add(m_printoption_title, 0, wxALIGN_CENTER, 0);
+ top_sizer->Add(0, 0, 1, wxEXPAND, 0);
+ top_sizer->Add(m_printoption_item, 0, wxALIGN_CENTER, 0);
+
+ m_label = new Label(this, tips);
+ m_label->SetFont(::Label::Body_13);
+ m_label->SetForegroundColour(0x6B6B6B);
+ m_label->SetBackgroundColour(0xF8F8F8);
+
+ sizer->Add(top_sizer, 1, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, FromDIP(12));
+ sizer->Add(0, 0, 1, wxTOP, FromDIP(4));
+ sizer->Add(m_label, 1, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, FromDIP(12));
+ SetSizer(sizer);
+ Layout();
+ Fit();
}
- void PinCodePanel::OnPaint(wxPaintEvent& event)
+void PrintOption::OnPaint(wxPaintEvent &event)
{
wxPaintDC dc(this);
- render(dc);
- }
-
- void PinCodePanel::render(wxDC& dc)
- {
-#ifdef __WXMSW__
- wxSize size = GetSize();
- wxMemoryDC memdc;
- wxBitmap bmp(size.x, size.y);
- memdc.SelectObject(bmp);
- memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 });
-
- {
- wxGCDC dc2(memdc);
- doRender(dc2);
- }
-
- memdc.SelectObject(wxNullBitmap);
- dc.DrawBitmap(bmp, 0, 0);
-#else
doRender(dc);
+ }
+
+void PrintOption::render(wxDC &dc)
+{
+#ifdef __WXMSW__
+ wxSize size = GetSize();
+ wxMemoryDC memdc;
+ wxBitmap bmp(size.x, size.y);
+ memdc.SelectObject(bmp);
+ memdc.Blit({0, 0}, size, &dc, {0, 0});
+
+ {
+ wxGCDC dc2(memdc);
+ doRender(dc2);
+ }
+
+ memdc.SelectObject(wxNullBitmap);
+ dc.DrawBitmap(bmp, 0, 0);
+#else
+ doRender(dc);
#endif
- }
+}
- void PinCodePanel::doRender(wxDC& dc)
- {
- auto size = GetSize();
+void PrintOption::doRender(wxDC &dc)
+{
+ auto size = GetSize();
+ dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
+ dc.SetBrush(wxBrush(0xF8F8F8));
+ dc.DrawRoundedRectangle(0, 0, size.x, size.y, 5);
+}
- //m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10);
+void PrintOption::setValue(std::string value)
+{
+ m_printoption_item->setValue(value);
+}
- m_bitmap = ScalableBitmap(this, wxGetApp().dark_mode() ? "bind_device_ping_code_dark" : "bind_device_ping_code_light", 10);
+std::string PrintOption::getValue()
+{
+ return m_printoption_item->getValue();
+}
- dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2));
- dc.SetFont(::Label::Head_13);
- dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900));
- wxString txt;
- if (m_type == 0) {txt = _L("Bind with Pin Code");}
- else if (m_type == 1) {txt = _L("Bind with Access Code");}
+int PrintOption::getValueInt()
+{
+ if (m_printoption_item->getValue() == "off") {
+ return 0;
+ } else if (m_printoption_item->getValue() == "on") {
+ return 1;
+ } else if (m_printoption_item->getValue() == "auto") {
+ return 2;
+ } else {
+ return 2;
+ }
+}
- auto txt_size = dc.GetTextExtent(txt);
- dc.DrawText(txt, wxPoint(FromDIP(28), (size.y - txt_size.y) / 2));
+PrintOptionItem::PrintOptionItem(wxWindow *parent, boost::bimaps::bimap ops, std::string param)
+ : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
+{
+#ifdef __WINDOWS__
+ SetDoubleBuffered(true);
+#endif //__WINDOWS__
- if (m_hover) {
- dc.SetPen(SELECT_MACHINE_BRAND);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle(0, 0, size.x, size.y);
- }
- }
+ m_ops = ops;
+ m_param = param;
- void PinCodePanel::on_mouse_enter(wxMouseEvent& evt)
- {
- m_hover = true;
- Refresh();
- }
+ Bind(wxEVT_PAINT, &PrintOptionItem::OnPaint, this);
+ auto width = ops.size() * FromDIP(56) + FromDIP(8);
+ auto height = FromDIP(22) + FromDIP(8);
+ SetMinSize(wxSize(width, height));
+ SetMaxSize(wxSize(width, height));
+ Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_HAND); });
+ Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_ARROW); });
+ Bind(wxEVT_LEFT_DOWN, &PrintOptionItem::on_left_down, this);
- void PinCodePanel::on_mouse_leave(wxMouseEvent& evt)
- {
- m_hover = false;
- Refresh();
- }
+ m_selected_bk = ScalableBitmap(this, "print_options_bg", 22);
+}
- void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt)
- {
- if (m_type == 0) {
- if (wxGetApp().getAgent() && wxGetApp().getAgent()->is_user_login()){
- wxGetApp().popup_ping_bind_dialog();
- }
- else{
- auto m_confirm_login_dlg = new SecondaryCheckDialog(nullptr, wxID_ANY, _L("Bind with Pin Code"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, wxDefaultPosition);
- m_confirm_login_dlg->SetSize(wxSize(FromDIP(270), FromDIP(158)));
- m_confirm_login_dlg->update_text(_L("Please log in before binding your device with a PIN code.\nAlternatively, you can use LAN mode to bind your device. Learn about LAN mode."));
- m_confirm_login_dlg->update_btn_label(_L("Go to Login"), _L(""));
- m_confirm_login_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) {
- //m_confirm_login_dlg->on_hide();
- wxGetApp().request_login();
- return;
- });
- m_confirm_login_dlg->on_show();
- }
- }
- else if (m_type == 1) {
- InputIpAddressDialog dlgo;
- dlgo.ShowModal();
- }
- }
+void PrintOptionItem::OnPaint(wxPaintEvent &event)
+{
+ wxPaintDC dc(this);
+ doRender(dc);
+}
- }} // namespace Slic3r::GUI
+void PrintOptionItem::render(wxDC &dc)
+{
+#ifdef __WXMSW__
+ wxSize size = GetSize();
+ wxMemoryDC memdc;
+ wxBitmap bmp(size.x, size.y);
+ memdc.SelectObject(bmp);
+ memdc.Blit({0, 0}, size, &dc, {0, 0});
+
+ {
+ wxGCDC dc2(memdc);
+ doRender(dc2);
+ }
+
+ memdc.SelectObject(wxNullBitmap);
+ dc.DrawBitmap(bmp, 0, 0);
+#else
+ doRender(dc);
+#endif
+}
+
+void PrintOptionItem::on_left_down(wxMouseEvent &evt)
+{
+ auto pos = ClientToScreen(evt.GetPosition());
+ auto rect = ClientToScreen(wxPoint(0, 0));
+ auto select_size = GetSize().x / m_ops.size();
+
+ int i = 0;
+ for (const auto& entry : m_ops.left) {
+ auto left_edge = rect.x + i * select_size;
+ auto right_edge = rect.x + (i + 1) * select_size;
+
+ if (pos.x > left_edge && pos.x < right_edge) {
+ selected_key = entry.get_left();
+ }
+ i++;
+ }
+ Refresh();
+
+ if (!m_param.empty()) {
+ AppConfig *config = wxGetApp().app_config;
+ if (selected_key == "on") {
+ config->set_str("print", m_param, "1");
+ } else if (selected_key == "off") {
+ config->set_str("print", m_param, "0");
+ }
+ }
+}
+
+void PrintOptionItem::doRender(wxDC &dc)
+{
+ auto size = GetSize();
+ dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
+ dc.SetBrush(wxBrush(0xEBEBEB));
+ dc.DrawRoundedRectangle(0, 0, size.x, size.y, 5);
+
+ auto left = FromDIP(4);
+
+ int selected = 0;
+ for (const auto &entry : m_ops.right) {
+ if (entry.second == selected_key) {
+ break;
+ }
+ selected++;
+ }
+
+ /*selected*/
+ auto selected_left = selected * FromDIP(50) + FromDIP(4);
+ dc.DrawBitmap(m_selected_bk.bmp(), selected_left, FromDIP(4));
+
+ for (auto it = m_ops.begin(); it != m_ops.end(); ++it) {
+ auto text_key = it->get_left();
+ auto text_value = it->get_right();
+ auto text_size = dc.GetTextExtent(text_value);
+
+ auto text_left = left + (FromDIP(50) - text_size.x) / 2;
+ auto text_top = (size.y - text_size.y) / 2;
+
+ if (text_key == selected_key) {
+ dc.SetPen(wxPen(0x00AE42));
+ dc.SetTextForeground(0x00AE42);
+ dc.SetFont(::Label::Head_13);
+ dc.DrawText(text_value, wxPoint(text_left, text_top));
+ }
+ else {
+ dc.SetPen(wxPen(*wxBLACK));
+ dc.SetTextForeground(*wxBLACK);
+ dc.SetFont(::Label::Body_13);
+ dc.DrawText(text_value, wxPoint(text_left, text_top));
+ }
+
+ left += FromDIP(50);
+ }
+}
+
+void PrintOptionItem::setValue(std::string value)
+{
+ selected_key = value;
+ Refresh();
+}
+
+std::string PrintOptionItem::getValue()
+{
+ return selected_key;
+}
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp
index 4be0365e7..cdcd26adc 100644
--- a/src/slic3r/GUI/SelectMachine.hpp
+++ b/src/slic3r/GUI/SelectMachine.hpp
@@ -24,6 +24,7 @@
#include
#include
+#include "boost/bimap/bimap.hpp"
#include "AmsMappingPopup.hpp"
#include "ReleaseNote.hpp"
#include "GUI_Utils.hpp"
@@ -43,255 +44,11 @@
namespace Slic3r { namespace GUI {
-enum PrinterState {
- OFFLINE,
- IDLE,
- BUSY,
- LOCK,
- IN_LAN
-};
-
-enum PrinterBindState {
- NONE,
- ALLOW_BIND,
- ALLOW_UNBIND
-};
-
enum PrintFromType {
FROM_NORMAL,
FROM_SDCARD_VIEW,
};
-static int get_brightness_value(wxImage image) {
-
- wxImage grayImage = image.ConvertToGreyscale();
-
- int width = grayImage.GetWidth();
- int height = grayImage.GetHeight();
-
- int totalLuminance = 0;
- unsigned char alpha;
- int num_none_transparent = 0;
- for (int y = 0; y < height; y += 2) {
-
- for (int x = 0; x < width; x += 2) {
-
- alpha = image.GetAlpha(x, y);
- if (alpha != 0) {
- wxColour pixelColor = grayImage.GetRed(x, y);
- totalLuminance += pixelColor.Red();
- num_none_transparent = num_none_transparent + 1;
- }
- }
- }
- if (totalLuminance <= 0 || num_none_transparent <= 0) {
- return 0;
- }
- return totalLuminance / num_none_transparent;
-}
-
-class Material
-{
-public:
- int id;
- MaterialItem *item;
-};
-
-WX_DECLARE_HASH_MAP(int, Material *, wxIntegerHash, wxIntegerEqual, MaterialHash);
-
-// move to seperate file
-class MachineListModel : public wxDataViewVirtualListModel
-{
-public:
- enum {
- Col_MachineName = 0,
- Col_MachineSN = 1,
- Col_MachineBind = 2,
- Col_MachinePrintingStatus = 3,
- Col_MachineIPAddress = 4,
- Col_MachineConnection = 5,
- Col_MachineTaskName = 6,
- Col_Max = 7
- };
- MachineListModel();
-
- virtual unsigned int GetColumnCount() const wxOVERRIDE { return Col_Max; }
-
- virtual wxString GetColumnType(unsigned int col) const wxOVERRIDE { return "string"; }
-
- virtual void GetValueByRow(wxVariant &variant, unsigned int row, unsigned int col) const wxOVERRIDE;
- virtual bool GetAttrByRow(unsigned int row, unsigned int col, wxDataViewItemAttr &attr) const wxOVERRIDE;
- virtual bool SetValueByRow(const wxVariant &variant, unsigned int row, unsigned int col) wxOVERRIDE;
-
- void display_machines(std::map list);
- void add_machine(MachineObject *obj, bool reset = true);
- int find_row_by_sn(wxString sn);
-
-private:
- wxArrayString m_values[Col_Max];
-
- wxArrayString m_nameColValues;
- wxArrayString m_snColValues;
- wxArrayString m_bindColValues;
- wxArrayString m_connectionColValues;
- wxArrayString m_printingStatusValues;
- wxArrayString m_ipAddressValues;
-};
-
-class MachineObjectPanel : public wxPanel
-{
-private:
- bool m_is_my_devices {false};
- bool m_show_edit{false};
- bool m_show_bind{false};
- bool m_hover {false};
- bool m_is_macos_special_version{false};
-
-
- PrinterBindState m_bind_state;
- PrinterState m_state;
-
- ScalableBitmap m_unbind_img;
- ScalableBitmap m_edit_name_img;
- ScalableBitmap m_select_unbind_img;
-
- ScalableBitmap m_printer_status_offline;
- ScalableBitmap m_printer_status_busy;
- ScalableBitmap m_printer_status_idle;
- ScalableBitmap m_printer_status_lock;
- ScalableBitmap m_printer_in_lan;
-
- MachineObject *m_info;
-
-protected:
- wxStaticBitmap *m_bitmap_info;
- wxStaticBitmap *m_bitmap_bind;
-
-public:
- MachineObjectPanel(wxWindow * parent,
- wxWindowID id = wxID_ANY,
- const wxPoint & pos = wxDefaultPosition,
- const wxSize & size = wxDefaultSize,
- long style = wxTAB_TRAVERSAL,
- const wxString &name = wxEmptyString);
-
- ~MachineObjectPanel();
-
- void show_bind_dialog();
- void set_printer_state(PrinterState state);
- void show_printer_bind(bool show, PrinterBindState state);
- void show_edit_printer_name(bool show);
- void update_machine_info(MachineObject *info, bool is_my_devices = false);
-protected:
- void OnPaint(wxPaintEvent &event);
- void render(wxDC &dc);
- void doRender(wxDC &dc);
- void on_mouse_enter(wxMouseEvent &evt);
- void on_mouse_leave(wxMouseEvent &evt);
- void on_mouse_left_up(wxMouseEvent &evt);
-};
-
-#define SELECT_MACHINE_POPUP_SIZE wxSize(FromDIP(216), FromDIP(364))
-#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(212), FromDIP(360))
-#define SELECT_MACHINE_ITEM_SIZE wxSize(FromDIP(190), FromDIP(35))
-#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48)
-#define SELECT_MACHINE_GREY600 wxColour(144,144,144)
-#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206)
-#define SELECT_MACHINE_BRAND wxColour(0, 174, 66)
-#define SELECT_MACHINE_REMIND wxColour(255,111,0)
-#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231)
-
-class MachinePanel
-{
-public:
- wxString mIndex;
- MachineObjectPanel *mPanel;
-};
-
-class PinCodePanel : public wxPanel
-{
-public:
- PinCodePanel(wxWindow* parent,
- int type,
- wxWindowID winid = wxID_ANY,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize);
- ~PinCodePanel() {};
-
- ScalableBitmap m_bitmap;
- bool m_hover{false};
- int m_type{0};
-
- void OnPaint(wxPaintEvent& event);
- void render(wxDC& dc);
- void doRender(wxDC& dc);
-
- void on_mouse_enter(wxMouseEvent& evt);
- void on_mouse_leave(wxMouseEvent& evt);
- void on_mouse_left_up(wxMouseEvent& evt);
-};
-
-
-class ThumbnailPanel;
-
-class SelectMachinePopup : public PopupWindow
-{
-public:
- SelectMachinePopup(wxWindow *parent);
- ~SelectMachinePopup();
-
- // PopupWindow virtual methods are all overridden to log them
- virtual void Popup(wxWindow *focus = NULL) wxOVERRIDE;
- virtual void OnDismiss() wxOVERRIDE;
- virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE;
- virtual bool Show(bool show = true) wxOVERRIDE;
-
- void update_machine_list(wxCommandEvent &event);
- void start_ssdp(bool on_off);
- bool was_dismiss() { return m_dismiss; }
-
-private:
- int m_my_devices_count{0};
- int m_other_devices_count{0};
- PinCodePanel* m_panel_ping_code{nullptr};
- PinCodePanel* m_panel_direct_connection{nullptr};
- wxWindow* m_placeholder_panel{nullptr};
- wxHyperlinkCtrl* m_hyperlink{nullptr};
- Label* m_ping_code_text{nullptr};
- wxStaticBitmap* m_img_ping_code{nullptr};
- wxBoxSizer * m_sizer_body{nullptr};
- wxBoxSizer * m_sizer_my_devices{nullptr};
- wxBoxSizer * m_sizer_other_devices{nullptr};
- wxBoxSizer * m_sizer_search_bar{nullptr};
- wxSearchCtrl* m_search_bar{nullptr};
- wxScrolledWindow * m_scrolledWindow{nullptr};
- wxWindow * m_panel_body{nullptr};
- wxTimer * m_refresh_timer{nullptr};
- std::vector m_user_list_machine_panel;
- std::vector m_other_list_machine_panel;
- boost::thread* get_print_info_thread{ nullptr };
- std::shared_ptr m_token = std::make_shared(0);
- std::string m_print_info = "";
- bool m_dismiss { false };
-
- std::map m_bind_machine_list;
- std::map m_free_machine_list;
-
-private:
- void OnLeftUp(wxMouseEvent &event);
- void on_timer(wxTimerEvent &event);
-
- void update_other_devices();
- void update_user_devices();
- bool search_for_printer(MachineObject* obj);
- void on_dissmiss_win(wxCommandEvent &event);
- wxWindow *create_title_panel(wxString text);
-};
-
-#define SELECT_MACHINE_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(23))
-#define SELECT_MACHINE_DIALOG_SIMBOOK_SIZE wxSize(FromDIP(370), FromDIP(64))
-
-
enum PrintPageMode {
PrintPageModePrepare = 0,
PrintPageModeSending,
@@ -336,8 +93,117 @@ enum PrintDialogStatus {
PrintStatusMixAmsAndVtSlotWarning
};
+class Material
+{
+public:
+ int id;
+ MaterialItem *item;
+};
-std::string get_print_status_info(PrintDialogStatus status);
+WX_DECLARE_HASH_MAP(int, Material *, wxIntegerHash, wxIntegerEqual, MaterialHash);
+
+#define SELECT_MACHINE_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(23))
+#define SELECT_MACHINE_DIALOG_SIMBOOK_SIZE wxSize(FromDIP(370), FromDIP(64))
+
+static int get_brightness_value(wxImage image) {
+
+ wxImage grayImage = image.ConvertToGreyscale();
+
+ int width = grayImage.GetWidth();
+ int height = grayImage.GetHeight();
+
+ int totalLuminance = 0;
+ unsigned char alpha;
+ int num_none_transparent = 0;
+ for (int y = 0; y < height; y += 2) {
+
+ for (int x = 0; x < width; x += 2) {
+
+ alpha = image.GetAlpha(x, y);
+ if (alpha != 0) {
+ wxColour pixelColor = grayImage.GetRed(x, y);
+ totalLuminance += pixelColor.Red();
+ num_none_transparent = num_none_transparent + 1;
+ }
+ }
+ }
+ if (totalLuminance <= 0 || num_none_transparent <= 0) {
+ return 0;
+ }
+ return totalLuminance / num_none_transparent;
+}
+
+class PrintOptionItem : public wxPanel
+{
+public:
+ PrintOptionItem(wxWindow *parent, boost::bimaps::bimap ops, std::string param = "");
+ ~PrintOptionItem(){};
+ void OnPaint(wxPaintEvent &event);
+ void render(wxDC &dc);
+ void on_left_down(wxMouseEvent &evt);
+ void doRender(wxDC &dc);
+
+ ScalableBitmap m_selected_bk;
+ boost::bimaps::bimap m_ops;
+ std::string selected_key;
+ std::string m_param;
+
+ void setValue(std::string value);
+ void update_options(boost::bimaps::bimap ops){
+ m_ops = ops;
+ selected_key = "";
+ auto width = ops.size() * FromDIP(56) + FromDIP(8);
+ auto height = FromDIP(22) + FromDIP(8);
+ SetMinSize(wxSize(width, height));
+ SetMaxSize(wxSize(width, height));
+ Refresh();
+ };
+ std::string getValue();
+};
+
+class PrintOption : public wxPanel
+{
+public:
+ PrintOption(wxWindow *parent, wxString title, wxString tips, boost::bimaps::bimap ops, std::string param = "");
+ ~PrintOption(){};
+ void OnPaint(wxPaintEvent &event);
+ void render(wxDC &dc);
+ void doRender(wxDC &dc);
+
+ std::string m_param;
+ boost::bimaps::bimap m_ops;
+ Label* m_label{nullptr};
+ Label* m_printoption_title{nullptr};
+ PrintOptionItem* m_printoption_item{nullptr};
+ void setValue(std::string value);
+ void update_options(boost::bimaps::bimap ops){
+ m_ops = ops;
+ m_printoption_item->update_options(ops);
+ };
+ std::string getValue();
+ int getValueInt();
+};
+
+class ThumbnailPanel : public wxPanel
+{
+public:
+ wxBitmap m_bitmap;
+ wxStaticBitmap *m_staticbitmap{nullptr};
+
+ ThumbnailPanel(wxWindow *parent, wxWindowID winid = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize);
+ ~ThumbnailPanel();
+
+ void OnPaint(wxPaintEvent &event);
+ void PaintBackground(wxDC &dc);
+ void OnEraseBackground(wxEraseEvent &event);
+ void set_thumbnail(wxImage &img);
+ void render(wxDC &dc);
+
+private:
+ ScalableBitmap m_background_bitmap;
+ wxBitmap bitmap_with_background;
+ int m_brightness_value{-1};
+};
class SelectMachineDialog : public DPIDialog
{
@@ -353,6 +219,7 @@ private:
bool m_export_3mf_cancel{ false };
bool m_is_canceled{ false };
bool m_is_rename_mode{ false };
+ bool m_printer_update_options_layout {false};
PrintPageMode m_print_page_mode{PrintPageMode::PrintPageModePrepare};
std::string m_print_error_msg;
std::string m_print_error_extra;
@@ -366,8 +233,7 @@ private:
Label* m_text_bed_type;
std::shared_ptr m_token = std::make_shared(0);
- std::map m_checkbox_list;
- //std::map m_checkbox_state_list;
+ std::map m_checkbox_list;
std::vector m_bedtype_list;
std::vector m_list;
std::vector m_filaments;
@@ -381,6 +247,9 @@ private:
std::string m_required_data_file_name;
std::string m_required_data_file_path;
+ boost::bimaps::bimap ops_auto;
+ boost::bimaps::bimap ops_no_auto;
+
protected:
PrintFromType m_print_type{FROM_NORMAL};
AmsMapingPopup m_mapping_popup{ nullptr };
@@ -405,10 +274,6 @@ protected:
wxStaticBitmap* m_bitmap_next_plate{ nullptr };
wxStaticBitmap* img_amsmapping_tip{nullptr};
ThumbnailPanel* m_thumbnailPanel{ nullptr };
- wxWindow* select_bed{ nullptr };
- wxWindow* select_flow{ nullptr };
- wxWindow* select_timelapse{ nullptr };
- wxWindow* select_use_ams{ nullptr };
wxPanel* m_panel_status{ nullptr };
wxPanel* m_basic_panel;
wxPanel* m_rename_normal_panel{nullptr};
@@ -547,66 +412,14 @@ public:
void auto_supply_with_ext(std::vector slots);
bool is_nozzle_type_match(ExtderData data);
+ std::string get_print_status_info(PrintDialogStatus status);
+
PrintFromType get_print_type() {return m_print_type;};
wxString format_steel_name(NozzleType type);
wxString format_text(wxString &m_msg);
- wxWindow* create_ams_checkbox(wxString title, wxWindow* parent, wxString tooltip);
- wxWindow* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, std::string param);
- wxImage * LoadImageFromBlob(const unsigned char *data, int size);
PrintDialogStatus get_status() { return m_print_status; }
std::vector sort_string(std::vector strArray);
};
-
-wxDECLARE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent);
-wxDECLARE_EVENT(EVT_REQUEST_BIND_LIST, wxCommandEvent);
-wxDECLARE_EVENT(EVT_WILL_DISMISS_MACHINE_LIST, wxCommandEvent);
-wxDECLARE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent);
-wxDECLARE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent);
-wxDECLARE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent);
-wxDECLARE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent);
-wxDECLARE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent);
-wxDECLARE_EVENT(EVT_BIND_MACHINE, wxCommandEvent);
-
-class EditDevNameDialog : public DPIDialog
-{
-public:
- EditDevNameDialog(Plater *plater = nullptr);
- ~EditDevNameDialog();
-
- void set_machine_obj(MachineObject *obj);
- void on_dpi_changed(const wxRect &suggested_rect) override;
- void on_edit_name(wxCommandEvent &e);
-
- Button* m_button_confirm{nullptr};
- TextInput* m_textCtr{nullptr};
- wxStaticText* m_static_valid{nullptr};
- MachineObject* m_info{nullptr};
-};
-
-
-class ThumbnailPanel : public wxPanel
-{
-public:
- wxBitmap m_bitmap;
- wxStaticBitmap *m_staticbitmap{nullptr};
-
- ThumbnailPanel(wxWindow * parent,
- wxWindowID winid = wxID_ANY,
- const wxPoint & pos = wxDefaultPosition,
- const wxSize & size = wxDefaultSize);
- ~ThumbnailPanel();
-
- void OnPaint(wxPaintEvent &event);
- void PaintBackground(wxDC &dc);
- void OnEraseBackground(wxEraseEvent &event);
- void set_thumbnail(wxImage &img);
- void render(wxDC &dc);
-private:
- ScalableBitmap m_background_bitmap;
- wxBitmap bitmap_with_background;
- int m_brightness_value{ -1 };
-};
-
}} // namespace Slic3r::GUI
#endif
diff --git a/src/slic3r/GUI/SelectMachinePop.cpp b/src/slic3r/GUI/SelectMachinePop.cpp
new file mode 100644
index 000000000..fc23a5019
--- /dev/null
+++ b/src/slic3r/GUI/SelectMachinePop.cpp
@@ -0,0 +1,1058 @@
+#include "SelectMachinePop.hpp"
+#include "I18N.hpp"
+
+#include "libslic3r/Utils.hpp"
+#include "libslic3r/Thread.hpp"
+#include "GUI.hpp"
+#include "GUI_App.hpp"
+#include "GUI_Preview.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
+#include "Widgets/ProgressDialog.hpp"
+#include "Widgets/RoundedRectangle.hpp"
+#include "Widgets/StaticBox.hpp"
+#include "ConnectPrinter.hpp"
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "Plater.hpp"
+#include "Notebook.hpp"
+#include "BitmapCache.hpp"
+#include "BindDialog.hpp"
+
+namespace Slic3r { namespace GUI {
+
+wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent);
+wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent);
+wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent);
+wxDEFINE_EVENT(EVT_BIND_MACHINE, wxCommandEvent);
+wxDEFINE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent);
+wxDEFINE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent);
+wxDEFINE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent);
+wxDEFINE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent);
+wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent);
+
+
+#define INITIAL_NUMBER_OF_MACHINES 0
+#define LIST_REFRESH_INTERVAL 200
+#define MACHINE_LIST_REFRESH_INTERVAL 2000
+
+#define WRAP_GAP FromDIP(2)
+
+MachineObjectPanel::MachineObjectPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name)
+{
+ wxPanel::Create(parent, id, pos, SELECT_MACHINE_ITEM_SIZE, style, name);
+ Bind(wxEVT_PAINT, &MachineObjectPanel::OnPaint, this);
+
+ SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
+
+ m_unbind_img = ScalableBitmap(this, "unbind", 18);
+ m_edit_name_img = ScalableBitmap(this, "edit_button", 18);
+ m_select_unbind_img = ScalableBitmap(this, "unbind_selected", 18);
+
+ m_printer_status_offline = ScalableBitmap(this, "printer_status_offline", 12);
+ m_printer_status_busy = ScalableBitmap(this, "printer_status_busy", 12);
+ m_printer_status_idle = ScalableBitmap(this, "printer_status_idle", 12);
+ m_printer_status_lock = ScalableBitmap(this, "printer_status_lock", 16);
+ m_printer_in_lan = ScalableBitmap(this, "printer_in_lan", 16);
+
+ this->Bind(wxEVT_ENTER_WINDOW, &MachineObjectPanel::on_mouse_enter, this);
+ this->Bind(wxEVT_LEAVE_WINDOW, &MachineObjectPanel::on_mouse_leave, this);
+ this->Bind(wxEVT_LEFT_UP, &MachineObjectPanel::on_mouse_left_up, this);
+
+#ifdef __APPLE__
+ wxPlatformInfo platformInfo;
+ auto major = platformInfo.GetOSMajorVersion();
+ auto minor = platformInfo.GetOSMinorVersion();
+ auto micro = platformInfo.GetOSMicroVersion();
+
+ //macos 13.1.0
+ if (major >= 13 && minor >= 1 && micro >= 0) {
+ m_is_macos_special_version = true;
+ }
+#endif
+
+}
+
+
+MachineObjectPanel::~MachineObjectPanel() {}
+
+void MachineObjectPanel::show_bind_dialog()
+{
+ if (wxGetApp().is_user_login()) {
+ BindMachineDialog dlg;
+ dlg.update_machine_info(m_info);
+ dlg.ShowModal();
+ }
+}
+
+void MachineObjectPanel::set_printer_state(PrinterState state)
+{
+ m_state = state;
+ Refresh();
+}
+
+void MachineObjectPanel::show_edit_printer_name(bool show)
+{
+ m_show_edit = show;
+ Refresh();
+}
+
+void MachineObjectPanel::show_printer_bind(bool show, PrinterBindState state)
+{
+ m_show_bind = show;
+ m_bind_state = state;
+ Refresh();
+}
+
+void MachineObjectPanel::OnPaint(wxPaintEvent &event)
+{
+ wxPaintDC dc(this);
+ doRender(dc);
+}
+
+void MachineObjectPanel::render(wxDC &dc)
+{
+#ifdef __WXMSW__
+ wxSize size = GetSize();
+ wxMemoryDC memdc;
+ wxBitmap bmp(size.x, size.y);
+ memdc.SelectObject(bmp);
+ memdc.Blit({0, 0}, size, &dc, {0, 0});
+
+ {
+ wxGCDC dc2(memdc);
+ doRender(dc2);
+ }
+
+ memdc.SelectObject(wxNullBitmap);
+ dc.DrawBitmap(bmp, 0, 0);
+#else
+ doRender(dc);
+#endif
+}
+
+void MachineObjectPanel::doRender(wxDC &dc)
+{
+ auto left = 10;
+ wxSize size = GetSize();
+ dc.SetPen(*wxTRANSPARENT_PEN);
+
+ auto dwbitmap = m_printer_status_offline;
+ if (m_state == PrinterState::IDLE) { dwbitmap = m_printer_status_idle; }
+ if (m_state == PrinterState::BUSY) { dwbitmap = m_printer_status_busy; }
+ if (m_state == PrinterState::OFFLINE) { dwbitmap = m_printer_status_offline; }
+ if (m_state == PrinterState::LOCK) { dwbitmap = m_printer_status_lock; }
+ if (m_state == PrinterState::IN_LAN) { dwbitmap = m_printer_in_lan; }
+
+ // dc.DrawCircle(left, size.y / 2, 3);
+ dc.DrawBitmap(dwbitmap.bmp(), wxPoint(left, (size.y - dwbitmap.GetBmpSize().y) / 2));
+
+ left += dwbitmap.GetBmpSize().x + 8;
+ dc.SetFont(Label::Body_13);
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900));
+ wxString dev_name = "";
+ if (m_info) {
+ dev_name = from_u8(m_info->dev_name);
+
+ if (m_state == PrinterState::IN_LAN) {
+ dev_name += _L("(LAN)");
+ }
+ }
+ auto sizet = dc.GetTextExtent(dev_name);
+ auto text_end = 0;
+
+ if (m_show_edit) {
+ text_end = size.x - m_unbind_img.GetBmpSize().x - 30;
+ }
+ else {
+ text_end = size.x - m_unbind_img.GetBmpSize().x;
+ }
+
+ wxString finally_name = dev_name;
+ if (sizet.x > (text_end - left)) {
+ auto limit_width = text_end - left - dc.GetTextExtent("...").x - 15;
+ for (auto i = 0; i < dev_name.length(); i++) {
+ auto curr_width = dc.GetTextExtent(dev_name.substr(0, i));
+ if (curr_width.x >= limit_width) {
+ finally_name = dev_name.substr(0, i) + "...";
+ break;
+ }
+ }
+ }
+
+ dc.DrawText(finally_name, wxPoint(left, (size.y - sizet.y) / 2));
+
+
+ if (m_hover || m_is_macos_special_version) {
+
+ if (m_hover && !m_is_macos_special_version) {
+ dc.SetPen(SELECT_MACHINE_BRAND);
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle(0, 0, size.x, size.y);
+ }
+
+ if (m_show_bind) {
+ if (m_bind_state == ALLOW_UNBIND) {
+ left = size.x - m_unbind_img.GetBmpSize().x - 6;
+ dc.DrawBitmap(m_unbind_img.bmp(), left, (size.y - m_unbind_img.GetBmpSize().y) / 2);
+ }
+ }
+
+ if (m_show_edit) {
+ left = size.x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6;
+ dc.DrawBitmap(m_edit_name_img.bmp(), left, (size.y - m_edit_name_img.GetBmpSize().y) / 2);
+ }
+ }
+
+}
+
+void MachineObjectPanel::update_machine_info(MachineObject *info, bool is_my_devices)
+{
+ m_info = info;
+ m_is_my_devices = is_my_devices;
+ Refresh();
+}
+
+void MachineObjectPanel::on_mouse_enter(wxMouseEvent &evt)
+{
+ m_hover = true;
+ Refresh();
+}
+
+void MachineObjectPanel::on_mouse_leave(wxMouseEvent &evt)
+{
+ m_hover = false;
+ Refresh();
+}
+
+void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt)
+{
+ if (m_is_my_devices) {
+ // show edit
+ if (m_show_edit) {
+ auto edit_left = GetSize().x - m_unbind_img.GetBmpSize().x - 6 - m_edit_name_img.GetBmpSize().x - 6;
+ auto edit_right = edit_left + m_edit_name_img.GetBmpSize().x;
+ auto edit_top = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2;
+ auto edit_bottom = (GetSize().y - m_edit_name_img.GetBmpSize().y) / 2 + m_edit_name_img.GetBmpSize().y;
+ if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) {
+ wxCommandEvent event(EVT_EDIT_PRINT_NAME);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ return;
+ }
+ }
+ if (m_show_bind) {
+ auto left = GetSize().x - m_unbind_img.GetBmpSize().x - 6;
+ auto right = left + m_unbind_img.GetBmpSize().x;
+ auto top = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2;
+ auto bottom = (GetSize().y - m_unbind_img.GetBmpSize().y) / 2 + m_unbind_img.GetBmpSize().y;
+
+ if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) {
+ wxCommandEvent event(EVT_UNBIND_MACHINE, GetId());
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ } else {
+ if (m_info) {
+ wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
+ }
+ //wxGetApp().mainframe->SetFocus();
+ wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST);
+ event.SetEventObject(this->GetParent());
+ wxPostEvent(this->GetParent(), event);
+ }
+ return;
+ }
+ if (m_info && m_info->is_lan_mode_printer()) {
+ if (m_info->has_access_right() && m_info->is_avaliable()) {
+ wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
+ } else {
+ wxCommandEvent event(EVT_CONNECT_LAN_PRINT);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ }
+ } else {
+ wxGetApp().mainframe->jump_to_monitor(m_info->dev_id);
+ }
+ } else {
+ if (m_info && m_info->is_lan_mode_printer()) {
+ wxCommandEvent event(EVT_CONNECT_LAN_PRINT);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ } else {
+ wxCommandEvent event(EVT_BIND_MACHINE);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ }
+ }
+
+}
+
+SelectMachinePopup::SelectMachinePopup(wxWindow *parent)
+ : PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS), m_dismiss(false)
+{
+#ifdef __WINDOWS__
+ SetDoubleBuffered(true);
+#endif //__WINDOWS__
+
+
+ SetSize(SELECT_MACHINE_POPUP_SIZE);
+ SetMinSize(SELECT_MACHINE_POPUP_SIZE);
+ SetMaxSize(SELECT_MACHINE_POPUP_SIZE);
+
+ Freeze();
+ wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
+ SetBackgroundColour(SELECT_MACHINE_GREY400);
+
+
+
+ m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
+ m_scrolledWindow->SetBackgroundColour(*wxWHITE);
+ m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
+ m_scrolledWindow->SetScrollRate(0, 5);
+ auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
+ m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
+ m_scrolledWindow->Layout();
+ m_sizxer_scrolledWindow->Fit(m_scrolledWindow);
+
+#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
+ m_sizer_search_bar = new wxBoxSizer(wxVERTICAL);
+ m_search_bar = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ m_search_bar->SetDescriptiveText(_L("Search"));
+ m_search_bar->ShowSearchButton( true );
+ m_search_bar->ShowCancelButton( false );
+ m_sizer_search_bar->Add( m_search_bar, 1, wxALL| wxEXPAND, 1 );
+ m_sizer_main->Add(m_sizer_search_bar, 0, wxALL | wxEXPAND, FromDIP(2));
+ m_search_bar->Bind( wxEVT_COMMAND_TEXT_UPDATED, &SelectMachinePopup::update_machine_list, this );
+#endif
+ auto own_title = create_title_panel(_L("My Device"));
+ m_sizer_my_devices = new wxBoxSizer(wxVERTICAL);
+ auto other_title = create_title_panel(_L("Other Device"));
+ m_sizer_other_devices = new wxBoxSizer(wxVERTICAL);
+
+
+ m_panel_ping_code = new PinCodePanel(m_scrolledWindow, 0, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE);
+ m_panel_direct_connection = new PinCodePanel(m_scrolledWindow, 1, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE);
+
+ m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15));
+ m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0);
+ m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0);
+ m_sizxer_scrolledWindow->Add(m_panel_direct_connection, 0, wxEXPAND, 0);
+ m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15));
+ m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0);
+
+ m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2));
+
+ SetSizer(m_sizer_main);
+ Layout();
+ Thaw();
+
+ #ifdef __APPLE__
+ m_scrolledWindow->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this);
+ #endif // __APPLE__
+
+ m_refresh_timer = new wxTimer();
+ m_refresh_timer->SetOwner(this);
+ Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachinePopup::update_machine_list, this);
+ Bind(wxEVT_TIMER, &SelectMachinePopup::on_timer, this);
+ Bind(EVT_DISSMISS_MACHINE_LIST, &SelectMachinePopup::on_dissmiss_win, this);
+}
+
+SelectMachinePopup::~SelectMachinePopup() { delete m_refresh_timer;}
+
+void SelectMachinePopup::Popup(wxWindow *WXUNUSED(focus))
+{
+ BOOST_LOG_TRIVIAL(trace) << "get_print_info: start";
+ start_ssdp(true);
+ if (m_refresh_timer) {
+ m_refresh_timer->Stop();
+ m_refresh_timer->Start(MACHINE_LIST_REFRESH_INTERVAL);
+ }
+
+ if (wxGetApp().is_user_login()) {
+ if (!get_print_info_thread) {
+ get_print_info_thread = new boost::thread(Slic3r::create_thread([this, token = std::weak_ptr(m_token)] {
+ NetworkAgent* agent = wxGetApp().getAgent();
+ unsigned int http_code;
+ std::string body;
+ int result = agent->get_user_print_info(&http_code, &body);
+ CallAfter([token, this, result, body]() {
+ if (token.expired()) {return;}
+ if (result == 0) {
+ m_print_info = body;
+ }
+ else {
+ m_print_info = "";
+ }
+ wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ });
+ }));
+ }
+ }
+
+ wxPostEvent(this, wxTimerEvent());
+ PopupWindow::Popup();
+}
+
+void SelectMachinePopup::OnDismiss()
+{
+ BOOST_LOG_TRIVIAL(trace) << "get_print_info: dismiss";
+ start_ssdp(false);
+ m_dismiss = true;
+
+ if (m_refresh_timer) {
+ m_refresh_timer->Stop();
+ }
+ if (get_print_info_thread) {
+ if (get_print_info_thread->joinable()) {
+ get_print_info_thread->join();
+ delete get_print_info_thread;
+ get_print_info_thread = nullptr;
+ }
+ }
+
+ wxCommandEvent event(EVT_FINISHED_UPDATE_MACHINE_LIST);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+}
+
+bool SelectMachinePopup::ProcessLeftDown(wxMouseEvent &event) {
+ return PopupWindow::ProcessLeftDown(event);
+}
+
+bool SelectMachinePopup::Show(bool show) {
+ if (show) {
+ for (int i = 0; i < m_user_list_machine_panel.size(); i++) {
+ m_user_list_machine_panel[i]->mPanel->update_machine_info(nullptr);
+ m_user_list_machine_panel[i]->mPanel->Hide();
+ }
+
+ for (int j = 0; j < m_other_list_machine_panel.size(); j++) {
+ m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
+ m_other_list_machine_panel[j]->mPanel->Hide();
+ }
+ }
+ return PopupWindow::Show(show);
+}
+
+wxWindow *SelectMachinePopup::create_title_panel(wxString text)
+{
+ auto m_panel_title_own = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL);
+ m_panel_title_own->SetBackgroundColour(*wxWHITE);
+
+ wxBoxSizer *m_sizer_title_own = new wxBoxSizer(wxHORIZONTAL);
+
+ auto m_title_own = new wxStaticText(m_panel_title_own, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, 0);
+ m_title_own->SetForegroundColour(wxColour(147,147,147));
+ m_title_own->Wrap(-1);
+ m_sizer_title_own->Add(m_title_own, 0, wxALIGN_CENTER, 0);
+
+ wxBoxSizer *m_sizer_line_own = new wxBoxSizer(wxHORIZONTAL);
+
+ auto m_panel_line_own = new wxPanel(m_panel_title_own, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_ITEM_SIZE.x, FromDIP(1)), wxTAB_TRAVERSAL);
+ m_panel_line_own->SetBackgroundColour(SELECT_MACHINE_GREY400);
+
+ m_sizer_line_own->Add(m_panel_line_own, 0, wxALIGN_CENTER, 0);
+ m_sizer_title_own->Add(0, 0, 0, wxLEFT, FromDIP(10));
+ m_sizer_title_own->Add(m_sizer_line_own, 1, wxEXPAND | wxRIGHT, FromDIP(10));
+
+ m_panel_title_own->SetSizer(m_sizer_title_own);
+ m_panel_title_own->Layout();
+ return m_panel_title_own;
+}
+
+void SelectMachinePopup::on_timer(wxTimerEvent &event)
+{
+ BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup on_timer";
+ wxGetApp().reset_to_active();
+ wxCommandEvent user_event(EVT_UPDATE_USER_MACHINE_LIST);
+ user_event.SetEventObject(this);
+ wxPostEvent(this, user_event);
+}
+
+void SelectMachinePopup::update_other_devices()
+{
+ DeviceManager* dev = wxGetApp().getDeviceManager();
+ if (!dev) return;
+ m_free_machine_list = dev->get_local_machine_list();
+
+ BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices start";
+ this->Freeze();
+ m_scrolledWindow->Freeze();
+ int i = 0;
+
+ for (auto &elem : m_free_machine_list) {
+ MachineObject * mobj = elem.second;
+ /* do not show printer bind state is empty */
+ if (!mobj->is_avaliable()) continue;
+
+ if (!wxGetApp().is_user_login() && !mobj->is_lan_mode_printer())
+ continue;
+
+ /* do not show printer in my list */
+ auto it = m_bind_machine_list.find(mobj->dev_id);
+ if (it != m_bind_machine_list.end())
+ continue;
+
+ MachineObjectPanel* op = nullptr;
+ if (i < m_other_list_machine_panel.size()) {
+ op = m_other_list_machine_panel[i]->mPanel;
+ } else {
+ op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY);
+ MachinePanel* mpanel = new MachinePanel();
+ mpanel->mIndex = wxString::Format("%d", i);
+ mpanel->mPanel = op;
+ m_other_list_machine_panel.push_back(mpanel);
+ m_sizer_other_devices->Add(op, 0, wxEXPAND, 0);
+ }
+#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
+ if (!search_for_printer(mobj)) {
+ op->Hide();
+ }
+ else {
+ op->Show();
+ }
+#else
+ op->Show();
+#endif
+ i++;
+
+ op->update_machine_info(mobj);
+
+ if (mobj->is_lan_mode_printer()) {
+ if (mobj->has_access_right()) {
+ op->set_printer_state(PrinterState::IN_LAN);
+ } else {
+ op->set_printer_state(PrinterState::LOCK);
+ }
+ } else {
+ op->show_edit_printer_name(false);
+ op->show_printer_bind(true, PrinterBindState::ALLOW_BIND);
+ if (mobj->is_in_printing()) {
+ op->set_printer_state(PrinterState::BUSY);
+ } else {
+ op->SetToolTip(_L("Online"));
+ op->set_printer_state(IDLE);
+ }
+ }
+
+ op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) {
+ if (mobj) {
+ if (mobj->is_lan_mode_printer()) {
+ ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code"));
+ dlg.set_machine_object(mobj);
+ if (dlg.ShowModal() == wxID_OK) {
+ wxGetApp().mainframe->jump_to_monitor(mobj->dev_id);
+ }
+ }
+ }
+ });
+
+ op->Bind(EVT_BIND_MACHINE, [this, mobj](wxCommandEvent &e) {
+ BindMachineDialog dlg;
+ dlg.update_machine_info(mobj);
+ int dlg_result = wxID_CANCEL;
+ dlg_result = dlg.ShowModal();
+ if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); }
+ });
+ }
+
+ for (int j = i; j < m_other_list_machine_panel.size(); j++) {
+ m_other_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
+ m_other_list_machine_panel[j]->mPanel->Hide();
+ }
+
+ if (m_placeholder_panel != nullptr) {
+ m_scrolledWindow->RemoveChild(m_placeholder_panel);
+ m_placeholder_panel->Destroy();
+ m_placeholder_panel = nullptr;
+ }
+
+ m_placeholder_panel = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxSize(-1,FromDIP(26)));
+ wxBoxSizer* placeholder_sizer = new wxBoxSizer(wxVERTICAL);
+
+ m_hyperlink = new wxHyperlinkCtrl(m_placeholder_panel, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
+ placeholder_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5);
+
+
+ m_placeholder_panel->SetSizer(placeholder_sizer);
+ m_placeholder_panel->Layout();
+ placeholder_sizer->Fit(m_placeholder_panel);
+
+ m_placeholder_panel->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
+ m_sizer_other_devices->Add(m_placeholder_panel, 0, wxEXPAND, 0);
+
+ //m_sizer_other_devices->Layout();
+ if(m_other_devices_count != i) {
+ m_scrolledWindow->Fit();
+ }
+ m_scrolledWindow->Layout();
+ m_scrolledWindow->Thaw();
+ Layout();
+ Fit();
+ this->Thaw();
+ m_other_devices_count = i;
+ BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices end";
+}
+
+void SelectMachinePopup::update_user_devices()
+{
+ Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
+ if (!dev) return;
+
+ if (!m_print_info.empty()) {
+ dev->parse_user_print_info(m_print_info);
+ m_print_info = "";
+ }
+
+ m_bind_machine_list.clear();
+ m_bind_machine_list = dev->get_my_machine_list();
+
+ //sort list
+ std::vector> user_machine_list;
+ for (auto& it: m_bind_machine_list) {
+ user_machine_list.push_back(it);
+ }
+
+ std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto&b) {
+ if (a.second && b.second) {
+ return a.second->dev_name.compare(b.second->dev_name) < 0;
+ }
+ return false;
+ });
+
+ BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list start";
+ this->Freeze();
+ m_scrolledWindow->Freeze();
+ int i = 0;
+
+ for (auto& elem : user_machine_list) {
+ MachineObject* mobj = elem.second;
+ MachineObjectPanel* op = nullptr;
+ if (i < m_user_list_machine_panel.size()) {
+ op = m_user_list_machine_panel[i]->mPanel;
+#if !BBL_RELEASE_TO_PUBLIC && defined(__WINDOWS__)
+ if (!search_for_printer(mobj)) {
+ op->Hide();
+ } else {
+ op->Show();
+ }
+#else
+ op->Show();
+#endif
+ } else {
+ op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY);
+ MachinePanel* mpanel = new MachinePanel();
+ mpanel->mIndex = wxString::Format("%d", i);
+ mpanel->mPanel = op;
+ m_user_list_machine_panel.push_back(mpanel);
+ m_sizer_my_devices->Add(op, 0, wxEXPAND, 0);
+ }
+ i++;
+ op->update_machine_info(mobj, true);
+ //set in lan
+ if (mobj->is_lan_mode_printer()) {
+ if (!mobj->is_online()) {
+ continue;
+ }
+ else {
+ op->show_printer_bind(false, PrinterBindState::NONE);
+ op->show_edit_printer_name(false);
+ if (mobj->has_access_right() && mobj->is_avaliable()) {
+ op->set_printer_state(PrinterState::IN_LAN);
+ op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
+ op->SetToolTip(_L("Online"));
+ }
+ else {
+ op->set_printer_state(PrinterState::LOCK);
+ }
+ }
+ op->Bind(EVT_UNBIND_MACHINE, [this, dev, mobj](wxCommandEvent& e) {
+ dev->set_selected_machine("");
+ if (mobj) {
+ mobj->set_access_code("");
+ mobj->erase_user_access_code();
+ }
+
+ MessageDialog msg_wingow(nullptr, _L("Log out successful."), "", wxAPPLY | wxOK);
+ if (msg_wingow.ShowModal() == wxOK) { return; }
+ });
+ }
+ else {
+ op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
+ op->Bind(EVT_UNBIND_MACHINE, [this, mobj, dev](wxCommandEvent& e) {
+ // show_unbind_dialog
+ UnBindMachineDialog dlg;
+ dlg.update_machine_info(mobj);
+ if (dlg.ShowModal() == wxID_OK) {
+ dev->set_selected_machine("");
+ }
+ });
+
+ if (!mobj->is_online()) {
+ op->SetToolTip(_L("Offline"));
+ op->set_printer_state(PrinterState::OFFLINE);
+ }
+ else {
+ op->show_edit_printer_name(true);
+ op->show_printer_bind(true, PrinterBindState::ALLOW_UNBIND);
+ if (mobj->is_in_printing()) {
+ op->SetToolTip(_L("Busy"));
+ op->set_printer_state(PrinterState::BUSY);
+ }
+ else {
+ op->SetToolTip(_L("Online"));
+ op->set_printer_state(PrinterState::IDLE);
+ }
+ }
+ }
+
+ op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) {
+ if (mobj) {
+ if (mobj->is_lan_mode_printer()) {
+ ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code"));
+ dlg.set_machine_object(mobj);
+ if (dlg.ShowModal() == wxID_OK) {
+ wxGetApp().mainframe->jump_to_monitor(mobj->dev_id);
+ }
+ }
+ }
+ });
+
+ op->Bind(EVT_EDIT_PRINT_NAME, [this, mobj](wxCommandEvent &e) {
+ EditDevNameDialog dlg;
+ dlg.set_machine_obj(mobj);
+ dlg.ShowModal();
+ });
+ }
+
+ for (int j = i; j < m_user_list_machine_panel.size(); j++) {
+ m_user_list_machine_panel[j]->mPanel->update_machine_info(nullptr);
+ m_user_list_machine_panel[j]->mPanel->Hide();
+ }
+ //m_sizer_my_devices->Layout();
+
+ if (m_my_devices_count != i) {
+ m_scrolledWindow->Fit();
+ }
+ m_scrolledWindow->Layout();
+ m_scrolledWindow->Thaw();
+ Layout();
+ Fit();
+ this->Thaw();
+ m_my_devices_count = i;
+}
+
+bool SelectMachinePopup::search_for_printer(MachineObject* obj)
+{
+ std::string search_text = std::string((m_search_bar->GetValue()).mb_str());
+ if (search_text.empty()) {
+ return true;
+ }
+ auto name = obj->dev_name;
+ auto ip = obj->dev_ip;
+ auto name_it = name.find(search_text);
+ auto ip_it = ip.find(search_text);
+ if ((name_it != std::string::npos)||(ip_it != std::string::npos)) {
+ return true;
+ }
+
+ return false;
+}
+
+void SelectMachinePopup::on_dissmiss_win(wxCommandEvent &event)
+{
+ Dismiss();
+}
+
+void SelectMachinePopup::update_machine_list(wxCommandEvent &event)
+{
+ update_user_devices();
+ update_other_devices();
+ BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_machine_list end";
+}
+
+void SelectMachinePopup::start_ssdp(bool start)
+{
+ return;
+ //if (wxGetApp().getAgent()) { wxGetApp().getAgent()->start_discovery(true, start); }
+}
+
+void SelectMachinePopup::OnLeftUp(wxMouseEvent &event)
+{
+ auto mouse_pos = ClientToScreen(event.GetPosition());
+ auto wxscroll_win_pos = m_scrolledWindow->ClientToScreen(wxPoint(0, 0));
+
+ if (mouse_pos.x > wxscroll_win_pos.x && mouse_pos.y > wxscroll_win_pos.y && mouse_pos.x < (wxscroll_win_pos.x + m_scrolledWindow->GetSize().x) &&
+ mouse_pos.y < (wxscroll_win_pos.y + m_scrolledWindow->GetSize().y)) {
+
+ for (MachinePanel* p : m_user_list_machine_panel) {
+ auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0));
+ if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) {
+ wxMouseEvent event(wxEVT_LEFT_UP);
+ auto tag_pos = p->mPanel->ScreenToClient(mouse_pos);
+ event.SetPosition(tag_pos);
+ event.SetEventObject(p->mPanel);
+ wxPostEvent(p->mPanel, event);
+ }
+ }
+
+ for (MachinePanel* p : m_other_list_machine_panel) {
+ auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0));
+ if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) {
+ wxMouseEvent event(wxEVT_LEFT_UP);
+ auto tag_pos = p->mPanel->ScreenToClient(mouse_pos);
+ event.SetPosition(tag_pos);
+ event.SetEventObject(p->mPanel);
+ wxPostEvent(p->mPanel, event);
+ }
+ }
+
+ //pin code
+ auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0));
+ if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) {
+ wxGetApp().popup_ping_bind_dialog();
+ }
+
+ //bind with access code
+ auto dc_rect = m_panel_direct_connection->ClientToScreen(wxPoint(0, 0));
+ if (mouse_pos.x > dc_rect.x && mouse_pos.y > dc_rect.y && mouse_pos.x < (dc_rect.x + m_panel_direct_connection->GetSize().x) && mouse_pos.y < (dc_rect.y + m_panel_direct_connection->GetSize().y)) {
+ InputIpAddressDialog dlgo;
+ dlgo.ShowModal();
+ }
+
+ //hyper link
+ auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0));
+ if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) {
+ wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"));
+ }
+ }
+}
+
+EditDevNameDialog::EditDevNameDialog(Plater *plater /*= nullptr*/)
+ : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Modifying the device name"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
+{
+ std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str();
+ SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO));
+
+ SetBackgroundColour(*wxWHITE);
+ wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
+ auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL);
+ m_line_top->SetBackgroundColour(wxColour(166, 169, 170));
+ m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0);
+ m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(38));
+ m_textCtr = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(260), FromDIP(40)), wxTE_PROCESS_ENTER);
+ m_textCtr->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(22)));
+ m_textCtr->SetMinSize(wxSize(FromDIP(260), FromDIP(40)));
+ m_sizer_main->Add(m_textCtr, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, FromDIP(40));
+
+ m_static_valid = new wxStaticText(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0);
+ m_static_valid->Wrap(-1);
+ m_static_valid->SetFont(::Label::Body_13);
+ m_static_valid->SetForegroundColour(wxColour(255, 111, 0));
+ m_sizer_main->Add(m_static_valid, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, FromDIP(10));
+
+
+ m_button_confirm = new Button(this, _L("Confirm"));
+ StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(0, 174, 66), StateColor::Normal));
+ m_button_confirm->SetBackgroundColor(btn_bg_green);
+ m_button_confirm->SetBorderColor(wxColour(0, 174, 66));
+ m_button_confirm->SetTextColor(wxColour(255, 255, 255));
+ m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24)));
+ m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24)));
+ m_button_confirm->SetCornerRadius(FromDIP(12));
+ m_button_confirm->Bind(wxEVT_BUTTON, &EditDevNameDialog::on_edit_name, this);
+
+ m_sizer_main->Add(m_button_confirm, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(10));
+ m_sizer_main->Add(0, 0, 0, wxBOTTOM, FromDIP(38));
+
+ SetSizer(m_sizer_main);
+ Layout();
+ Fit();
+ Centre(wxBOTH);
+ wxGetApp().UpdateDlgDarkUI(this);
+}
+
+EditDevNameDialog::~EditDevNameDialog() {}
+
+void EditDevNameDialog::set_machine_obj(MachineObject *obj)
+{
+ m_info = obj;
+ if (m_info)
+ m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->dev_name));
+}
+
+void EditDevNameDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+ m_button_confirm->SetSize(wxSize(FromDIP(72), FromDIP(24)));
+ m_button_confirm->SetMinSize(wxSize(FromDIP(72), FromDIP(24)));
+}
+
+void EditDevNameDialog::on_edit_name(wxCommandEvent &e)
+{
+ m_static_valid->SetLabel(wxEmptyString);
+ auto m_valid_type = Valid;
+ wxString info_line;
+ auto new_dev_name = m_textCtr->GetTextCtrl()->GetValue();
+
+ const char * unusable_symbols = "<>[]:/\\|?*\"";
+ const std::string unusable_suffix = PresetCollection::get_suffix_modified();
+
+ for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
+ if (new_dev_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
+ info_line = _L("Name is invalid;") + _L("illegal characters:") + " " + unusable_symbols;
+ m_valid_type = NoValid;
+ break;
+ }
+ }
+
+ if (m_valid_type == Valid && new_dev_name.find(unusable_suffix) != std::string::npos) {
+ info_line = _L("Name is invalid;") + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified());
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_dev_name.empty()) {
+ info_line = _L("The name is not allowed to be empty.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_dev_name.find_first_of(' ') == 0) {
+ info_line = _L("The name is not allowed to start with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_dev_name.find_last_of(' ') == new_dev_name.length() - 1) {
+ info_line = _L("The name is not allowed to end with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == NoValid) {
+ m_static_valid->SetLabel(info_line);
+ Layout();
+ }
+
+ if (m_valid_type == Valid) {
+ m_static_valid->SetLabel(wxEmptyString);
+ DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
+ if (dev) {
+ auto utf8_str = new_dev_name.ToUTF8();
+ auto name = std::string(utf8_str.data(), utf8_str.length());
+ if (m_info)
+ dev->modify_device_name(m_info->dev_id, name);
+ }
+ DPIDialog::EndModal(wxID_CLOSE);
+ }
+}
+
+ PinCodePanel::PinCodePanel(wxWindow* parent, int type, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/)
+ {
+ wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE);
+ Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this);
+ SetSize(SELECT_MACHINE_ITEM_SIZE);
+ SetMaxSize(SELECT_MACHINE_ITEM_SIZE);
+ SetMinSize(SELECT_MACHINE_ITEM_SIZE);
+
+ m_type = type;
+ this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this);
+ this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this);
+ this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this);
+ }
+
+ void PinCodePanel::OnPaint(wxPaintEvent& event)
+ {
+ wxPaintDC dc(this);
+ render(dc);
+ }
+
+ void PinCodePanel::render(wxDC& dc)
+ {
+#ifdef __WXMSW__
+ wxSize size = GetSize();
+ wxMemoryDC memdc;
+ wxBitmap bmp(size.x, size.y);
+ memdc.SelectObject(bmp);
+ memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 });
+
+ {
+ wxGCDC dc2(memdc);
+ doRender(dc2);
+ }
+
+ memdc.SelectObject(wxNullBitmap);
+ dc.DrawBitmap(bmp, 0, 0);
+#else
+ doRender(dc);
+#endif
+ }
+
+ void PinCodePanel::doRender(wxDC& dc)
+ {
+ auto size = GetSize();
+
+ //m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10);
+
+ m_bitmap = ScalableBitmap(this, wxGetApp().dark_mode() ? "bind_device_ping_code_dark" : "bind_device_ping_code_light", 10);
+
+ dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(12), (size.y - m_bitmap.GetBmpSize().y) / 2));
+ dc.SetFont(::Label::Head_13);
+ dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900));
+ wxString txt;
+ if (m_type == 0) {txt = _L("Bind with Pin Code");}
+ else if (m_type == 1) {txt = _L("Bind with Access Code");}
+
+ auto txt_size = dc.GetTextExtent(txt);
+ dc.DrawText(txt, wxPoint(FromDIP(28), (size.y - txt_size.y) / 2));
+
+ if (m_hover) {
+ dc.SetPen(SELECT_MACHINE_BRAND);
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle(0, 0, size.x, size.y);
+ }
+ }
+
+ void PinCodePanel::on_mouse_enter(wxMouseEvent& evt)
+ {
+ m_hover = true;
+ Refresh();
+ }
+
+ void PinCodePanel::on_mouse_leave(wxMouseEvent& evt)
+ {
+ m_hover = false;
+ Refresh();
+ }
+
+ void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt)
+ {
+ if (m_type == 0) {
+ if (wxGetApp().getAgent() && wxGetApp().getAgent()->is_user_login()){
+ wxGetApp().popup_ping_bind_dialog();
+ }
+ else{
+ auto m_confirm_login_dlg = new SecondaryCheckDialog(nullptr, wxID_ANY, _L("Bind with Pin Code"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, wxDefaultPosition);
+ m_confirm_login_dlg->SetSize(wxSize(FromDIP(270), FromDIP(158)));
+ m_confirm_login_dlg->update_text(_L("Please log in before binding your device with a PIN code.\nAlternatively, you can use LAN mode to bind your device. Learn about LAN mode."));
+ m_confirm_login_dlg->update_btn_label(_L("Go to Login"), _L(""));
+ m_confirm_login_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) {
+ //m_confirm_login_dlg->on_hide();
+ wxGetApp().request_login();
+ return;
+ });
+ m_confirm_login_dlg->on_show();
+ }
+ }
+ else if (m_type == 1) {
+ InputIpAddressDialog dlgo;
+ dlgo.ShowModal();
+ }
+ }
+
+ }} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/SelectMachinePop.hpp b/src/slic3r/GUI/SelectMachinePop.hpp
new file mode 100644
index 000000000..854c40834
--- /dev/null
+++ b/src/slic3r/GUI/SelectMachinePop.hpp
@@ -0,0 +1,233 @@
+#ifndef slic3r_GUI_SelectMachinePop_hpp_
+#define slic3r_GUI_SelectMachinePop_hpp_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "ReleaseNote.hpp"
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+#include "DeviceManager.hpp"
+#include "Plater.hpp"
+#include "BBLStatusBar.hpp"
+#include "BBLStatusBarSend.hpp"
+#include "Widgets/Label.hpp"
+#include "Widgets/Button.hpp"
+#include "Widgets/CheckBox.hpp"
+#include "Widgets/ComboBox.hpp"
+#include "Widgets/ScrolledWindow.hpp"
+#include "Widgets/PopupWindow.hpp"
+#include
+#include
+
+namespace Slic3r { namespace GUI {
+
+enum PrinterState {
+ OFFLINE,
+ IDLE,
+ BUSY,
+ LOCK,
+ IN_LAN
+};
+
+enum PrinterBindState {
+ NONE,
+ ALLOW_BIND,
+ ALLOW_UNBIND
+};
+
+wxDECLARE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent);
+wxDECLARE_EVENT(EVT_WILL_DISMISS_MACHINE_LIST, wxCommandEvent);
+wxDECLARE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent);
+wxDECLARE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent);
+wxDECLARE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent);
+wxDECLARE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent);
+wxDECLARE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent);
+wxDECLARE_EVENT(EVT_BIND_MACHINE, wxCommandEvent);
+
+#define SELECT_MACHINE_POPUP_SIZE wxSize(FromDIP(216), FromDIP(364))
+#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(212), FromDIP(360))
+#define SELECT_MACHINE_ITEM_SIZE wxSize(FromDIP(190), FromDIP(35))
+#define SELECT_MACHINE_GREY900 wxColour(38, 46, 48)
+#define SELECT_MACHINE_GREY600 wxColour(144, 144, 144)
+#define SELECT_MACHINE_GREY400 wxColour(206, 206, 206)
+#define SELECT_MACHINE_BRAND wxColour(0, 174, 66)
+#define SELECT_MACHINE_REMIND wxColour(255, 111, 0)
+#define SELECT_MACHINE_LIGHT_GREEN wxColour(219, 253, 231)
+
+class MachineObjectPanel : public wxPanel
+{
+private:
+ bool m_is_my_devices {false};
+ bool m_show_edit{false};
+ bool m_show_bind{false};
+ bool m_hover {false};
+ bool m_is_macos_special_version{false};
+
+
+ PrinterBindState m_bind_state;
+ PrinterState m_state;
+
+ ScalableBitmap m_unbind_img;
+ ScalableBitmap m_edit_name_img;
+ ScalableBitmap m_select_unbind_img;
+
+ ScalableBitmap m_printer_status_offline;
+ ScalableBitmap m_printer_status_busy;
+ ScalableBitmap m_printer_status_idle;
+ ScalableBitmap m_printer_status_lock;
+ ScalableBitmap m_printer_in_lan;
+
+ MachineObject *m_info;
+
+protected:
+ wxStaticBitmap *m_bitmap_info;
+ wxStaticBitmap *m_bitmap_bind;
+
+public:
+ MachineObjectPanel(wxWindow * parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint & pos = wxDefaultPosition,
+ const wxSize & size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL,
+ const wxString &name = wxEmptyString);
+
+ ~MachineObjectPanel();
+
+ void show_bind_dialog();
+ void set_printer_state(PrinterState state);
+ void show_printer_bind(bool show, PrinterBindState state);
+ void show_edit_printer_name(bool show);
+ void update_machine_info(MachineObject *info, bool is_my_devices = false);
+protected:
+ void OnPaint(wxPaintEvent &event);
+ void render(wxDC &dc);
+ void doRender(wxDC &dc);
+ void on_mouse_enter(wxMouseEvent &evt);
+ void on_mouse_leave(wxMouseEvent &evt);
+ void on_mouse_left_up(wxMouseEvent &evt);
+};
+
+class MachinePanel
+{
+public:
+ wxString mIndex;
+ MachineObjectPanel *mPanel;
+};
+
+class PinCodePanel : public wxPanel
+{
+public:
+ PinCodePanel(wxWindow* parent,
+ int type,
+ wxWindowID winid = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize);
+ ~PinCodePanel() {};
+
+ ScalableBitmap m_bitmap;
+ bool m_hover{false};
+ int m_type{0};
+
+ void OnPaint(wxPaintEvent& event);
+ void render(wxDC& dc);
+ void doRender(wxDC& dc);
+
+ void on_mouse_enter(wxMouseEvent& evt);
+ void on_mouse_leave(wxMouseEvent& evt);
+ void on_mouse_left_up(wxMouseEvent& evt);
+};
+
+class SelectMachinePopup : public PopupWindow
+{
+public:
+ SelectMachinePopup(wxWindow *parent);
+ ~SelectMachinePopup();
+
+ // PopupWindow virtual methods are all overridden to log them
+ virtual void Popup(wxWindow *focus = NULL) wxOVERRIDE;
+ virtual void OnDismiss() wxOVERRIDE;
+ virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE;
+ virtual bool Show(bool show = true) wxOVERRIDE;
+
+ void update_machine_list(wxCommandEvent &event);
+ void start_ssdp(bool on_off);
+ bool was_dismiss() { return m_dismiss; }
+
+private:
+ int m_my_devices_count{0};
+ int m_other_devices_count{0};
+ PinCodePanel* m_panel_ping_code{nullptr};
+ PinCodePanel* m_panel_direct_connection{nullptr};
+ wxWindow* m_placeholder_panel{nullptr};
+ wxHyperlinkCtrl* m_hyperlink{nullptr};
+ Label* m_ping_code_text{nullptr};
+ wxStaticBitmap* m_img_ping_code{nullptr};
+ wxBoxSizer * m_sizer_body{nullptr};
+ wxBoxSizer * m_sizer_my_devices{nullptr};
+ wxBoxSizer * m_sizer_other_devices{nullptr};
+ wxBoxSizer * m_sizer_search_bar{nullptr};
+ wxSearchCtrl* m_search_bar{nullptr};
+ wxScrolledWindow * m_scrolledWindow{nullptr};
+ wxWindow * m_panel_body{nullptr};
+ wxTimer * m_refresh_timer{nullptr};
+ std::vector m_user_list_machine_panel;
+ std::vector m_other_list_machine_panel;
+ boost::thread* get_print_info_thread{ nullptr };
+ std::shared_ptr m_token = std::make_shared(0);
+ std::string m_print_info = "";
+ bool m_dismiss { false };
+
+ std::map m_bind_machine_list;
+ std::map m_free_machine_list;
+
+private:
+ void OnLeftUp(wxMouseEvent &event);
+ void on_timer(wxTimerEvent &event);
+
+ void update_other_devices();
+ void update_user_devices();
+ bool search_for_printer(MachineObject* obj);
+ void on_dissmiss_win(wxCommandEvent &event);
+ wxWindow *create_title_panel(wxString text);
+};
+
+class EditDevNameDialog : public DPIDialog
+{
+public:
+ EditDevNameDialog(Plater *plater = nullptr);
+ ~EditDevNameDialog();
+
+ void set_machine_obj(MachineObject *obj);
+ void on_dpi_changed(const wxRect &suggested_rect) override;
+ void on_edit_name(wxCommandEvent &e);
+
+ Button* m_button_confirm{nullptr};
+ TextInput* m_textCtr{nullptr};
+ wxStaticText* m_static_valid{nullptr};
+ MachineObject* m_info{nullptr};
+};
+
+}} // namespace Slic3r::GUI
+
+#endif
diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp
index 207ae2271..26c19f666 100644
--- a/src/slic3r/Utils/CalibUtils.cpp
+++ b/src/slic3r/Utils/CalibUtils.cpp
@@ -1318,7 +1318,7 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess
print_job->set_calibration_task(true);
print_job->has_sdcard = obj_->has_sdcard();
- print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true);
+ print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, 0, 0, 0);
print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name);
{ // after send: record the print job
diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp
index 99cee59ee..8d124aa84 100644
--- a/src/slic3r/Utils/bambu_networking.hpp
+++ b/src/slic3r/Utils/bambu_networking.hpp
@@ -229,6 +229,9 @@ struct PrintParams {
bool task_use_ams;
std::string task_bed_type;
std::string extra_options;
+ int auto_bed_leveling{0};
+ int auto_flow_cali{0};
+ int auto_offset_cali{0};
};
struct TaskQueryParams