From a664709b3139d62a8f238af8c67864f3ab79ae29 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Tue, 19 Jun 2012 18:11:51 +0200 Subject: [PATCH] Remember last presets --- lib/Slic3r.pm | 1 + lib/Slic3r/Config.pm | 33 +++++++++++++++++++++++++++++---- lib/Slic3r/GUI.pm | 6 ++++++ lib/Slic3r/GUI/Tab.pm | 13 ++++++++++++- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/lib/Slic3r.pm b/lib/Slic3r.pm index fb6112df0..dd2dbef18 100644 --- a/lib/Slic3r.pm +++ b/lib/Slic3r.pm @@ -169,6 +169,7 @@ our $extruder_clearance_radius = 20; # mm our $extruder_clearance_height = 20; # mm our $Defaults = Slic3r::Config->current; +our $Settings = { presets => {} }; # application settings sub parallelize { my %params = @_; diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index 48ee6de43..d8f4fd0a3 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -655,20 +655,41 @@ sub deserialize { : set($opt_key, $value); } +sub write_ini { + my $class = shift; + my ($file, $ini) = @_; + + open my $fh, '>', $file; + binmode $fh, ':utf8'; + foreach my $category (sort keys %$ini) { + printf $fh "\n[%s]\n", $category if $category ne '_'; + foreach my $key (sort keys %{$ini->{$category}}) { + printf $fh "%s = %s\n", $key, $ini->{$category}{$key}; + } + } + close $fh; +} + sub save { my $class = shift; my ($file, $group) = @_; - open my $fh, '>', $file; - binmode $fh, ':utf8'; + my $ini = { _ => {} }; foreach my $opt (sort keys %$Options) { next if defined $group && not ($opt ~~ @{$Groups{$group}}); next if $Options->{$opt}{gui_only}; my $value = get($opt); $value = $Options->{$opt}{serialize}->($value) if $Options->{$opt}{serialize}; - printf $fh "%s = %s\n", $opt, $value; + $ini->{_}{$opt} = $value; } - close $fh; + $class->write_ini($file, $ini); +} + +sub save_settings { + my $class = shift; + my ($file) = @_; + + $class->write_ini($file, $Slic3r::Settings); } sub setenv { @@ -701,6 +722,10 @@ sub read_ini { next if /^\s+/; next if /^$/; next if /^\s*#/; + if (/^\[(\w+)\]$/) { + $category = $1; + next; + } /^(\w+) = (.*)/ or die "Unreadable configuration file (invalid data at line $.)\n"; $ini->{$category}{$1} = $2; } diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 88e8fead2..9f453622c 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -42,6 +42,12 @@ sub OnInit { unless -d $_; } + # load settings + if (-f "$datadir/slic3r.ini") { + my $ini = eval { Slic3r::Config->read_ini("$datadir/slic3r.ini") }; + $Slic3r::Settings = $ini if $ini; + } + # application frame Wx::Image::AddHandler(Wx::PNGHandler->new); my $frame = Wx::Frame->new(undef, -1, 'Slic3r', [-1, -1], [760,500], wxDEFAULT_FRAME_STYLE); diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm index 9562eba05..60aac59a7 100644 --- a/lib/Slic3r/GUI/Tab.pm +++ b/lib/Slic3r/GUI/Tab.pm @@ -94,6 +94,7 @@ sub new { $self->set_dirty(0); $self->load_presets; $self->{presets_choice}->SetSelection(1 + first { basename($self->{presets}[$_]) eq $dlg->get_name . ".ini" } 0 .. $#{$self->{presets}}); + $self->on_select_preset; $self->sync_presets; }); @@ -124,11 +125,12 @@ sub on_select_preset { } my $i = $self->{presets_choice}->GetSelection; + my $file; if ($i == 0) { Slic3r::Config->load_hash($Slic3r::Defaults, $self->{presets_group}, 1); $self->{btn_delete_preset}->Disable; } else { - my $file = $self->{presets}[$i-1]; + $file = $self->{presets}[$i-1]; if (!-e $file) { Slic3r::GUI::show_error($self, "The selected preset does not exist anymore ($file)."); return; @@ -138,6 +140,8 @@ sub on_select_preset { } $_->() for @Slic3r::GUI::OptionsGroup::reload_callbacks{@{$Slic3r::Config::Groups{$self->{presets_group}}}}; $self->set_dirty(0); + $Slic3r::Settings->{presets}{$self->{presets_group}} = $file ? basename($file) : ''; + Slic3r::Config->save_settings("$Slic3r::GUI::datadir/slic3r.ini"); } sub add_options_page { @@ -204,6 +208,13 @@ sub load_presets { $preset =~ s/\.ini$//i; $self->{presets_choice}->Append($preset); } + { + my $i = first { basename($self->{presets}[$_]) eq ($Slic3r::Settings->{presets}{$self->{presets_group}} || '') } 0 .. $#{$self->{presets}}; + if (defined $i) { + $self->{presets_choice}->SetSelection($i + 1); + $self->on_select_preset; + } + } $self->sync_presets; }