2016-09-14 11:22:41 +02:00
# The config wizard is executed when the Slic3r is first started.
# The wizard helps the user to specify the 3D printer properties.
2012-06-26 17:42:29 +02:00
package Slic3r::GUI::ConfigWizard ;
use strict ;
use warnings ;
use utf8 ;
2012-07-03 17:21:32 +02:00
use Wx ;
2012-06-26 17:42:29 +02:00
use base 'Wx::Wizard' ;
2012-07-16 18:34:44 +02:00
# adhere to various human interface guidelines
our $wizard = 'Wizard' ;
$wizard = 'Assistant' if & Wx:: wxMAC || & Wx:: wxGTK ;
2012-06-26 17:42:29 +02:00
sub new {
2017-12-19 19:51:22 +01:00
my ( $class , $parent , $presets , $fresh_start ) = @_ ;
2012-07-16 18:34:44 +02:00
my $self = $class -> SUPER:: new ( $parent , - 1 , "Configuration $wizard" );
2012-06-26 17:42:29 +02:00
2012-07-28 11:34:12 +02:00
# initialize an empty repository
$self -> { config } = Slic3r::Config -> new ;
2012-06-30 23:56:11 +02:00
2017-12-19 19:51:22 +01:00
my $welcome_page = Slic3r::GUI::ConfigWizard::Page::Welcome -> new ( $self , $fresh_start );
2017-12-10 13:19:44 +01:00
$self -> add_page ( $welcome_page );
2012-06-26 17:42:29 +02:00
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Firmware -> new ( $self ));
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Bed -> new ( $self ));
2012-06-27 17:59:29 +02:00
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Nozzle -> new ( $self ));
2012-06-26 17:42:29 +02:00
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Filament -> new ( $self ));
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Temperature -> new ( $self ));
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::BedTemperature -> new ( $self ));
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Finished -> new ( $self ));
2012-07-03 17:21:32 +02:00
$_ -> build_index for @ { $self -> { pages }};
2017-12-10 13:19:44 +01:00
$welcome_page -> set_selection_presets ([ @ { $presets }, 'Other' ]);
2012-06-26 17:42:29 +02:00
return $self ;
}
sub add_page {
2017-12-10 13:19:44 +01:00
my ( $self , $page ) = @_ ;
2012-06-26 17:42:29 +02:00
my $n = push @ { $self -> { pages }}, $page ;
# add first page to the page area sizer
$self -> GetPageAreaSizer -> Add ( $page ) if $n == 1 ;
# link pages
$self -> { pages }[ $n - 2 ] -> set_next_page ( $page ) if $n >= 2 ;
$page -> set_previous_page ( $self -> { pages }[ $n - 2 ]) if $n >= 2 ;
}
sub run {
2017-12-10 13:19:44 +01:00
my ( $self ) = @_ ;
2017-12-19 19:51:22 +01:00
my $result ;
2012-07-01 00:10:48 +02:00
if ( Wx::Wizard:: RunWizard ( $self , $self -> { pages }[ 0 ])) {
2017-12-10 13:19:44 +01:00
my $preset_name = $self -> { pages }[ 0 ] -> { preset_name };
2017-12-19 19:51:22 +01:00
$result = {
preset_name => $preset_name ,
reset_user_profile => $self -> { pages }[ 0 ] -> { reset_user_profile }
};
2017-12-10 13:19:44 +01:00
if ( $preset_name eq 'Other' ) {
# it would be cleaner to have these defined inside each page class,
# in some event getting called before leaving the page
2012-07-28 11:34:12 +02:00
# set first_layer_height + layer_height based on nozzle_diameter
my $nozzle = $self -> { config } -> nozzle_diameter ;
$self -> { config } -> set ( 'first_layer_height' , $nozzle -> [ 0 ]);
$self -> { config } -> set ( 'layer_height' , $nozzle -> [ 0 ] - 0.1 );
# set first_layer_temperature to temperature + 5
$self -> { config } -> set ( 'first_layer_temperature' , [ $self -> { config } -> temperature -> [ 0 ] + 5 ]);
# set first_layer_bed_temperature to temperature + 5
2013-09-21 20:14:17 +02:00
$self -> { config } -> set ( 'first_layer_bed_temperature' ,
2017-06-21 16:15:39 +02:00
[ ( $self -> { config } -> bed_temperature -> [ 0 ] > 0 ) ? ( $self -> { config } -> bed_temperature -> [ 0 ] + 5 ) : 0 ]);
2017-12-19 19:51:22 +01:00
$result -> { config } = $self -> { config };
2012-06-26 17:42:29 +02:00
}
}
2017-12-10 13:19:44 +01:00
$self -> Destroy ;
return $result ;
2012-06-26 17:42:29 +02:00
}
2012-07-03 17:21:32 +02:00
package Slic3r::GUI::ConfigWizard::Index ;
2012-07-08 19:41:13 +02:00
use Wx qw(:bitmap :dc :font :misc :sizer :systemsettings :window) ;
use Wx::Event qw(EVT_ERASE_BACKGROUND EVT_PAINT) ;
2012-07-03 17:21:32 +02:00
use base 'Wx::Panel' ;
2012-06-26 17:42:29 +02:00
sub new {
my $class = shift ;
my ( $parent , $title ) = @_ ;
my $self = $class -> SUPER:: new ( $parent );
2012-07-08 19:41:13 +02:00
push @ { $self -> { titles }}, $title ;
$self -> { own_index } = 0 ;
2012-07-03 17:21:32 +02:00
2017-10-25 12:53:31 +02:00
$self -> { bullets } -> { before } = Wx::Bitmap -> new ( Slic3r:: var ( "bullet_black.png" ), wxBITMAP_TYPE_PNG );
$self -> { bullets } -> { own } = Wx::Bitmap -> new ( Slic3r:: var ( "bullet_blue.png" ), wxBITMAP_TYPE_PNG );
$self -> { bullets } -> { after } = Wx::Bitmap -> new ( Slic3r:: var ( "bullet_white.png" ), wxBITMAP_TYPE_PNG );
2012-07-03 17:21:32 +02:00
2017-10-25 12:53:31 +02:00
$self -> { background } = Wx::Bitmap -> new ( Slic3r:: var ( "Slic3r_192px_transparent.png" ), wxBITMAP_TYPE_PNG );
2012-07-04 00:03:05 +02:00
$self -> SetMinSize ( Wx::Size -> new ( $self -> { background } -> GetWidth , $self -> { background } -> GetHeight ));
2012-07-08 19:41:13 +02:00
EVT_PAINT ( $self , \& repaint );
2012-07-04 00:03:05 +02:00
2012-07-03 17:21:32 +02:00
return $self ;
}
2012-07-08 19:41:13 +02:00
sub repaint {
2012-07-04 00:03:05 +02:00
my ( $self , $event ) = @_ ;
2012-07-08 19:41:13 +02:00
my $size = $self -> GetClientSize ;
2012-07-22 15:06:56 +02:00
my $gap = 5 ;
2012-07-04 00:03:05 +02:00
2012-07-08 19:41:13 +02:00
my $dc = Wx::PaintDC -> new ( $self );
$dc -> SetBackgroundMode ( wxTRANSPARENT );
$dc -> SetFont ( $self -> GetFont );
$dc -> SetTextForeground ( $self -> GetForegroundColour );
my $background_h = $self -> { background } -> GetHeight ;
my $background_w = $self -> { background } -> GetWidth ;
$dc -> DrawBitmap ( $self -> { background }, ( $size -> GetWidth - $background_w ) / 2, ($size->GetHeight - $background_h) / 2 , 1 );
my $label_h = $self -> { bullets } -> { own } -> GetHeight ;
$label_h = $dc -> GetCharHeight if $dc -> GetCharHeight > $label_h ;
my $label_w = $size -> GetWidth ;
my $i = 0 ;
foreach ( @ { $self -> { titles }}) {
my $bullet = $self -> { bullets } -> { own };
$bullet = $self -> { bullets } -> { before } if $i < $self -> { own_index };
$bullet = $self -> { bullets } -> { after } if $i > $self -> { own_index };
$dc -> SetTextForeground ( Wx::Colour -> new ( 128 , 128 , 128 )) if $i > $self -> { own_index };
2012-07-22 15:06:56 +02:00
$dc -> DrawLabel ( $_ , $bullet , Wx::Rect -> new ( 0 , $i * ( $label_h + $gap ), $label_w , $label_h ));
2017-12-10 13:19:44 +01:00
# Only show the first bullet if this is the only wizard page to be displayed.
last if $i == 0 && $self -> { just_welcome };
2012-07-08 19:41:13 +02:00
$i ++ ;
2012-07-04 00:03:05 +02:00
}
2012-07-08 19:41:13 +02:00
$event -> Skip ;
2012-07-04 00:03:05 +02:00
}
2012-07-03 17:21:32 +02:00
sub prepend_title {
my $self = shift ;
my ( $title ) = @_ ;
2012-07-08 19:41:13 +02:00
unshift @ { $self -> { titles }}, $title ;
$self -> { own_index } ++ ;
$self -> Refresh ;
2012-07-03 17:21:32 +02:00
}
sub append_title {
my $self = shift ;
my ( $title ) = @_ ;
2012-07-08 19:41:13 +02:00
push @ { $self -> { titles }}, $title ;
$self -> Refresh ;
2012-07-03 17:21:32 +02:00
}
package Slic3r::GUI::ConfigWizard::Page ;
use Wx qw(:font :misc :sizer :staticline :systemsettings) ;
use base 'Wx::WizardPage' ;
sub new {
my $class = shift ;
my ( $parent , $title , $short_title ) = @_ ;
my $self = $class -> SUPER:: new ( $parent );
my $sizer = Wx::FlexGridSizer -> new ( 0 , 2 , 10 , 10 );
2012-07-04 00:03:05 +02:00
$sizer -> AddGrowableCol ( 1 , 1 );
$sizer -> AddGrowableRow ( 1 , 1 );
2012-07-03 17:21:32 +02:00
$sizer -> AddStretchSpacer ( 0 );
$self -> SetSizer ( $sizer );
2012-06-26 17:42:29 +02:00
# title
2012-06-30 23:28:07 +02:00
my $text = Wx::StaticText -> new ( $self , - 1 , $title , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT );
my $bold_font = Wx::SystemSettings:: GetFont ( wxSYS_DEFAULT_GUI_FONT );
$bold_font -> SetWeight ( wxFONTWEIGHT_BOLD );
2012-06-26 17:42:29 +02:00
$bold_font -> SetPointSize ( 14 );
$text -> SetFont ( $bold_font );
2012-07-03 17:21:32 +02:00
$sizer -> Add ( $text , 0 , wxALIGN_LEFT , 0 );
# index
$self -> { short_title } = $short_title ? $short_title : $title ;
$self -> { index } = Slic3r::GUI::ConfigWizard::Index -> new ( $self , $self -> { short_title });
2012-07-04 00:03:05 +02:00
$sizer -> Add ( $self -> { index }, 1 , wxEXPAND | wxTOP | wxRIGHT , 10 );
2012-07-03 17:21:32 +02:00
# contents
2012-08-02 23:08:40 +02:00
$self -> { width } = 430 ;
2012-07-03 17:21:32 +02:00
$self -> { vsizer } = Wx::BoxSizer -> new ( wxVERTICAL );
2012-08-02 23:07:42 +02:00
$sizer -> Add ( $self -> { vsizer }, 1 );
2012-06-26 17:42:29 +02:00
return $self ;
}
sub append_text {
my $self = shift ;
my ( $text ) = @_ ;
2012-06-30 23:28:07 +02:00
my $para = Wx::StaticText -> new ( $self , - 1 , $text , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT );
2012-06-26 17:42:29 +02:00
$para -> Wrap ( $self -> { width });
2012-07-03 17:21:32 +02:00
$para -> SetMinSize ([ $self -> { width }, - 1 ]);
$self -> { vsizer } -> Add ( $para , 0 , wxALIGN_LEFT | wxTOP | wxBOTTOM , 10 );
2012-06-26 17:42:29 +02:00
}
sub append_option {
my $self = shift ;
2012-07-28 11:34:12 +02:00
my ( $full_key ) = @_ ;
# populate repository with the factory default
2014-09-23 20:00:51 +02:00
my ( $opt_key , $opt_index ) = split /#/ , $full_key , 2 ;
2017-10-27 22:49:59 +02:00
$self -> config -> apply ( Slic3r::Config:: new_from_defaults_keys ([ $opt_key ]));
2012-07-28 11:34:12 +02:00
# draw the control
my $optgroup = Slic3r::GUI::ConfigOptionsGroup -> new (
parent => $self ,
title => '' ,
2014-06-16 20:11:52 +02:00
config => $self -> config ,
2013-09-21 20:25:34 +02:00
full_labels => 1 ,
2012-07-28 11:34:12 +02:00
);
2014-09-23 20:00:51 +02:00
$optgroup -> append_single_option_line ( $opt_key , $opt_index );
2012-07-28 11:34:12 +02:00
$self -> { vsizer } -> Add ( $optgroup -> sizer , 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 );
2012-06-26 17:42:29 +02:00
}
2014-06-16 20:11:52 +02:00
sub append_panel {
my ( $self , $panel ) = @_ ;
$self -> { vsizer } -> Add ( $panel , 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 );
}
2012-06-26 17:42:29 +02:00
sub set_previous_page {
my $self = shift ;
my ( $previous_page ) = @_ ;
$self -> { previous_page } = $previous_page ;
}
sub GetPrev {
my $self = shift ;
return $self -> { previous_page };
}
sub set_next_page {
my $self = shift ;
my ( $next_page ) = @_ ;
$self -> { next_page } = $next_page ;
}
sub GetNext {
my $self = shift ;
return $self -> { next_page };
}
2012-07-03 17:21:32 +02:00
sub get_short_title {
my $self = shift ;
return $self -> { short_title };
}
sub build_index {
my $self = shift ;
my $page = $self ;
$self -> { index } -> prepend_title ( $page -> get_short_title ) while ( $page = $page -> GetPrev );
$page = $self ;
$self -> { index } -> append_title ( $page -> get_short_title ) while ( $page = $page -> GetNext );
}
2014-06-16 20:11:52 +02:00
sub config {
my ( $self ) = @_ ;
return $self -> GetParent -> { config };
}
2012-06-26 17:42:29 +02:00
package Slic3r::GUI::ConfigWizard::Page::Welcome ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
2017-12-10 13:19:44 +01:00
use Wx qw(:misc :sizer wxID_FORWARD) ;
2017-12-19 19:51:22 +01:00
use Wx::Event qw(EVT_ACTIVATE EVT_CHOICE EVT_CHECKBOX) ;
2012-06-26 17:42:29 +02:00
sub new {
2017-12-19 19:51:22 +01:00
my ( $class , $parent , $fresh_start ) = @_ ;
2012-07-16 18:34:44 +02:00
my $self = $class -> SUPER:: new ( $parent , "Welcome to the Slic3r Configuration $wizard" , 'Welcome' );
2017-12-10 13:19:44 +01:00
$self -> { full_wizard_workflow } = 1 ;
2017-12-19 19:51:22 +01:00
$self -> { reset_user_profile } = 0 ;
2012-06-26 17:42:29 +02:00
2017-12-14 13:47:22 +01:00
# Test for the existence of the old config path.
my $message_has_legacy ;
{
my $datadir = Slic3r:: data_dir ;
if ( $datadir =~ /Slic3rPE/ ) {
# Check for existence of the legacy Slic3r directory.
my $datadir_legacy = substr $datadir , 0 , - 2 ;
my $dir_enc = Slic3r:: encode_path ( $datadir_legacy );
if ( - e $dir_enc && - d $dir_enc &&
- e ( $dir_enc . '/print' ) && - d ( $dir_enc . '/print' ) &&
- e ( $dir_enc . '/filament' ) && - d ( $dir_enc . '/filament' ) &&
- e ( $dir_enc . '/printer' ) && - d ( $dir_enc . '/printer' ) &&
- e ( $dir_enc . '/slic3r.ini' )) {
$message_has_legacy = "Starting with Slic3r 1.38.4, the user profile directory has been renamed to $datadir. You may consider closing Slic3r and renaming $datadir_legacy to $datadir." ;
}
}
}
2017-12-10 13:19:44 +01:00
$self -> append_text ( 'Hello, welcome to Slic3r Prusa Edition! This ' . lc ( $wizard ) . ' helps you with the initial configuration; just a few settings and you will be ready to print.' );
$self -> append_text ( 'Please select your printer vendor and printer type. If your printer is not listed, you may try your luck and select a similar one. If you select "Other", this ' . lc ( $wizard ) . ' will let you set the basic 3D printer parameters.' );
2017-12-14 13:47:22 +01:00
$self -> append_text ( $message_has_legacy ) if defined $message_has_legacy ;
2017-12-10 13:19:44 +01:00
# To import an existing configuration instead, cancel this '.lc($wizard).' and use the Open Config menu item found in the File menu.');
$self -> append_text ( 'If you received a configuration file or a config bundle from your 3D printer vendor, cancel this ' . lc ( $wizard ) . ' and use the "File->Load Config" or "File->Load Config Bundle" menu.' );
$self -> { choice } = my $choice = Wx::Choice -> new ( $self , - 1 , wxDefaultPosition , wxDefaultSize , [] );
$self -> { vsizer } -> Add ( $choice , 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 );
2017-12-19 19:51:22 +01:00
if ( ! $fresh_start ) {
$self -> { reset_checkbox } = Wx::CheckBox -> new ( $self , - 1 , "Reset user profile, install from scratch" );
$self -> { vsizer } -> Add ( $self -> { reset_checkbox }, 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 );
}
2017-12-10 13:19:44 +01:00
EVT_CHOICE ( $parent , $choice , sub {
my $sel = $self -> { choice } -> GetStringSelection ;
$self -> { preset_name } = $sel ;
$self -> set_full_wizard_workflow (( $sel eq 'Other' ) || ( $sel eq '' ));
});
2017-12-19 19:51:22 +01:00
if ( ! $fresh_start ) {
EVT_CHECKBOX ( $self , $self -> { reset_checkbox }, sub {
$self -> { reset_user_profile } = $self -> { reset_checkbox } -> GetValue ();
});
}
2017-12-10 13:19:44 +01:00
EVT_ACTIVATE ( $parent , sub {
$self -> set_full_wizard_workflow ( $self -> { preset_name } eq 'Other' );
});
2012-06-26 17:42:29 +02:00
return $self ;
}
2017-12-10 13:19:44 +01:00
sub set_full_wizard_workflow {
my ( $self , $full_workflow ) = @_ ;
$self -> { full_wizard_workflow } = $full_workflow ;
$self -> { index } -> { just_welcome } = ! $full_workflow ;
$self -> { index } -> Refresh ;
my $next_button = $self -> GetParent -> FindWindow ( wxID_FORWARD );
$next_button -> SetLabel ( $full_workflow ? "&Next >" : "&Finish" );
}
# Set the preset names, select the first item.
sub set_selection_presets {
my ( $self , $names ) = @_ ;
$self -> { choice } -> Append ( $names );
$self -> { choice } -> SetSelection ( 0 );
$self -> { preset_name } = $names -> [ 0 ];
}
sub GetNext {
my $self = shift ;
return $self -> { full_wizard_workflow } ? $self -> { next_page } : undef ;
}
2012-06-26 17:42:29 +02:00
package Slic3r::GUI::ConfigWizard::Page::Firmware ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Firmware Type' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Choose the type of firmware used by your printer, then click Next.' );
2012-06-26 17:42:29 +02:00
$self -> append_option ( 'gcode_flavor' );
return $self ;
}
package Slic3r::GUI::ConfigWizard::Page::Bed ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Bed Size' );
2014-06-16 20:11:52 +02:00
$self -> append_text ( 'Set the shape of your printer\'s bed, then click Next.' );
2017-10-27 22:49:59 +02:00
$self -> config -> apply ( Slic3r::Config:: new_from_defaults_keys ([ 'bed_shape' ]));
2014-06-16 20:11:52 +02:00
$self -> { bed_shape_panel } = my $panel = Slic3r::GUI::BedShapePanel -> new ( $self , $self -> config -> bed_shape );
$self -> { bed_shape_panel } -> on_change ( sub {
$self -> config -> set ( 'bed_shape' , $self -> { bed_shape_panel } -> GetValue );
});
$self -> append_panel ( $self -> { bed_shape_panel });
2012-06-26 17:42:29 +02:00
return $self ;
}
2012-06-27 17:59:29 +02:00
package Slic3r::GUI::ConfigWizard::Page::Nozzle ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Nozzle Diameter' );
2014-06-16 20:11:52 +02:00
$self -> append_text ( 'Enter the diameter of your printer\'s hot end nozzle, then click Next.' );
2012-07-19 22:56:38 +02:00
$self -> append_option ( 'nozzle_diameter#0' );
2012-06-27 17:59:29 +02:00
return $self ;
}
2012-06-26 17:42:29 +02:00
package Slic3r::GUI::ConfigWizard::Page::Filament ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Filament Diameter' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Enter the diameter of your filament, then click Next.' );
$self -> append_text ( 'Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.' );
2012-07-19 22:56:38 +02:00
$self -> append_option ( 'filament_diameter#0' );
2012-06-26 17:42:29 +02:00
return $self ;
}
package Slic3r::GUI::ConfigWizard::Page::Temperature ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Extrusion Temperature' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Enter the temperature needed for extruding your filament, then click Next.' );
2012-07-16 18:34:44 +02:00
$self -> append_text ( 'A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS.' );
2012-07-19 22:56:38 +02:00
$self -> append_option ( 'temperature#0' );
2012-06-26 17:42:29 +02:00
return $self ;
}
package Slic3r::GUI::ConfigWizard::Page::BedTemperature ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , 'Bed Temperature' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Enter the bed temperature needed for getting your filament to stick to your heated bed, then click Next.' );
2013-09-21 20:14:17 +02:00
$self -> append_text ( 'A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed.' );
2017-06-21 16:15:39 +02:00
$self -> append_option ( 'bed_temperature#0' );
2013-09-21 20:25:34 +02:00
2012-06-26 17:42:29 +02:00
return $self ;
}
package Slic3r::GUI::ConfigWizard::Page::Finished ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
2012-07-03 17:21:32 +02:00
my $self = $class -> SUPER:: new ( $parent , 'Congratulations!' , 'Finish' );
2012-06-26 17:42:29 +02:00
2012-07-16 18:34:44 +02:00
$self -> append_text ( "You have successfully completed the Slic3r Configuration $wizard. " .
2012-06-27 23:20:29 +02:00
'Slic3r is now configured for your printer and filament.' );
2012-07-16 18:34:44 +02:00
$self -> append_text ( 'To close this ' . lc ( $wizard ) . ' and apply the newly created configuration, click Finish.' );
2012-06-26 17:42:29 +02:00
return $self ;
}
1 ;