2024-11-12 00:42:49 +00:00
# include "SelectMachinePop.hpp"
# include "I18N.hpp"
# include "libslic3r/Utils.hpp"
# include "libslic3r/Thread.hpp"
2025-02-19 10:25:14 +00:00
# include "slic3r/Utils/WxFontUtils.hpp"
2024-11-12 00:42:49 +00:00
# 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 <wx/progdlg.h>
# include <wx/clipbrd.h>
# include <wx/dcgraph.h>
# include <wx/mstream.h>
# include <miniz.h>
# include <algorithm>
# 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 )
{
2025-01-23 12:07:57 +00:00
wxPanel : : Create ( parent , id , pos , wxDefaultSize , style , name ) ;
SetSize ( SELECT_MACHINE_ITEM_SIZE ) ;
SetMinSize ( SELECT_MACHINE_ITEM_SIZE ) ;
SetMaxSize ( SELECT_MACHINE_ITEM_SIZE ) ;
2024-11-12 00:42:49 +00:00
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 ) ;
} ) ;
} ) ) ;
}
}
2025-03-13 09:01:52 +00:00
{
wxGetApp ( ) . reset_to_active ( ) ;
wxCommandEvent user_event ( EVT_UPDATE_USER_MACHINE_LIST ) ;
user_event . SetEventObject ( this ) ;
wxPostEvent ( this , user_event ) ;
}
2024-11-12 00:42:49 +00:00
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 < std : : pair < std : : string , MachineObject * > > 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 ( ) ;
}
2025-01-20 10:07:37 +00:00
if ( GUI : : wxGetApp ( ) . plater ( ) )
GUI : : wxGetApp ( ) . plater ( ) - > update_machine_sync_status ( ) ;
2024-11-12 00:42:49 +00:00
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 )
{
2025-01-21 01:51:25 +00:00
const std : : string & search_text = m_search_bar - > GetValue ( ) . ToStdString ( ) ;
2024-11-12 00:42:49 +00:00
if ( search_text . empty ( ) ) {
return true ;
}
2025-01-21 01:51:25 +00:00
const auto & name = wxString : : FromUTF8 ( obj - > dev_name ) . ToStdString ( ) ;
const auto & name_it = name . find ( search_text ) ;
if ( name_it ! = std : : string : : npos ) {
return true ;
}
const auto & ip_it = obj - > dev_ip . find ( search_text ) ;
if ( ip_it ! = std : : string : : npos ) {
2024-11-12 00:42:49 +00:00
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 < wxWindow * > ( 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 " ) ) ;
2025-06-05 01:32:57 +00:00
StateColor btn_bg_green ( std : : pair < wxColour , int > ( wxColour ( 27 , 136 , 68 ) , StateColor : : Pressed ) , std : : pair < wxColour , int > ( wxColour ( 0x9A5F21 ) , StateColor : : Normal ) ) ;
2024-11-12 00:42:49 +00:00
m_button_confirm - > SetBackgroundColor ( btn_bg_green ) ;
2025-06-05 01:32:57 +00:00
m_button_confirm - > SetBorderColor ( wxColour ( 0x9A5F21 ) ) ;
2024-11-12 00:42:49 +00:00
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 ;
}
2025-02-18 04:17:01 +00:00
if ( m_valid_type = = Valid & & new_dev_name . length ( ) > 32 )
{
info_line = _L ( " The name is not allowed to exceeds 32 characters. " ) ;
m_valid_type = NoValid ;
}
2024-11-12 00:42:49 +00:00
if ( m_valid_type = = NoValid ) {
m_static_valid - > SetLabel ( info_line ) ;
2025-02-18 04:17:01 +00:00
m_static_valid - > Wrap ( m_static_valid - > GetSize ( ) . GetWidth ( ) ) ;
2024-11-12 00:42:49 +00:00
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 ) ;
}
}
2025-01-23 12:07:57 +00:00
PinCodePanel : : PinCodePanel ( wxWindow * parent , int type , wxWindowID winid /*= wxID_ANY*/ , const wxPoint & pos /*= wxDefaultPosition*/ , const wxSize & size /*= wxDefaultSize*/ )
2024-11-12 00:42:49 +00:00
{
2025-01-23 12:07:57 +00:00
wxPanel : : Create ( parent , winid , pos ) ;
2024-11-12 00:42:49 +00:00
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 " ) ; }
2025-02-19 10:25:14 +00:00
WxFontUtils : : get_suitable_font_size ( 0.5 * size . GetHeight ( ) , dc ) ;
2024-11-12 00:42:49 +00:00
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. \n Alternatively, 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