mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Enable/disable GUI controls according to the others in order to guide the user through option dependency
This commit is contained in:
		
							parent
							
								
									04b67f0cb0
								
							
						
					
					
						commit
						a06fad9e13
					
				
					 5 changed files with 207 additions and 16 deletions
				
			
		|  | @ -195,6 +195,18 @@ sub _build_field { | |||
|         : $field->wxSizer; | ||||
| } | ||||
| 
 | ||||
| sub get_option { | ||||
|     my ($self, $opt_id) = @_; | ||||
|     return undef if !exists $self->_options->{$opt_id}; | ||||
|     return $self->_options->{$opt_id}; | ||||
| } | ||||
| 
 | ||||
| sub get_field { | ||||
|     my ($self, $opt_id) = @_; | ||||
|     return undef if !exists $self->_fields->{$opt_id}; | ||||
|     return $self->_fields->{$opt_id}; | ||||
| } | ||||
| 
 | ||||
| sub get_value { | ||||
|     my ($self, $opt_id) = @_; | ||||
|      | ||||
|  | @ -267,6 +279,8 @@ has 'readonly'      => (is => 'rw', default => sub { 0 }); | |||
| package Slic3r::GUI::ConfigOptionsGroup; | ||||
| use Moo; | ||||
| 
 | ||||
| use List::Util qw(first); | ||||
| 
 | ||||
| extends 'Slic3r::GUI::OptionsGroup'; | ||||
| has 'config'        => (is => 'ro', required => 1); | ||||
| has 'full_labels'   => (is => 'ro', default => sub { 0 }); | ||||
|  | @ -328,6 +342,15 @@ sub reload_config { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| sub get_fieldc { | ||||
|     my ($self, $opt_key, $opt_index) = @_; | ||||
|      | ||||
|     $opt_index //= -1; | ||||
|     my $opt_id = first { $self->_opt_map->{$_}[0] eq $opt_key && $self->_opt_map->{$_}[1] == $opt_index } | ||||
|         keys %{$self->_opt_map}; | ||||
|     return defined($opt_id) ? $self->get_field($opt_id) : undef; | ||||
| } | ||||
| 
 | ||||
| sub _get_config_value { | ||||
|     my ($self, $opt_key, $opt_index, $deserialize) = @_; | ||||
|      | ||||
|  |  | |||
|  | @ -28,6 +28,11 @@ sub set_tooltip { | |||
|         if $tooltip && $self->can('SetToolTipString'); | ||||
| } | ||||
| 
 | ||||
| sub toggle { | ||||
|     my ($self, $enable) = @_; | ||||
|     $enable ? $self->enable : $self->disable; | ||||
| } | ||||
| 
 | ||||
| sub _on_change { | ||||
|     my ($self, $opt_id) = @_; | ||||
|      | ||||
|  | @ -80,6 +85,20 @@ sub get_value { | |||
|     return $self->wxWindow->GetValue; | ||||
| } | ||||
| 
 | ||||
| sub enable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->wxWindow->Enable; | ||||
|     $self->wxWindow->Refresh; | ||||
| } | ||||
| 
 | ||||
| sub disable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->wxWindow->Disable; | ||||
|     $self->wxWindow->Refresh; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| package Slic3r::GUI::OptionsGroup::Field::Checkbox; | ||||
| use Moo; | ||||
|  | @ -154,6 +173,20 @@ sub BUILD { | |||
|     }); | ||||
| } | ||||
| 
 | ||||
| sub enable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->wxWindow->Enable; | ||||
|     $self->wxWindow->SetEditable(1); | ||||
| } | ||||
| 
 | ||||
| sub disable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->wxWindow->Disable; | ||||
|     $self->wxWindow->SetEditable(0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| package Slic3r::GUI::OptionsGroup::Field::Choice; | ||||
| use Moo; | ||||
|  | @ -343,6 +376,20 @@ sub get_value { | |||
|     ]; | ||||
| } | ||||
| 
 | ||||
| sub enable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->x_textctrl->Enable; | ||||
|     $self->y_textctrl->Enable; | ||||
| } | ||||
| 
 | ||||
