2018-04-24 18:06:42 +02:00
#include "UpdateDialogs.hpp"
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/event.h>
#include <wx/stattext.h>
#include <wx/button.h>
#include <wx/hyperlink.h>
#include <wx/statbmp.h>
#include <wx/checkbox.h>
#include "libslic3r/libslic3r.h"
#include "libslic3r/Utils.hpp"
#include "GUI.hpp"
2018-04-27 12:29:18 +02:00
#include "ConfigWizard.hpp"
2018-04-24 18:06:42 +02:00
namespace Slic3r {
namespace GUI {
enum {
CONTENT_WIDTH = 400 ,
BORDER = 30 ,
VERT_SPACING = 15 ,
HORIZ_SPACING = 5 ,
};
MsgDialog :: MsgDialog ( const wxString & title , const wxString & headline , wxWindowID button_id ) :
MsgDialog ( title , headline , wxBitmap ( from_u8 ( Slic3r :: var ( "Slic3r_192px.png" )), wxBITMAP_TYPE_PNG ), button_id )
{}
MsgDialog :: MsgDialog ( const wxString & title , const wxString & headline , wxBitmap bitmap , wxWindowID button_id ) :
wxDialog ( nullptr , wxID_ANY , title ),
boldfont ( wxSystemSettings :: GetFont ( wxSYS_DEFAULT_GUI_FONT )),
content_sizer ( new wxBoxSizer ( wxVERTICAL )),
btn_sizer ( new wxBoxSizer ( wxHORIZONTAL ))
{
boldfont . SetWeight ( wxFONTWEIGHT_BOLD );
auto * topsizer = new wxBoxSizer ( wxHORIZONTAL );
auto * rightsizer = new wxBoxSizer ( wxVERTICAL );
auto * headtext = new wxStaticText ( this , wxID_ANY , headline );
headtext -> SetFont ( boldfont );
headtext -> Wrap ( CONTENT_WIDTH );
rightsizer -> Add ( headtext );
rightsizer -> AddSpacer ( VERT_SPACING );
rightsizer -> Add ( content_sizer );
if ( button_id != wxID_NONE ) {
auto * button = new wxButton ( this , button_id );
button -> SetFocus ();
btn_sizer -> Add ( button );
}
rightsizer -> Add ( btn_sizer , 0 , wxALIGN_CENTRE_HORIZONTAL );
auto * logo = new wxStaticBitmap ( this , wxID_ANY , std :: move ( bitmap ));
topsizer -> Add ( logo , 0 , wxALL , BORDER );
topsizer -> Add ( rightsizer , 0 , wxALL , BORDER );
SetSizerAndFit ( topsizer );
}
MsgDialog ::~ MsgDialog () {}
// MsgUpdateSlic3r
MsgUpdateSlic3r :: MsgUpdateSlic3r ( const Semver & ver_current , const Semver & ver_online ) :
MsgDialog ( _ ( L ( "Update available" )), _ ( L ( "New version of Slic3r PE is available" ))),
ver_current ( ver_current ),
ver_online ( ver_online )
{
const auto url = wxString :: Format ( "https://github.com/prusa3d/Slic3r/releases/tag/version_%s" , ver_online . to_string ());
auto * link = new wxHyperlinkCtrl ( this , wxID_ANY , url , url );
auto * text = new wxStaticText ( this , wxID_ANY , _ ( L ( "To download, follow the link below." )));
const auto link_width = link -> GetSize (). GetWidth ();
text -> Wrap ( CONTENT_WIDTH > link_width ? CONTENT_WIDTH : link_width );
content_sizer -> Add ( text );
content_sizer -> AddSpacer ( VERT_SPACING );
auto * versions = new wxFlexGridSizer ( 2 , 0 , VERT_SPACING );
versions -> Add ( new wxStaticText ( this , wxID_ANY , _ ( L ( "Current version:" ))));
versions -> Add ( new wxStaticText ( this , wxID_ANY , ver_current . to_string ()));
versions -> Add ( new wxStaticText ( this , wxID_ANY , _ ( L ( "New version:" ))));
versions -> Add ( new wxStaticText ( this , wxID_ANY , ver_online . to_string ()));
content_sizer -> Add ( versions );
content_sizer -> AddSpacer ( VERT_SPACING );
content_sizer -> Add ( link );
content_sizer -> AddSpacer ( 2 * VERT_SPACING );
cbox = new wxCheckBox ( this , wxID_ANY , _ ( L ( "Don't notify about new releases any more" )));
content_sizer -> Add ( cbox );
content_sizer -> AddSpacer ( VERT_SPACING );
Fit ();
}
MsgUpdateSlic3r ::~ MsgUpdateSlic3r () {}
bool MsgUpdateSlic3r :: disable_version_check () const
{
return cbox -> GetValue ();
}
// MsgUpdateConfig
MsgUpdateConfig :: MsgUpdateConfig ( const std :: unordered_map < std :: string , std :: string > & updates ) :
MsgDialog ( _ ( L ( "Configuration update" )), _ ( L ( "Configuration update is available" )), wxID_NONE )
{
auto * text = new wxStaticText ( this , wxID_ANY , _ ( L (
"Would you like to install it? \n\n "
"Note that a full configuration snapshot will be created first. It can then be restored at any time "
"should there be a problem with the new version. \n\n "
"Updated configuration bundles:"
)));
text -> Wrap ( CONTENT_WIDTH );
content_sizer -> Add ( text );
content_sizer -> AddSpacer ( VERT_SPACING );
auto * versions = new wxFlexGridSizer ( 2 , 0 , VERT_SPACING );
for ( const auto & update : updates ) {
auto * text_vendor = new wxStaticText ( this , wxID_ANY , update . first );
text_vendor -> SetFont ( boldfont );
versions -> Add ( text_vendor );
versions -> Add ( new wxStaticText ( this , wxID_ANY , update . second ));
}
content_sizer -> Add ( versions );
content_sizer -> AddSpacer ( 2 * VERT_SPACING );
auto * btn_cancel = new wxButton ( this , wxID_CANCEL );
btn_sizer -> Add ( btn_cancel );
btn_sizer -> AddSpacer ( HORIZ_SPACING );
2018-04-25 15:14:01 +02:00
auto * btn_ok = new wxButton ( this , wxID_OK );
2018-04-24 18:06:42 +02:00
btn_sizer -> Add ( btn_ok );
btn_ok -> SetFocus ();
Fit ();
}
MsgUpdateConfig ::~ MsgUpdateConfig () {}
// MsgDataIncompatible
2018-04-24 18:40:06 +02:00
MsgDataIncompatible :: MsgDataIncompatible ( const std :: unordered_map < std :: string , wxString > & incompats ) :
2018-04-24 18:06:42 +02:00
MsgDialog ( _ ( L ( "Slic3r incompatibility" )), _ ( L ( "Slic3r configuration is incompatible" )), wxBitmap ( from_u8 ( Slic3r :: var ( "Slic3r_192px_grayscale.png" ))), wxID_NONE )
{
auto * text = new wxStaticText ( this , wxID_ANY , _ ( L (
"This version of Slic3r PE is not compatible with currently installed configuration bundles. \n "
"This probably happened as a result of running an older Slic3r PE after using a newer one. \n\n "
2018-04-24 18:29:36 +02:00
"You may either exit Slic3r and try again with a newer version, or you may re-run the initial configuration. "
"Doing so will create a backup snapshot of the existing configuration before installing files compatible with this Slic3r. \n "
2018-04-24 18:06:42 +02:00
)));
text -> Wrap ( CONTENT_WIDTH );
content_sizer -> Add ( text );
auto * text2 = new wxStaticText ( this , wxID_ANY , wxString :: Format ( _ ( L ( "This Slic3r PE version: %s" )), SLIC3R_VERSION ));
text2 -> Wrap ( CONTENT_WIDTH );
content_sizer -> Add ( text2 );
content_sizer -> AddSpacer ( VERT_SPACING );
auto * text3 = new wxStaticText ( this , wxID_ANY , _ ( L ( "Incompatible bundles:" )));
text3 -> Wrap ( CONTENT_WIDTH );
content_sizer -> Add ( text3 );
content_sizer -> AddSpacer ( VERT_SPACING );
auto * versions = new wxFlexGridSizer ( 2 , 0 , VERT_SPACING );
for ( const auto & incompat : incompats ) {
auto * text_vendor = new wxStaticText ( this , wxID_ANY , incompat . first );
text_vendor -> SetFont ( boldfont );
versions -> Add ( text_vendor );
versions -> Add ( new wxStaticText ( this , wxID_ANY , incompat . second ));
}
content_sizer -> Add ( versions );
content_sizer -> AddSpacer ( 2 * VERT_SPACING );
auto * btn_exit = new wxButton ( this , wxID_EXIT , _ ( L ( "Exit Slic3r" )));
btn_sizer -> Add ( btn_exit );
btn_sizer -> AddSpacer ( HORIZ_SPACING );
auto * btn_reconf = new wxButton ( this , wxID_REPLACE , _ ( L ( "Re-configure" )));
btn_sizer -> Add ( btn_reconf );
btn_exit -> SetFocus ();
auto exiter = [ this ]( const wxCommandEvent & evt ) { this -> EndModal ( evt . GetId ()); };
btn_exit -> Bind ( wxEVT_BUTTON , exiter );
btn_reconf -> Bind ( wxEVT_BUTTON , exiter );
Fit ();
}
MsgDataIncompatible ::~ MsgDataIncompatible () {}
2018-04-27 12:29:18 +02:00
// MsgDataLegacy
MsgDataLegacy :: MsgDataLegacy () :
MsgDialog ( _ ( L ( "Configuration update" )), _ ( L ( "Configuration update" )))
{
auto * text = new wxStaticText ( this , wxID_ANY , wxString :: Format (
_ ( L (
"Slic3r PE now uses an updated configuration structure. \n\n "
"So called 'System presets' have been introduced, which hold the built-in default settings for various "
"printers. These System presets cannot be modified, instead, users now may create their "
"own presets inheriting settings from one of the System presets. \n "
"An inheriting preset may either inherit a particular value from its parent or override it with a customized value. \n\n "
"Please proceed with the %s that follows to set up the new presets "
"and to choose whether to enable automatic preset updates."
)),
ConfigWizard :: name ()
));
text -> Wrap ( CONTENT_WIDTH );
content_sizer -> Add ( text );
content_sizer -> AddSpacer ( VERT_SPACING );
// TODO: Add link to wiki?
Fit ();
}
MsgDataLegacy ::~ MsgDataLegacy () {}
2018-04-24 18:06:42 +02:00
}
}