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 {
my $class = shift ;
my ( $parent ) = @_ ;
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
2012-06-26 17:42:29 +02:00
$self -> add_page ( Slic3r::GUI::ConfigWizard::Page::Welcome -> new ( $self ));
$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 }};
2012-06-26 17:42:29 +02:00
return $self ;
}
sub add_page {
my $self = shift ;
my ( $page ) = @_ ;
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 {
my $self = shift ;
2012-07-28 11:34:12 +02:00
2012-07-01 00:10:48 +02:00
if ( Wx::Wizard:: RunWizard ( $self , $self -> { pages }[ 0 ])) {
2012-07-28 11:34:12 +02:00
# it would be cleaner to have these defined inside each page class,
# in some event getting called before leaving the page
{
# set print_center to centre of bed_size
my $bed_size = $self -> { config } -> bed_size ;
$self -> { config } -> set ( 'print_center' , [ $bed_size -> [ 0 ] /2, $bed_size->[1]/ 2 ]);
# 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
$self -> { config } -> set ( 'first_layer_bed_temperature' , $self -> { config } -> bed_temperature + 5 );
2012-06-26 17:42:29 +02:00
}
2012-07-28 11:34:12 +02:00
$self -> Destroy ;
return $self -> { config };
2012-06-26 17:42:29 +02:00
} else {
2012-07-28 11:34:12 +02:00
$self -> Destroy ;
return undef ;
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
2012-07-08 19:41:13 +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
2012-07-04 00:03:05 +02:00
$self -> { background } = Wx::Bitmap -> new ( "$Slic3r::var/Slic3r_192px_transparent.png" , wxBITMAP_TYPE_PNG );
$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 ));
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
$self -> { width } = 400 ;
$self -> { vsizer } = Wx::BoxSizer -> new ( wxVERTICAL );
2012-07-04 00:03:05 +02:00
$sizer -> Add ( $self -> { vsizer }, 1 , wxEXPAND , 0 );
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
my $opt_key = $full_key ;
$opt_key =~ s/#.+// ;
$self -> GetParent -> { config } -> apply ( Slic3r::Config -> new_from_defaults ( $opt_key ));
# draw the control
my $optgroup = Slic3r::GUI::ConfigOptionsGroup -> new (
parent => $self ,
title => '' ,
config => $self -> GetParent -> { config },
options => [ $full_key ],
);
$self -> { vsizer } -> Add ( $optgroup -> sizer , 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 );
}
2012-06-26 17:42:29 +02:00
package Slic3r::GUI::ConfigWizard::Page::Welcome ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
2012-07-16 18:34:44 +02:00
my $self = $class -> SUPER:: new ( $parent , "Welcome to the Slic3r Configuration $wizard" , 'Welcome' );
2012-06-26 17:42:29 +02:00
2012-07-16 18:34:44 +02:00
$self -> append_text ( 'Hello, welcome to Slic3r! This ' . lc ( $wizard ) . ' helps you with the initial configuration; just a few settings and you will be ready to print.' );
$self -> append_text ( 'To import an existing configuration instead, cancel this ' . lc ( $wizard ) . ' and use the Open Config menu item found in the File menu.' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'To continue, click Next.' );
2012-06-26 17:42:29 +02:00
return $self ;
}
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' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Enter the size of your printers bed, then click Next.' );
2012-06-26 17:42:29 +02:00
$self -> append_option ( 'bed_size' );
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' );
2012-06-27 19:41:37 +02:00
$self -> append_text ( 'Enter the diameter of your printers 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.' );
$self -> append_text ( 'A rule of thumb is 60 °C for PLA and 110 °C for ABS.' );
2012-06-26 17:42:29 +02:00
$self -> append_option ( 'bed_temperature' );
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 ;