| sub disable { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->x_textctrl->Disable; | ||||
|     $self->y_textctrl->Disable; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| package Slic3r::GUI::OptionsGroup::Field::Slider; | ||||
| use Moo; | ||||
|  |  | |||
|  | @ -31,13 +31,26 @@ sub new { | |||
|         on_change   => sub { | ||||
|             my ($opt_id) = @_; | ||||
|              | ||||
|             my $value = $optgroup->get_value($opt_id); | ||||
|             $self->{cut_options}{$opt_id} = $value; | ||||
|             if ($opt_id eq 'z') { | ||||
|                 if ($self->{canvas}) { | ||||
|                     $self->{canvas}->SetCuttingPlane($value); | ||||
|                     $self->{canvas}->Render; | ||||
|                 } | ||||
|             $self->{cut_options}{$opt_id} = $optgroup->get_value($opt_id); | ||||
|              | ||||
|             # update canvas | ||||
|             if ($self->{canvas}) { | ||||
|                 $self->{canvas}->SetCuttingPlane($self->{cut_options}{z}); | ||||
|                 $self->{canvas}->Render; | ||||
|             } | ||||
|              | ||||
|             # update controls | ||||
|             my $z = $self->{cut_options}{z}; | ||||
|             $optgroup->get_field('keep_upper')->toggle(my $have_upper = abs($z - $optgroup->get_option('z')->max) > 0.1); | ||||
|             $optgroup->get_field('keep_lower')->toggle(my $have_lower = $z > 0.1); | ||||
|             $optgroup->get_field('rotate_lower')->toggle($z > 0 && $self->{cut_options}{keep_lower}); | ||||
|              | ||||
|             # update cut button | ||||
|             if (($self->{cut_options}{keep_upper} && $have_upper) | ||||
|                 || ($self->{cut_options}{keep_lower} && $have_lower)) { | ||||
|                 $self->{btn_cut}->Enable; | ||||
|             } else { | ||||
|                 $self->{btn_cut}->Disable; | ||||
|             } | ||||
|         }, | ||||
|         label_width  => 120, | ||||
|  |  | |||
|  | @ -103,6 +103,7 @@ sub new { | |||
|      | ||||
|     $self->{config} = Slic3r::Config->new; | ||||
|     $self->build; | ||||
|     $self->_update; | ||||
|     if ($self->hidden_options) { | ||||
|         $self->{config}->apply(Slic3r::Config->new_from_defaults($self->hidden_options)); | ||||
|     } | ||||
|  | @ -166,8 +167,11 @@ sub _on_value_change { | |||
|      | ||||
|     $self->set_dirty(1); | ||||
|     $self->{on_value_change}->(@_) if $self->{on_value_change}; | ||||
|     $self->_update; | ||||
| } | ||||
| 
 | ||||
| sub _update {} | ||||
| 
 | ||||
| sub _on_presets_changed { | ||||
|     my $self = shift; | ||||
|      | ||||
|  | @ -390,6 +394,16 @@ sub load_config { | |||
|     $self->reload_config; | ||||
| } | ||||
| 
 | ||||
| sub get_field { | ||||
|     my ($self, $opt_key, $opt_index) = @_; | ||||
|      | ||||
|     foreach my $page (@{ $self->{pages} }) { | ||||
|         my $field = $page->get_field($opt_key, $opt_index); | ||||
|         return $field if defined $field; | ||||
|     } | ||||
|     return undef; | ||||
| } | ||||
| 
 | ||||
| package Slic3r::GUI::Tab::Print; | ||||
| use base 'Slic3r::GUI::Tab'; | ||||
| 
 | ||||
|  | @ -663,6 +677,47 @@ sub build { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| sub _update { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     my $config = $self->{config}; | ||||
|      | ||||
|     my $have_perimeters = $config->perimeters > 0; | ||||
|     $self->get_field('spiral_vase')->toggle($config->perimeters == 1 && $config->top_solid_layers == 0 && $config->fill_density == 0); | ||||
|     $self->get_field($_)->toggle($have_perimeters) | ||||
|         for qw(extra_perimeters thin_walls overhangs seam_position external_perimeters_first); | ||||
|      | ||||
|     my $have_infill = $config->fill_density > 0; | ||||
|     $self->get_field($_)->toggle($have_infill) | ||||
|         for qw(fill_pattern infill_every_layers infill_only_where_needed solid_infill_every_layers); | ||||
|      | ||||
|     my $have_default_acceleration = $config->default_acceleration > 0; | ||||
|     $self->get_field($_)->toggle($have_default_acceleration) | ||||
|         for qw(perimeter_acceleration infill_acceleration bridge_acceleration first_layer_acceleration); | ||||
|      | ||||
|     my $have_skirt = $config->skirts > 0 || $config->min_skirt_length > 0; | ||||
|     $self->get_field($_)->toggle($have_skirt) | ||||
|         for qw(skirt_distance skirt_height); | ||||
|      | ||||
|     my $have_support_material = $config->support_material || $config->raft_layers > 0; | ||||
|     my $have_support_interface = $config->support_material_interface_layers > 0; | ||||
|     $self->get_field($_)->toggle($have_support_material) | ||||
|         for qw(support_material_threshold support_material_enforce_layers | ||||
|             support_material_pattern support_material_spacing support_material_angle | ||||
|             support_material_interface_layers dont_support_bridges | ||||
|             support_material_extruder); | ||||
|     $self->get_field($_)->toggle($have_support_material && $have_support_interface) | ||||
|         for qw(support_material_interface_spacing support_material_interface_extruder); | ||||
|      | ||||
|     my $have_sequential_printing = $config->complete_objects; | ||||
|     $self->get_field($_)->toggle($have_sequential_printing) | ||||
|         for qw(extruder_clearance_radius extruder_clearance_height); | ||||
|      | ||||
|     my $have_ooze_prevention = $config->ooze_prevention; | ||||
|     $self->get_field($_)->toggle($have_ooze_prevention) | ||||
|         for qw(standby_temperature_delta); | ||||
| } | ||||
| 
 | ||||
| sub hidden_options { !$Slic3r::have_threads ? qw(threads) : () } | ||||
| 
 | ||||
| package Slic3r::GUI::Tab::Filament; | ||||
|  | @ -754,8 +809,23 @@ sub build { | |||
|             $optgroup->append_single_option_line('min_print_speed'); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| sub _on_value_change { | ||||
|     my $self = shift; | ||||
|     my ($opt_key) = @_; | ||||
|     $self->SUPER::_on_value_change(@_); | ||||
| } | ||||
| 
 | ||||
| sub _update { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->_update_description; | ||||
|      | ||||
|     my $cooling = $self->{config}->cooling; | ||||
|     $self->get_field($_)->toggle($cooling) | ||||
|         for qw(min_fan_speed max_fan_speed disable_fan_first_layers  | ||||
|             fan_below_layer_time slowdown_below_layer_time min_print_speed); | ||||
| } | ||||
| 
 | ||||
| sub _update_description { | ||||
|  | @ -787,14 +857,6 @@ sub _update_description { | |||
|     $self->{description_line}->SetText($msg); | ||||
| } | ||||
| 
 | ||||
| sub _on_value_change { | ||||
|     my $self = shift; | ||||
|     my ($opt_key) = @_; | ||||
|     $self->SUPER::_on_value_change(@_); | ||||
|      | ||||
|     $self->_update_description; | ||||
| } | ||||
| 
 | ||||
| package Slic3r::GUI::Tab::Printer; | ||||
| use base 'Slic3r::GUI::Tab'; | ||||
| use Wx qw(:sizer :button :bitmap :misc :id); | ||||
|  | @ -879,6 +941,7 @@ sub build { | |||
|                 if ($opt_id eq 'extruders_count') { | ||||
|                     $self->{extruders_count} = $optgroup->get_value('extruders_count'); | ||||
|                     $self->_build_extruder_pages; | ||||
|                     $self->_update; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | @ -1000,6 +1063,41 @@ sub _build_extruder_pages { | |||
|     $self->update_tree(0); | ||||
| } | ||||
| 
 | ||||
| sub _update { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     my $config = $self->{config}; | ||||
|      | ||||
|     $self->get_field('toolchange_gcode')->toggle($self->{extruders_count} > 1); | ||||
|      | ||||
|     for my $i (0 .. ($self->{extruders_count}-1)) { | ||||
|         # disable extruder offset for first extruder | ||||
|         $self->get_field('extruder_offset', $i)->toggle($i != 0); | ||||
|          | ||||
|         my $have_retract_length = $config->get_at('retract_length', $i) > 0; | ||||
|          | ||||
|         # when using firmware retraction, firmware decides retraction length | ||||
|         $self->get_field('retract_length', $i)->toggle(!$config->use_firmware_retraction); | ||||
|          | ||||
|         # user can customize travel length if we have retraction length or we're using | ||||
|         # firmware retraction | ||||
|         $self->get_field('retract_before_travel', $i)->toggle($have_retract_length || $config->use_firmware_retraction); | ||||
|          | ||||
|         # user can customize other retraction options if retraction is enabled | ||||
|         my $retraction = ($have_retract_length || $config->use_firmware_retraction); | ||||
|         $self->get_field($_, $i)->toggle($retraction) | ||||
|             for qw(retract_lift retract_layer_change); | ||||
|          | ||||
|         # some options only apply when not using firmware retraction | ||||
|         $self->get_field($_, $i)->toggle($retraction && !$config->use_firmware_retraction) | ||||
|             for qw(retract_speed retract_restart_extra wipe); | ||||
|          | ||||
|         my $toolchange_retraction = $config->get_at('retract_length_toolchange', $i) > 0; | ||||
|         $self->get_field($_, $i)->toggle($toolchange_retraction) | ||||
|             for qw(retract_restart_extra_toolchange); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # this gets executed after preset is loaded and before GUI fields are updated | ||||
| sub on_preset_loaded { | ||||
|     my $self = shift; | ||||
|  | @ -1067,6 +1165,16 @@ sub reload_config { | |||
|     $_->reload_config for @{$self->{optgroups}}; | ||||
| } | ||||
| 
 | ||||
| sub get_field { | ||||
|     my ($self, $opt_key, $opt_index) = @_; | ||||
|      | ||||
|     foreach my $optgroup (@{ $self->{optgroups} }) { | ||||
|         my $field = $optgroup->get_fieldc($opt_key, $opt_index); | ||||
|         return $field if defined $field; | ||||
|     } | ||||
|     return undef; | ||||
| } | ||||
| 
 | ||||
| sub set_value { | ||||
|     my $self = shift; | ||||
|     my ($opt_key, $value) = @_; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci