2022-07-15 15:37:19 +00:00
# include "MediaFilePanel.h"
# include "ImageGrid.h"
# include "I18N.hpp"
# include "GUI_App.hpp"
2023-05-13 09:31:35 +00:00
# include "Plater.hpp"
2022-07-15 15:37:19 +00:00
# include "Widgets/Button.hpp"
# include "Widgets/SwitchButton.hpp"
# include "Widgets/Label.hpp"
# include "Printer/PrinterFileSystem.h"
2023-04-27 01:09:45 +00:00
# include "MsgDialog.hpp"
2023-05-25 04:29:02 +00:00
# include "Widgets/ProgressDialog.hpp"
2023-05-08 07:47:55 +00:00
# include <libslic3r/Model.hpp>
# include <libslic3r/Format/bbs_3mf.hpp>
2023-04-27 01:09:45 +00:00
# ifdef __WXMSW__
# include <shellapi.h>
# endif
# ifdef __APPLE__
# include "../Utils/MacDarkMode.hpp"
# endif
2022-07-15 15:37:19 +00:00
namespace Slic3r {
namespace GUI {
MediaFilePanel : : MediaFilePanel ( wxWindow * parent )
: wxPanel ( parent , wxID_ANY )
, m_bmp_loading ( this , " media_loading " , 0 )
, m_bmp_failed ( this , " media_failed " , 0 )
, m_bmp_empty ( this , " media_empty " , 0 )
{
SetBackgroundColour ( 0xEEEEEE ) ;
Hide ( ) ;
wxBoxSizer * sizer = new wxBoxSizer ( wxVERTICAL ) ;
wxBoxSizer * top_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
top_sizer - > SetMinSize ( { - 1 , 75 * em_unit ( this ) / 10 } ) ;
// Time group
2023-05-08 07:47:55 +00:00
auto time_panel = new wxWindow ( this , wxID_ANY ) ;
2023-06-07 06:04:09 +00:00
time_panel - > SetBackgroundColour ( 0xEEEEEE ) ;
2023-05-08 07:47:55 +00:00
m_time_panel = new : : StaticBox ( time_panel , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxBORDER_NONE ) ;
2023-06-07 06:04:09 +00:00
m_time_panel - > SetCornerRadius ( 0 ) ;
m_button_year = new : : Button ( m_time_panel , _L ( " Year " ) , " " , wxBORDER_NONE ) ;
2022-07-15 15:37:19 +00:00
m_button_month = new : : Button ( m_time_panel , _L ( " Month " ) , " " , wxBORDER_NONE ) ;
m_button_all = new : : Button ( m_time_panel , _L ( " All Files " ) , " " , wxBORDER_NONE ) ;
2023-03-24 09:58:11 +00:00
m_button_year - > SetToolTip ( _L ( " Group files by year, recent first. " ) ) ;
m_button_month - > SetToolTip ( _L ( " Group files by month, recent first. " ) ) ;
m_button_all - > SetToolTip ( _L ( " Show all files, recent first. " ) ) ;
2022-09-02 02:58:00 +00:00
m_button_all - > SetFont ( Label : : Head_14 ) ; // sync with m_last_mode
2022-07-15 15:37:19 +00:00
for ( auto b : { m_button_year , m_button_month , m_button_all } ) {
b - > SetBackgroundColor ( StateColor ( ) ) ;
b - > SetTextColor ( StateColor (
std : : make_pair ( 0x3B4446 , ( int ) StateColor : : Checked ) ,
std : : make_pair ( * wxLIGHT_GREY , ( int ) StateColor : : Hovered ) ,
2022-11-29 14:29:44 +00:00
std : : make_pair ( 0xABACAC , ( int ) StateColor : : Normal )
2022-07-15 15:37:19 +00:00
) ) ;
}
wxBoxSizer * time_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
time_sizer - > Add ( m_button_year , 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT , 24 ) ;
time_sizer - > Add ( m_button_month , 0 , wxALIGN_CENTER_VERTICAL ) ;
time_sizer - > Add ( m_button_all , 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT , 24 ) ;
m_time_panel - > SetSizer ( time_sizer ) ;
2023-05-08 07:47:55 +00:00
wxBoxSizer * time_sizer2 = new wxBoxSizer ( wxHORIZONTAL ) ;
time_sizer2 - > Add ( m_time_panel , 1 , wxEXPAND ) ;
time_panel - > SetSizer ( time_sizer2 ) ;
top_sizer - > Add ( time_panel , 1 , wxEXPAND ) ;
2022-07-15 15:37:19 +00:00
// File type
2022-09-26 10:14:17 +00:00
StateColor background (
std : : make_pair ( 0xEEEEEE , ( int ) StateColor : : Checked ) ,
std : : make_pair ( * wxLIGHT_GREY , ( int ) StateColor : : Hovered ) ,
std : : make_pair ( * wxWHITE , ( int ) StateColor : : Normal ) ) ;
2022-07-15 15:37:19 +00:00
m_type_panel = new : : StaticBox ( this , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxBORDER_NONE ) ;
m_type_panel - > SetBackgroundColor ( * wxWHITE ) ;
2022-08-10 04:31:55 +00:00
m_type_panel - > SetCornerRadius ( FromDIP ( 5 ) ) ;
2022-07-15 15:37:19 +00:00
m_type_panel - > SetMinSize ( { - 1 , 48 * em_unit ( this ) / 10 } ) ;
m_button_timelapse = new : : Button ( m_type_panel , _L ( " Timelapse " ) , " " , wxBORDER_NONE ) ;
2023-06-12 06:56:01 +00:00
m_button_timelapse - > SetToolTip ( _L ( " Switch to timelapse files. " ) ) ;
2022-09-01 03:14:55 +00:00
m_button_video = new : : Button ( m_type_panel , _L ( " Video " ) , " " , wxBORDER_NONE ) ;
2023-06-12 06:56:01 +00:00
m_button_video - > SetToolTip ( _L ( " Switch to video files. " ) ) ;
2023-04-27 01:09:45 +00:00
m_button_model = new : : Button ( m_type_panel , _L ( " Model " ) , " " , wxBORDER_NONE ) ;
2023-06-12 06:56:01 +00:00
m_button_video - > SetToolTip ( _L ( " Switch to 3mf model files. " ) ) ;
2023-04-27 01:09:45 +00:00
for ( auto b : { m_button_timelapse , m_button_video , m_button_model } ) {
2022-09-26 10:14:17 +00:00
b - > SetBackgroundColor ( background ) ;
b - > SetCanFocus ( false ) ;
}
2022-07-15 15:37:19 +00:00
wxBoxSizer * type_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
type_sizer - > Add ( m_button_timelapse , 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT , 24 ) ;
2023-04-27 01:09:45 +00:00
//type_sizer->Add(m_button_video, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 24);
m_button_video - > Hide ( ) ;
type_sizer - > Add ( m_button_model , 0 , wxALIGN_CENTER_VERTICAL | wxRIGHT , 24 ) ;
2022-07-15 15:37:19 +00:00
m_type_panel - > SetSizer ( type_sizer ) ;
2023-04-27 01:09:45 +00:00
top_sizer - > Add ( m_type_panel , 0 , wxALIGN_CENTER_VERTICAL ) ;
2022-07-15 15:37:19 +00:00
// File management
m_manage_panel = new : : StaticBox ( this , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxBORDER_NONE ) ;
m_manage_panel - > SetBackgroundColor ( StateColor ( ) ) ;
m_button_delete = new : : Button ( m_manage_panel , _L ( " Delete " ) ) ;
2023-06-12 06:56:01 +00:00
m_button_delete - > SetToolTip ( _L ( " Delete selected files from printer. " ) ) ;
2022-09-01 03:14:55 +00:00
m_button_download = new : : Button ( m_manage_panel , _L ( " Download " ) ) ;
2023-06-12 06:56:01 +00:00
m_button_download - > SetToolTip ( _L ( " Download selected files from printer. " ) ) ;
2022-10-09 03:11:47 +00:00
m_button_management = new : : Button ( m_manage_panel , _L ( " Select " ) ) ;
2023-06-12 06:56:01 +00:00
m_button_management - > SetToolTip ( _L ( " Batch manage files. " ) ) ;
2022-09-26 10:14:17 +00:00
for ( auto b : { m_button_delete , m_button_download , m_button_management } ) {
b - > SetFont ( Label : : Body_12 ) ;
b - > SetCornerRadius ( 12 ) ;
b - > SetPaddingSize ( { 10 , 6 } ) ;
b - > SetCanFocus ( false ) ;
}
2022-10-14 01:25:17 +00:00
m_button_delete - > SetBorderColorNormal ( wxColor ( " #FF6F00 " ) ) ;
m_button_delete - > SetTextColorNormal ( wxColor ( " #FF6F00 " ) ) ;
2022-09-26 10:14:17 +00:00
m_button_management - > SetBorderWidth ( 0 ) ;
2022-10-14 01:25:17 +00:00
m_button_management - > SetBackgroundColorNormal ( wxColor ( " #00AE42 " ) ) ;
2022-10-28 00:47:45 +00:00
m_button_management - > SetTextColorNormal ( * wxWHITE ) ;
2022-11-21 11:51:51 +00:00
m_button_management - > Enable ( false ) ;
2022-07-15 15:37:19 +00:00
wxBoxSizer * manage_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
manage_sizer - > AddStretchSpacer ( 1 ) ;
manage_sizer - > Add ( m_button_download , 0 , wxALIGN_CENTER_VERTICAL ) - > Show ( false ) ;
2022-10-28 00:47:45 +00:00
manage_sizer - > Add ( m_button_delete , 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT , 24 ) - > Show ( false ) ;
2022-07-15 15:37:19 +00:00
manage_sizer - > Add ( m_button_management , 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT , 24 ) ;
m_manage_panel - > SetSizer ( manage_sizer ) ;
2022-08-05 06:38:19 +00:00
top_sizer - > Add ( m_manage_panel , 1 , wxEXPAND ) ;
2022-07-15 15:37:19 +00:00
sizer - > Add ( top_sizer , 0 , wxEXPAND ) ;
m_image_grid = new ImageGrid ( this ) ;
2023-04-27 01:09:45 +00:00
m_image_grid - > Bind ( EVT_ITEM_ACTION , [ this ] ( wxCommandEvent & e ) { doAction ( size_t ( e . GetExtraLong ( ) ) , e . GetInt ( ) ) ; } ) ;
2022-11-17 02:50:14 +00:00
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " No printers. " ) ) ;
2022-07-15 15:37:19 +00:00
sizer - > Add ( m_image_grid , 1 , wxEXPAND ) ;
SetSizer ( sizer ) ;
// Time group
auto time_button_clicked = [ this ] ( wxEvent & e ) {
auto mode = PrinterFileSystem : : G_NONE ;
if ( e . GetEventObject ( ) = = m_button_year )
mode = PrinterFileSystem : : G_YEAR ;
else if ( e . GetEventObject ( ) = = m_button_month )
mode = PrinterFileSystem : : G_MONTH ;
m_image_grid - > SetGroupMode ( mode ) ;
} ;
m_button_year - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , time_button_clicked ) ;
m_button_month - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , time_button_clicked ) ;
m_button_all - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , time_button_clicked ) ;
2022-09-19 01:50:34 +00:00
m_button_all - > SetValue ( true ) ;
2022-07-15 15:37:19 +00:00
// File type
auto type_button_clicked = [ this ] ( wxEvent & e ) {
2023-04-27 01:09:45 +00:00
Button * buttons [ ] { m_button_timelapse , m_button_video , m_button_model } ;
auto type = std : : find ( buttons , buttons + sizeof ( buttons ) / sizeof ( buttons [ 0 ] ) , e . GetEventObject ( ) ) - buttons ;
2022-09-01 03:14:55 +00:00
if ( m_last_type = = type )
return ;
2023-04-27 01:09:45 +00:00
m_image_grid - > SetFileType ( type , m_external ? " " : " internal " ) ;
buttons [ m_last_type ] - > SetValue ( ! buttons [ m_last_type ] - > GetValue ( ) ) ;
2022-09-01 03:14:55 +00:00
m_last_type = type ;
2023-04-27 01:09:45 +00:00
buttons [ m_last_type ] - > SetValue ( ! buttons [ m_last_type ] - > GetValue ( ) ) ;
if ( type = = PrinterFileSystem : : F_MODEL )
m_image_grid - > SetGroupMode ( PrinterFileSystem : : G_NONE ) ;
2022-07-15 15:37:19 +00:00
} ;
m_button_timelapse - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , type_button_clicked ) ;
2023-04-27 01:09:45 +00:00
m_button_video - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , type_button_clicked ) ;
m_button_model - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , type_button_clicked ) ;
2022-09-19 01:50:34 +00:00
m_button_timelapse - > SetValue ( true ) ;
2022-07-15 15:37:19 +00:00
2022-10-09 03:11:47 +00:00
// File management
2022-10-14 01:25:17 +00:00
m_button_management - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , [ this ] ( auto & e ) {
2022-10-09 03:11:47 +00:00
e . Skip ( ) ;
2022-10-14 01:25:17 +00:00
SetSelecting ( ! m_image_grid - > IsSelecting ( ) ) ;
2022-10-09 03:11:47 +00:00
} ) ;
2022-10-14 01:25:17 +00:00
m_button_download - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , [ this ] ( auto & e ) {
2022-10-09 03:11:47 +00:00
m_image_grid - > DoActionOnSelection ( 1 ) ;
2022-10-14 01:25:17 +00:00
SetSelecting ( false ) ;
2022-10-09 03:11:47 +00:00
} ) ;
2022-10-14 01:25:17 +00:00
m_button_delete - > Bind ( wxEVT_COMMAND_BUTTON_CLICKED , [ this ] ( auto & e ) {
2022-10-09 03:11:47 +00:00
m_image_grid - > DoActionOnSelection ( 0 ) ;
2022-10-14 01:25:17 +00:00
SetSelecting ( false ) ;
2022-07-15 15:37:19 +00:00
} ) ;
auto onShowHide = [ this ] ( auto & e ) {
2022-08-31 09:15:34 +00:00
e . Skip ( ) ;
2023-07-03 12:13:06 +00:00
if ( auto w = dynamic_cast < wxWindow * > ( e . GetEventObject ( ) ) ; ! w | | w - > IsBeingDeleted ( ) )
return ;
2023-04-27 01:09:45 +00:00
CallAfter ( [ this ] {
auto fs = m_image_grid ? m_image_grid - > GetFileSystem ( ) : nullptr ;
if ( fs ) IsShownOnScreen ( ) ? fs - > Start ( ) : fs - > Stop ( ) ;
} ) ;
2022-07-15 15:37:19 +00:00
} ;
Bind ( wxEVT_SHOW , onShowHide ) ;
parent - > GetParent ( ) - > Bind ( wxEVT_SHOW , onShowHide ) ;
}
2022-08-09 09:52:55 +00:00
MediaFilePanel : : ~ MediaFilePanel ( )
{
SetMachineObject ( nullptr ) ;
}
2022-07-15 15:37:19 +00:00
void MediaFilePanel : : SetMachineObject ( MachineObject * obj )
{
std : : string machine = obj ? obj - > dev_id : " " ;
2023-08-14 06:44:17 +00:00
if ( obj ) {
2022-11-14 10:31:55 +00:00
m_supported = true ;
2022-09-26 03:11:05 +00:00
m_lan_mode = obj - > is_lan_mode_printer ( ) ;
2023-05-12 00:45:28 +00:00
m_lan_ip = obj - > dev_ip ;
2023-01-16 10:53:35 +00:00
m_lan_passwd = obj - > get_access_code ( ) ;
2023-08-03 02:19:35 +00:00
m_dev_ver = obj - > get_ota_version ( ) ;
2023-08-14 06:44:17 +00:00
m_local_support = obj - > file_local ;
m_remote_support = obj - > file_remote ;
2022-09-26 03:11:05 +00:00
} else {
2022-11-14 10:31:55 +00:00
m_supported = false ;
m_lan_mode = false ;
2022-09-26 03:11:05 +00:00
m_lan_ip . clear ( ) ;
m_lan_passwd . clear ( ) ;
2023-08-03 02:19:35 +00:00
m_dev_ver . clear ( ) ;
2023-05-12 00:45:28 +00:00
m_local_support = false ;
2023-05-08 07:47:55 +00:00
m_remote_support = false ;
2022-09-26 03:11:05 +00:00
}
2023-05-08 07:47:55 +00:00
if ( machine = = m_machine ) {
if ( m_waiting_enable & & IsEnabled ( ) ) {
auto fs = m_image_grid - > GetFileSystem ( ) ;
if ( fs ) fs - > Retry ( ) ;
}
2022-07-15 15:37:19 +00:00
return ;
2023-05-08 07:47:55 +00:00
}
2022-07-15 15:37:19 +00:00
m_machine = machine ;
2023-05-05 02:32:00 +00:00
m_last_errors . clear ( ) ;
2022-07-15 15:37:19 +00:00
auto fs = m_image_grid - > GetFileSystem ( ) ;
if ( fs ) {
m_image_grid - > SetFileSystem ( nullptr ) ;
2022-07-22 09:46:10 +00:00
fs - > Unbind ( EVT_MODE_CHANGED , & MediaFilePanel : : modeChanged , this ) ;
2022-07-15 15:37:19 +00:00
fs - > Stop ( true ) ;
}
2022-10-14 01:25:17 +00:00
m_button_management - > Enable ( false ) ;
SetSelecting ( false ) ;
2022-07-15 15:37:19 +00:00
if ( m_machine . empty ( ) ) {
2022-11-17 02:50:14 +00:00
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " No printers. " ) ) ;
2022-11-14 10:31:55 +00:00
} else if ( ! m_supported ) {
2023-06-12 02:44:16 +00:00
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " Initialize failed (Not supported on the current printer version)! " ) ) ;
2022-07-15 15:37:19 +00:00
} else {
boost : : shared_ptr < PrinterFileSystem > fs ( new PrinterFileSystem ) ;
2022-09-27 05:11:01 +00:00
fs - > Attached ( ) ;
2022-07-15 15:37:19 +00:00
m_image_grid - > SetFileSystem ( fs ) ;
2023-04-27 01:09:45 +00:00
m_image_grid - > SetFileType ( m_last_type , m_external ? " " : " internal " ) ;
2022-10-14 01:25:17 +00:00
fs - > Bind ( EVT_FILE_CHANGED , [ this , wfs = boost : : weak_ptr ( fs ) ] ( auto & e ) {
e . Skip ( ) ;
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
2023-07-04 07:40:10 +00:00
if ( fs = = nullptr | | m_image_grid - > GetFileSystem ( ) ! = fs ) // canceled
2022-10-14 01:25:17 +00:00
return ;
2023-04-27 01:09:45 +00:00
m_time_panel - > Show ( fs - > GetFileType ( ) < PrinterFileSystem : : F_MODEL ) ;
//m_manage_panel->Show(fs->GetFileType() < PrinterFileSystem::F_MODEL);
2022-10-14 01:25:17 +00:00
m_button_management - > Enable ( fs - > GetCount ( ) > 0 ) ;
if ( fs - > GetCount ( ) = = 0 )
SetSelecting ( false ) ;
} ) ;
fs - > Bind ( EVT_SELECT_CHANGED , [ this , wfs = boost : : weak_ptr ( fs ) ] ( auto & e ) {
e . Skip ( ) ;
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
2023-07-04 07:40:10 +00:00
if ( fs = = nullptr | | m_image_grid - > GetFileSystem ( ) ! = fs ) // canceled
2022-10-14 01:25:17 +00:00
return ;
m_button_delete - > Enable ( e . GetInt ( ) > 0 ) ;
m_button_download - > Enable ( e . GetInt ( ) > 0 ) ;
} ) ;
2022-07-22 09:46:10 +00:00
fs - > Bind ( EVT_MODE_CHANGED , & MediaFilePanel : : modeChanged , this ) ;
2023-02-15 03:32:18 +00:00
fs - > Bind ( EVT_STATUS_CHANGED , [ this , wfs = boost : : weak_ptr ( fs ) ] ( auto & e ) {
2022-10-14 01:25:17 +00:00
e . Skip ( ) ;
2022-07-15 15:37:19 +00:00
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
2023-07-04 07:40:10 +00:00
if ( fs = = nullptr | | m_image_grid - > GetFileSystem ( ) ! = fs ) // canceled
2022-07-15 15:37:19 +00:00
return ;
2022-11-17 02:50:14 +00:00
ScalableBitmap icon ;
2022-07-15 15:37:19 +00:00
wxString msg ;
2023-02-15 03:32:18 +00:00
int status = e . GetInt ( ) ;
2023-05-23 07:28:33 +00:00
int extra = e . GetExtraLong ( ) ;
2023-02-15 03:32:18 +00:00
switch ( status ) {
2022-11-17 02:50:14 +00:00
case PrinterFileSystem : : Initializing : icon = m_bmp_loading ; msg = _L ( " Initializing... " ) ; break ;
case PrinterFileSystem : : Connecting : icon = m_bmp_loading ; msg = _L ( " Connecting... " ) ; break ;
2023-05-23 07:28:33 +00:00
case PrinterFileSystem : : Failed : icon = m_bmp_failed ; if ( extra ! = 1 ) msg = _L ( " Connect failed [%d]! " ) ; break ;
2022-11-17 02:50:14 +00:00
case PrinterFileSystem : : ListSyncing : icon = m_bmp_loading ; msg = _L ( " Loading file list... " ) ; break ;
2023-05-23 07:28:33 +00:00
case PrinterFileSystem : : ListReady : icon = extra = = 0 ? m_bmp_empty : m_bmp_failed ; msg = extra = = 0 ? _L ( " No files [%d] " ) : _L ( " Load failed [%d] " ) ; break ;
2022-07-15 15:37:19 +00:00
}
2023-07-31 08:57:23 +00:00
if ( ! e . GetString ( ) . IsEmpty ( ) ) msg = e . GetString ( ) ;
2023-05-08 07:47:55 +00:00
if ( fs - > GetCount ( ) = = 0 & & ! msg . empty ( ) )
2022-07-15 15:37:19 +00:00
m_image_grid - > SetStatus ( icon , msg ) ;
2022-11-14 10:31:55 +00:00
if ( e . GetInt ( ) = = PrinterFileSystem : : Initializing )
fetchUrl ( boost : : weak_ptr ( fs ) ) ;
2023-02-15 03:32:18 +00:00
2023-05-08 07:47:55 +00:00
int err = fs - > GetLastError ( ) ;
if ( ( status = = PrinterFileSystem : : Failed & & m_last_errors . find ( err ) = = m_last_errors . end ( ) ) | |
status = = PrinterFileSystem : : ListReady ) {
2023-02-15 03:32:18 +00:00
json j ;
2023-05-08 07:47:55 +00:00
j [ " code " ] = err ;
2023-02-15 03:32:18 +00:00
j [ " dev_id " ] = m_machine ;
j [ " dev_ip " ] = m_lan_ip ;
NetworkAgent * agent = wxGetApp ( ) . getAgent ( ) ;
2023-05-08 07:47:55 +00:00
if ( status = = PrinterFileSystem : : Failed & & err ! = 0 ) {
2023-02-15 03:32:18 +00:00
j [ " result " ] = " failed " ;
if ( agent )
agent - > track_event ( " download_video_conn " , j . dump ( ) ) ;
} else if ( status = = PrinterFileSystem : : ListReady ) {
j [ " result " ] = " success " ;
if ( agent )
agent - > track_event ( " download_video_conn " , j . dump ( ) ) ;
}
2023-05-05 02:32:00 +00:00
m_last_errors . insert ( fs - > GetLastError ( ) ) ;
2023-02-15 03:32:18 +00:00
}
} ) ;
fs - > Bind ( EVT_DOWNLOAD , [ this , wfs = boost : : weak_ptr ( fs ) ] ( auto & e ) {
e . Skip ( ) ;
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
2023-07-04 07:40:10 +00:00
if ( fs = = nullptr | | m_image_grid - > GetFileSystem ( ) ! = fs ) // canceled
2023-02-15 03:32:18 +00:00
return ;
int result = e . GetExtraLong ( ) ;
2023-08-09 03:09:20 +00:00
if ( result > 1 & & ! e . GetString ( ) . IsEmpty ( ) )
MessageDialog ( this , e . GetString ( ) , _L ( " Download failed " ) , wxOK | wxICON_ERROR ) . ShowModal ( ) ;
2023-02-15 03:32:18 +00:00
NetworkAgent * agent = wxGetApp ( ) . getAgent ( ) ;
if ( result > 1 | | result = = 0 ) {
json j ;
j [ " code " ] = result ;
j [ " dev_id " ] = m_machine ;
j [ " dev_ip " ] = m_lan_ip ;
if ( result > 1 ) {
// download failed
j [ " result " ] = " failed " ;
if ( agent ) {
agent - > track_event ( " download_video " , j . dump ( ) ) ;
}
} else if ( result = = 0 ) {
// download success
j [ " result " ] = " success " ;
if ( agent ) {
agent - > track_event ( " download_video " , j . dump ( ) ) ;
}
}
}
return ;
2022-07-15 15:37:19 +00:00
} ) ;
if ( IsShown ( ) ) fs - > Start ( ) ;
}
wxCommandEvent e ( EVT_MODE_CHANGED ) ;
2022-07-22 09:46:10 +00:00
modeChanged ( e ) ;
2022-07-15 15:37:19 +00:00
}
2023-04-27 01:09:45 +00:00
void MediaFilePanel : : SwitchStorage ( bool external )
{
if ( m_external = = external )
return ;
m_external = external ;
m_type_panel - > Show ( external ) ;
if ( ! external ) {
Button * buttons [ ] { m_button_timelapse , m_button_video , m_button_model } ;
auto button = buttons [ PrinterFileSystem : : F_MODEL ] ;
wxCommandEvent event ( wxEVT_COMMAND_BUTTON_CLICKED , button - > GetId ( ) ) ;
event . SetEventObject ( button ) ;
wxPostEvent ( button , event ) ;
}
m_image_grid - > SetFileType ( m_last_type , m_external ? " " : " internal " ) ;
}
2022-07-15 15:37:19 +00:00
void MediaFilePanel : : Rescale ( )
{
m_bmp_loading . msw_rescale ( ) ;
m_bmp_failed . msw_rescale ( ) ;
m_bmp_empty . msw_rescale ( ) ;
auto top_sizer = GetSizer ( ) - > GetItem ( ( size_t ) 0 ) - > GetSizer ( ) ;
top_sizer - > SetMinSize ( { - 1 , 75 * em_unit ( this ) / 10 } ) ;
m_button_year - > Rescale ( ) ;
m_button_month - > Rescale ( ) ;
m_button_all - > Rescale ( ) ;
m_button_video - > Rescale ( ) ;
m_button_timelapse - > Rescale ( ) ;
2023-04-27 01:09:45 +00:00
m_button_model - > Rescale ( ) ;
2022-07-15 15:37:19 +00:00
m_type_panel - > SetMinSize ( { - 1 , 48 * em_unit ( this ) / 10 } ) ;
2022-12-09 10:19:15 +00:00
m_button_download - > Rescale ( ) ;
m_button_delete - > Rescale ( ) ;
2022-07-15 15:37:19 +00:00
m_button_management - > Rescale ( ) ;
m_image_grid - > Rescale ( ) ;
}
2022-10-14 01:25:17 +00:00
void MediaFilePanel : : SetSelecting ( bool selecting )
{
m_image_grid - > SetSelecting ( selecting ) ;
m_button_management - > SetLabel ( selecting ? _L ( " Cancel " ) : _L ( " Select " ) ) ;
m_manage_panel - > GetSizer ( ) - > Show ( m_button_download , selecting ) ;
m_manage_panel - > GetSizer ( ) - > Show ( m_button_delete , selecting ) ;
m_manage_panel - > Layout ( ) ;
}
2022-07-22 09:46:10 +00:00
void MediaFilePanel : : modeChanged ( wxCommandEvent & e1 )
2022-07-15 15:37:19 +00:00
{
e1 . Skip ( ) ;
auto fs = m_image_grid - > GetFileSystem ( ) ;
auto mode = fs ? fs - > GetGroupMode ( ) : 0 ;
if ( m_last_mode = = mode )
return ;
: : Button * buttons [ ] = { m_button_all , m_button_month , m_button_year } ;
auto b = buttons [ m_last_mode ] ;
2022-09-02 02:58:00 +00:00
b - > SetFont ( Label : : Body_14 ) ;
2022-09-19 01:50:34 +00:00
b - > SetValue ( false ) ;
2022-07-15 15:37:19 +00:00
b = buttons [ mode ] ;
2022-09-02 02:58:00 +00:00
b - > SetFont ( Label : : Head_14 ) ;
2022-09-19 01:50:34 +00:00
b - > SetValue ( true ) ;
2022-07-15 15:37:19 +00:00
m_last_mode = mode ;
}
void MediaFilePanel : : fetchUrl ( boost : : weak_ptr < PrinterFileSystem > wfs )
{
2022-11-14 10:31:55 +00:00
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
if ( ! fs | | fs ! = m_image_grid - > GetFileSystem ( ) ) return ;
2023-05-08 07:47:55 +00:00
if ( ! IsEnabled ( ) ) {
m_waiting_enable = true ;
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " Initialize failed (Device connection not ready)! " ) ) ;
fs - > SetUrl ( " 0 " ) ;
return ;
}
m_waiting_enable = false ;
2023-06-05 03:21:47 +00:00
if ( ! m_local_support & & ! m_remote_support ) {
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " Initialize failed (Not supported on the current printer version)! " ) ) ;
fs - > SetUrl ( " 0 " ) ;
return ;
}
2023-05-18 04:27:16 +00:00
if ( ( m_lan_mode | | ! m_remote_support ) & & m_local_support & & ! m_lan_ip . empty ( ) ) {
2023-08-03 02:19:35 +00:00
std : : string url = " bambu:///local/ " + m_lan_ip + " .?port=6000&user= " + m_lan_user + " &passwd= " + m_lan_passwd +
" &device= " + m_machine + " &dev_ver= " + m_dev_ver ;
2022-09-26 03:11:05 +00:00
fs - > SetUrl ( url ) ;
return ;
}
2023-05-08 07:47:55 +00:00
if ( m_lan_mode ) {
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " Initialize failed (Not accessible in LAN-only mode)! " ) ) ;
fs - > SetUrl ( " 0 " ) ;
2022-11-14 10:31:55 +00:00
return ;
}
2023-05-08 07:47:55 +00:00
if ( ! m_remote_support & & m_local_support ) { // not support tutk
m_image_grid - > SetStatus ( m_bmp_failed , _L ( " Initialize failed (Missing LAN ip of printer)! " ) ) ;
fs - > SetUrl ( " 1 " ) ;
2022-09-26 03:11:05 +00:00
return ;
}
NetworkAgent * agent = wxGetApp ( ) . getAgent ( ) ;
2022-07-15 15:37:19 +00:00
if ( agent ) {
agent - > get_camera_url ( m_machine ,
2023-08-03 02:19:35 +00:00
[ this , wfs , m = m_machine , v = m_dev_ver ] ( std : : string url ) {
2022-07-15 15:37:19 +00:00
BOOST_LOG_TRIVIAL ( info ) < < " MediaFilePanel::fetchUrl: camera_url: " < < url ;
2023-08-03 02:19:35 +00:00
CallAfter ( [ = ] {
2022-07-15 15:37:19 +00:00
boost : : shared_ptr fs ( wfs . lock ( ) ) ;
2022-07-22 09:46:10 +00:00
if ( ! fs | | fs ! = m_image_grid - > GetFileSystem ( ) ) return ;
2023-05-08 07:47:55 +00:00
if ( boost : : algorithm : : starts_with ( url , " bambu:/// " ) ) {
2023-08-03 02:19:35 +00:00
fs - > SetUrl ( url + " &device= " + m + " &dev_ver= " + v ) ;
2023-05-08 07:47:55 +00:00
} else {
m_image_grid - > SetStatus ( m_bmp_failed , wxString : : Format ( _L ( " Initialize failed (%s)! " ) , url . empty ( ) ? _L ( " Network unreachable " ) : from_u8 ( url ) ) ) ;
fs - > SetUrl ( " 3 " ) ;
}
2022-07-15 15:37:19 +00:00
} ) ;
} ) ;
}
}
2023-05-25 04:29:02 +00:00
struct MediaProgressDialog : ProgressDialog
{
MediaProgressDialog ( wxString title , wxWindow * parent , std : : function < void ( ) > cancel )
: ProgressDialog ( title , " " , 100 , parent , wxPD_NO_PROGRESS | wxPD_APP_MODAL | wxPD_CAN_ABORT )
, m_cancel ( cancel ) { }
void OnCancel ( ) override { m_cancel ( ) ; }
std : : function < void ( ) > m_cancel ;
} ;
2023-05-31 05:30:49 +00:00
void MediaFilePanel : : doAction ( size_t index , int action )
2023-04-27 01:09:45 +00:00
{
auto fs = m_image_grid - > GetFileSystem ( ) ;
if ( action = = 0 ) {
2023-05-23 07:28:33 +00:00
if ( index = = - 1 ) {
2023-04-27 01:09:45 +00:00
MessageDialog dlg ( this ,
2023-06-07 11:15:32 +00:00
wxString : : Format ( _L_PLURAL ( " You are going to delete %u file from printer. Are you sure to continue? " ,
" You are going to delete %u files from printer. Are you sure to continue? " , fs - > GetSelectCount ( ) ) ,
fs - > GetSelectCount ( ) ) ,
2023-04-27 01:09:45 +00:00
_L ( " Delete files " ) , wxYES_NO | wxICON_WARNING ) ;
2023-04-24 05:13:42 +00:00
if ( dlg . ShowModal ( ) ! = wxID_YES )
return ;
2023-05-23 07:28:33 +00:00
} else {
2023-04-24 05:13:42 +00:00
MessageDialog dlg ( this ,
2023-05-23 07:28:33 +00:00
wxString : : Format ( _L ( " Do you want to delete the file '%s' from printer? " ) , from_u8 ( fs - > GetFile ( index ) . name ) ) ,
2023-04-24 05:13:42 +00:00
_L ( " Delete file " ) , wxYES_NO | wxICON_WARNING ) ;
2023-04-27 01:09:45 +00:00
if ( dlg . ShowModal ( ) ! = wxID_YES )
return ;
}
fs - > DeleteFiles ( index ) ;
} else if ( action = = 1 ) {
if ( fs - > GetFileType ( ) = = PrinterFileSystem : : F_MODEL ) {
if ( index ! = - 1 ) {
2023-05-25 04:29:02 +00:00
auto dlg = new MediaProgressDialog ( _L ( " Print " ) , this , [ fs ] { fs - > FetchModelCancel ( ) ; } ) ;
dlg - > Update ( 0 , _L ( " Fetching model infomations ... " ) ) ;
fs - > FetchModel ( index , [ this , fs , dlg , index ] ( int result , std : : string const & data ) {
dlg - > Destroy ( ) ;
if ( result = = PrinterFileSystem : : ERROR_CANCEL )
return ;
2023-06-12 06:56:01 +00:00
if ( result ! = 0 ) {
2023-05-25 04:29:02 +00:00
MessageDialog ( this ,
_L ( " Failed to fetching model infomations from printer. " ) ,
_L ( " Error " ) , wxOK ) . ShowModal ( ) ;
2023-06-12 06:56:01 +00:00
return ;
}
2023-05-08 07:47:55 +00:00
Slic3r : : DynamicPrintConfig config ;
Slic3r : : Model model ;
Slic3r : : PlateDataPtrs plate_data_list ;
Slic3r : : Semver file_version ;
std : : istringstream is ( data ) ;
2023-06-06 08:30:46 +00:00
if ( ! Slic3r : : load_gcode_3mf_from_stream ( is , & config , & model , & plate_data_list , & file_version )
| | plate_data_list . empty ( ) ) {
2023-05-25 04:29:02 +00:00
MessageDialog ( this ,
_L ( " Failed to parse model infomations. " ) ,
_L ( " Error " ) , wxOK ) . ShowModal ( ) ;
2023-05-08 07:47:55 +00:00
return ;
2023-05-25 04:29:02 +00:00
}
2023-07-04 09:15:42 +00:00
2023-05-13 09:31:35 +00:00
auto & file = fs - > GetFile ( index ) ;
2023-07-04 09:15:42 +00:00
int gcode_file_count = Slic3r : : GUI : : wxGetApp ( ) . plater ( ) - > update_print_required_data ( config , model , plate_data_list , from_u8 ( file . name ) . ToStdString ( ) , file . path ) ;
2023-06-09 06:07:55 +00:00
if ( gcode_file_count > 0 ) {
wxPostEvent ( Slic3r : : GUI : : wxGetApp ( ) . plater ( ) , SimpleEvent ( EVT_PRINT_FROM_SDCARD_VIEW ) ) ;
}
else {
MessageDialog dlg ( this , _L ( " The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio and export a new .gcode.3mf file. " ) , wxEmptyString , wxICON_WARNING | wxOK ) ;
auto res = dlg . ShowModal ( ) ;
}
2023-04-27 01:09:45 +00:00
} ) ;
2023-05-31 05:30:49 +00:00
return ;
2023-04-27 01:09:45 +00:00
}
}
if ( index ! = - 1 ) {
auto & file = fs - > GetFile ( index ) ;
2023-06-06 08:30:46 +00:00
if ( file . IsDownload ( ) & & file . DownloadProgress ( ) > = - 1 ) {
if ( ! file . local_path . empty ( ) ) {
2023-04-27 01:09:45 +00:00
if ( ! fs - > DownloadCheckFile ( index ) ) {
MessageDialog ( this ,
wxString : : Format ( _L ( " File '%s' was lost! Please download it again. " ) , from_u8 ( file . name ) ) ,
_L ( " Error " ) , wxOK ) . ShowModal ( ) ;
Refresh ( ) ;
return ;
}
# ifdef __WXMSW__
auto wfile = boost : : filesystem : : path ( file . local_path ) . wstring ( ) ;
SHELLEXECUTEINFO info { sizeof ( info ) , 0 , NULL , NULL , wfile . c_str ( ) , L " " , SW_HIDE } ;
: : ShellExecuteEx ( & info ) ;
# else
wxShell ( " open " + file . local_path ) ;
# endif
} else {
fs - > DownloadCancel ( index ) ;
}
return ;
}
}
fs - > DownloadFiles ( index , wxGetApp ( ) . app_config - > get ( " download_path " ) ) ;
} else if ( action = = 2 ) {
if ( index ! = - 1 ) {
auto & file = fs - > GetFile ( index ) ;
2023-06-06 08:30:46 +00:00
if ( file . IsDownload ( ) & & file . DownloadProgress ( ) > = - 1 ) {
if ( ! file . local_path . empty ( ) ) {
2023-04-27 01:09:45 +00:00
if ( ! fs - > DownloadCheckFile ( index ) ) {
MessageDialog ( this ,
wxString : : Format ( _L ( " File '%s' was lost! Please download it again. " ) , from_u8 ( file . name ) ) ,
_L ( " Error " ) , wxOK ) . ShowModal ( ) ;
Refresh ( ) ;
return ;
}
2023-06-06 08:30:46 +00:00
desktop_open_any_folder ( file . local_path ) ;
2023-04-27 01:09:45 +00:00
} else if ( fs - > GetFileType ( ) = = PrinterFileSystem : : F_MODEL ) {
fs - > DownloadCancel ( index ) ;
}
return ;
}
}
fs - > DownloadFiles ( index , wxGetApp ( ) . app_config - > get ( " download_path " ) ) ;
}
}
2022-07-15 15:37:19 +00:00
MediaFileFrame : : MediaFileFrame ( wxWindow * parent )
: DPIFrame ( parent , wxID_ANY , " Media Files " , wxDefaultPosition , { 1600 , 900 } )
{
m_panel = new MediaFilePanel ( this ) ;
wxBoxSizer * sizer = new wxBoxSizer ( wxVERTICAL ) ;
sizer - > Add ( m_panel , 1 , wxEXPAND ) ;
SetSizer ( sizer ) ;
Bind ( wxEVT_CLOSE_WINDOW , [ this ] ( auto & e ) {
Hide ( ) ;
e . Veto ( ) ;
} ) ;
}
void MediaFileFrame : : on_dpi_changed ( const wxRect & suggested_rect ) { m_panel - > Rescale ( ) ; Refresh ( ) ; }
2022-08-09 09:52:55 +00:00
} }