From 9fb62e671feca02b49ab3a8a9b52a5303152bcc6 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 22 Dec 2013 01:27:09 +0100 Subject: [PATCH] Adapt GUI to new XS Config --- lib/Slic3r/Config.pm | 21 +++++++++++++++------ lib/Slic3r/GUI/OptionsGroup.pm | 14 +++++++++++--- lib/Slic3r/GUI/Plater.pm | 13 ++++++++++++- lib/Slic3r/GUI/SkeinPanel.pm | 2 +- lib/Slic3r/GUI/Tab.pm | 7 +++++-- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index 9dadbe4b..e722ff9f 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -21,9 +21,15 @@ our $Options = print_config_def(); sub new_from_defaults { my $class = shift; + my (@opt_keys) = @_; my $self = $class->new; - $self->apply_static(Slic3r::Config::Print->new); + my $defaults = Slic3r::Config::Print->new; + if (@opt_keys) { + $self->set($_, $defaults->get($_)) for @opt_keys; + } else { + $self->apply_static($defaults); + } return $self; } @@ -71,7 +77,12 @@ sub load { my $ini = __PACKAGE__->read_ini($file); my $config = __PACKAGE__->new; - $config->set_deserialize(handle_legacy($_, $ini->{_}{$_})) for keys %{$ini->{_}}; + foreach my $opt_key (keys %{$ini->{_}}) { + print "key: $opt_key\n"; + ($opt_key, my $value) = handle_legacy($opt_key, $ini->{_}{$opt_key}); + next if !defined $opt_key; + $config->set_deserialize($opt_key, $value); + } return $config; } @@ -97,7 +108,7 @@ sub handle_legacy { my ($opt_key, $value) = @_; # handle legacy options - return if first { $_ eq $opt_key } @Ignore; + return ($opt_key, $value) if first { $_ eq $opt_key } @Ignore; if ($opt_key =~ /^(extrusion_width|bottom_layer_speed|first_layer_height)_ratio$/) { $opt_key = $1; $opt_key =~ s/^bottom_layer_speed$/first_layer_speed/; @@ -125,7 +136,7 @@ sub handle_legacy { my @keys = grep { $Options->{$_}{aliases} && grep $_ eq $opt_key, @{$Options->{$_}{aliases}} } keys %$Options; if (!@keys) { warn "Unknown option $opt_key\n"; - return; + return (); } $opt_key = $keys[0]; } @@ -173,8 +184,6 @@ sub validate { # -j, --threads die "Invalid value for --threads\n" if $self->threads < 1; - die "Your perl wasn't built with multithread support\n" - if $self->threads > 1 && !$Slic3r::have_threads; # --layer-height die "Invalid value for --layer-height\n" diff --git a/lib/Slic3r/GUI/OptionsGroup.pm b/lib/Slic3r/GUI/OptionsGroup.pm index 61a3b7a5..d849405b 100644 --- a/lib/Slic3r/GUI/OptionsGroup.pm +++ b/lib/Slic3r/GUI/OptionsGroup.pm @@ -381,9 +381,17 @@ sub _set_config { my ($opt_key, $index, $value) = @_; my ($get_m, $serialized) = $self->_config_methods($opt_key, $index); - defined $index - ? $self->config->$get_m($opt_key)->[$index] = $value - : $self->config->set($opt_key, $value, $serialized); + if (defined $index) { + my $values = $self->config->$get_m($opt_key); + $values->[$index] = $value; + $self->config->set($opt_key, $values); + } else { + if ($serialized) { + $self->config->set_deserialize($opt_key, $value); + } else { + $self->config->set($opt_key, $value); + } + } } sub _config_methods { diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index ee90576d..820cb716 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -686,6 +686,9 @@ sub export_gcode { catch_error => sub { Slic3r::GUI::catch_error($self, @_) && $self->on_export_failed }, ); } + + # this method gets executed in a separate thread by wxWidgets since it's a button handler + Slic3r::thread_cleanup() if $Slic3r::have_threads; } sub export_gcode2 { @@ -766,6 +769,9 @@ sub export_stl { my $output_file = $self->_get_export_file('STL') or return; Slic3r::Format::STL->write_file($output_file, $self->make_model, binary => 1); $self->statusbar->SetStatusText("STL file exported to $output_file"); + + # this method gets executed in a separate thread by wxWidgets since it's a button handler + Slic3r::thread_cleanup() if $Slic3r::have_threads; } sub export_amf { @@ -774,6 +780,9 @@ sub export_amf { my $output_file = $self->_get_export_file('AMF') or return; Slic3r::Format::AMF->write_file($output_file, $self->make_model); $self->statusbar->SetStatusText("AMF file exported to $output_file"); + + # this method gets executed in a separate thread by wxWidgets since it's a menu handler + Slic3r::thread_cleanup() if $Slic3r::have_threads; } sub _get_export_file { @@ -850,7 +859,9 @@ sub make_thumbnail { }; @_ = (); - $Slic3r::have_threads ? threads->create($cb)->detach : $cb->(); + $Slic3r::have_threads + ? threads->create(sub { $cb->(); Slic3r::thread_cleanup(); })->detach + : $cb->(); } sub on_thumbnail_made { diff --git a/lib/Slic3r/GUI/SkeinPanel.pm b/lib/Slic3r/GUI/SkeinPanel.pm index 2ea3dd76..1544cd86 100644 --- a/lib/Slic3r/GUI/SkeinPanel.pm +++ b/lib/Slic3r/GUI/SkeinPanel.pm @@ -305,7 +305,7 @@ sub load_config { my ($config) = @_; foreach my $tab (values %{$self->{options_tabs}}) { - $tab->set_value($_, $config->$_) for keys %$config; + $tab->set_value($_, $config->$_) for @{$config->get_keys}; } } diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm index 02fcf6ad..8a042611 100644 --- a/lib/Slic3r/GUI/Tab.pm +++ b/lib/Slic3r/GUI/Tab.pm @@ -291,7 +291,8 @@ sub set_value { sub reload_values { my $self = shift; - $self->set_value($_, $self->{config}->get($_)) for keys %{$self->{config}}; + $self->set_value($_, $self->{config}->get($_)) + for @{$self->{config}->get_keys}; } sub update_tree { @@ -735,7 +736,9 @@ sub config { # remove all unused values foreach my $opt_key ($self->_extruder_options) { - splice @{ $config->{$opt_key} }, $self->{extruders_count}; + my $values = $config->get($opt_key); + splice @$values, $self->{extruders_count}; + $config->set($opt_key, $values); } return $config;