diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index e2a06d905..efbbeb973 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -378,6 +378,12 @@ sub new { } else { # Apply the overrides to the current Print preset, potentially making it dirty $preset->_dirty_config->apply($self->{settings_override_config}); + + # If this is a configured shortcut (and not just a dirty option), + # save it now. + if (any { $_ eq $opt_key } @{$preset->dirty_config->shortcuts}) { + $preset->save([$opt_key]); + } } $self->load_presets; diff --git a/lib/Slic3r/GUI/Preset.pm b/lib/Slic3r/GUI/Preset.pm index 03de04467..2d0021937 100644 --- a/lib/Slic3r/GUI/Preset.pm +++ b/lib/Slic3r/GUI/Preset.pm @@ -94,7 +94,7 @@ sub prompt_unsaved_changes { if ($res == wxID_CANCEL) { return 0; } elsif ($res == wxID_YES) { - return $self->save($self->default ? undef : $self->name); + return $self->default ? $self->save_prompt($parent) : $self->save; } elsif ($res == wxID_NO) { $self->dismiss_changes; return 1; @@ -104,20 +104,29 @@ sub prompt_unsaved_changes { return 1; } +sub save_prompt { + my ($self, $parent) = @_; + + my $default_name = $self->default ? 'Untitled' : $self->name; + $default_name =~ s/\.ini$//i; + + my $dlg = Slic3r::GUI::SavePresetWindow->new($parent, + default => $default_name, + values => [ map $_->name, grep !$_->default && !$_->external, @{wxTheApp->presets->{$self->name}} ], + ); + return 0 unless $dlg->ShowModal == wxID_OK; + + $self->save_as($dlg->get_name); +} + sub save { - my ($self, $name, $parent) = @_; + my ($self, $opt_keys) = @_; - if (!$name) { - my $default_name = $self->default ? 'Untitled' : $self->name; - $default_name =~ s/\.ini$//i; - - my $dlg = Slic3r::GUI::SavePresetWindow->new($parent, - default => $default_name, - values => [ map $_->name, grep !$_->default && !$_->external, @{wxTheApp->presets->{$self->name}} ], - ); - return 0 unless $dlg->ShowModal == wxID_OK; - $name = $dlg->get_name; - } + return $self->save_as($self->name, $opt_keys); +} + +sub save_as { + my ($self, $name, $opt_keys) = @_; $self->rename($name); @@ -125,8 +134,12 @@ sub save { die "Calling save() without setting filename"; } - $self->_config->clear; - $self->_config->apply($self->_dirty_config); + if ($opt_keys) { + $self->_config->apply_only($self->_dirty_config, $opt_keys); + } else { + $self->_config->clear; + $self->_config->apply($self->_dirty_config); + } $self->_config->save($self->file); wxTheApp->load_presets; diff --git a/lib/Slic3r/GUI/PresetEditor.pm b/lib/Slic3r/GUI/PresetEditor.pm index 0cccf9982..e84a000b7 100644 --- a/lib/Slic3r/GUI/PresetEditor.pm +++ b/lib/Slic3r/GUI/PresetEditor.pm @@ -123,7 +123,7 @@ sub save_preset { $self->{treectrl}->SetFocus; my $preset = $self->current_preset; - $preset->save(undef, $self); + $preset->save_prompt($self); $self->load_presets; $self->select_preset_by_name($preset->name);