mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Merge remote-tracking branch 'origin/new_main_page_ui' into dev
This commit is contained in:
		
						commit
						8b148a4fe4
					
				
					 42 changed files with 4600 additions and 217 deletions
				
			
		| 
						 | 
				
			
			@ -26,6 +26,14 @@ our $appController;
 | 
			
		|||
our $VALUE_CHANGE_EVENT    = Wx::NewEventType;
 | 
			
		||||
# 2) To inform about a preset selection change or a "modified" status change.
 | 
			
		||||
our $PRESETS_CHANGED_EVENT = Wx::NewEventType;
 | 
			
		||||
# 3) To inform about a change of object selection
 | 
			
		||||
our $OBJECT_SELECTION_CHANGED_EVENT = Wx::NewEventType;
 | 
			
		||||
# 4) To inform about a change of object settings
 | 
			
		||||
our $OBJECT_SETTINGS_CHANGED_EVENT = Wx::NewEventType;
 | 
			
		||||
# 5) To inform about a remove of object 
 | 
			
		||||
our $OBJECT_REMOVE_EVENT = Wx::NewEventType;
 | 
			
		||||
# 6) To inform about a update of the scene 
 | 
			
		||||
our $UPDATE_SCENE_EVENT = Wx::NewEventType;
 | 
			
		||||
 | 
			
		||||
sub new {
 | 
			
		||||
    my ($class, %params) = @_;
 | 
			
		||||
| 
						 | 
				
			
			@ -114,6 +122,8 @@ sub new {
 | 
			
		|||
 | 
			
		||||
    $self->update_ui_from_settings;
 | 
			
		||||
 | 
			
		||||
    Slic3r::GUI::update_mode();
 | 
			
		||||
 | 
			
		||||
    return $self;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +143,12 @@ sub _init_tabpanel {
 | 
			
		|||
    });
 | 
			
		||||
    
 | 
			
		||||
    if (!$self->{no_plater}) {
 | 
			
		||||
        $panel->AddPage($self->{plater} = Slic3r::GUI::Plater->new($panel), L("Plater"));
 | 
			
		||||
        $panel->AddPage($self->{plater} = Slic3r::GUI::Plater->new($panel,
 | 
			
		||||
            event_object_selection_changed   => $OBJECT_SELECTION_CHANGED_EVENT,
 | 
			
		||||
            event_object_settings_changed    => $OBJECT_SETTINGS_CHANGED_EVENT,
 | 
			
		||||
            event_remove_object              => $OBJECT_REMOVE_EVENT,
 | 
			
		||||
            event_update_scene               => $UPDATE_SCENE_EVENT,
 | 
			
		||||
            ), L("Plater"));
 | 
			
		||||
        if (!$self->{no_controller}) {
 | 
			
		||||
            $panel->AddPage($self->{controller} = Slic3r::GUI::Controller->new($panel), L("Controller"));
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -192,6 +207,40 @@ sub _init_tabpanel {
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    # The following event is emited by the C++ Tab implementation on object selection change.
 | 
			
		||||
    EVT_COMMAND($self, -1, $OBJECT_SELECTION_CHANGED_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
        my $obj_idx = $event->GetId;
 | 
			
		||||
        my $child = $event->GetInt == 1 ? 1 : undef;
 | 
			
		||||
 | 
			
		||||
        $self->{plater}->select_object($obj_idx < 0 ? undef: $obj_idx, $child);
 | 
			
		||||
        $self->{plater}->item_changed_selection($obj_idx);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    # The following event is emited by the C++ GUI implementation on object settings change.
 | 
			
		||||
    EVT_COMMAND($self, -1, $OBJECT_SETTINGS_CHANGED_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
 | 
			
		||||
        my $line = $event->GetString;
 | 
			
		||||
        my ($obj_idx, $parts_changed, $part_settings_changed) = split('',$line);
 | 
			
		||||
 | 
			
		||||
        $self->{plater}->changed_object_settings($obj_idx, $parts_changed, $part_settings_changed);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    # The following event is emited by the C++ GUI implementation on object remove.
 | 
			
		||||
    EVT_COMMAND($self, -1, $OBJECT_REMOVE_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
        $self->{plater}->remove();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    # The following event is emited by the C++ GUI implementation on extruder change for object.
 | 
			
		||||
    EVT_COMMAND($self, -1, $UPDATE_SCENE_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
        $self->{plater}->update();
 | 
			
		||||
    });
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    Slic3r::GUI::create_preset_tabs($self->{no_controller}, $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT);
 | 
			
		||||
    $self->{options_tabs} = {};
 | 
			
		||||
    for my $tab_name (qw(print filament sla_material printer)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ my $PreventListEvents = 0;
 | 
			
		|||
our $appController;
 | 
			
		||||
 | 
			
		||||
sub new {
 | 
			
		||||
    my ($class, $parent) = @_;
 | 
			
		||||
    my ($class, $parent, %params) = @_;
 | 
			
		||||
    my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 | 
			
		||||
    $self->{config} = Slic3r::Config::new_from_defaults_keys([qw(
 | 
			
		||||
        bed_shape complete_objects extruder_clearance_radius skirts skirt_distance brim_width variable_layer_height
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +57,13 @@ sub new {
 | 
			
		|||
        nozzle_diameter single_extruder_multi_material wipe_tower wipe_tower_x wipe_tower_y wipe_tower_width
 | 
			
		||||
	wipe_tower_rotation_angle extruder_colour filament_colour max_print_height printer_model
 | 
			
		||||
    )]);
 | 
			
		||||
 | 
			
		||||
    # store input params
 | 
			
		||||
    $self->{event_object_selection_changed} = $params{event_object_selection_changed};
 | 
			
		||||
    $self->{event_object_settings_changed} = $params{event_object_settings_changed};
 | 
			
		||||
    $self->{event_remove_object} = $params{event_remove_object};
 | 
			
		||||
    $self->{event_update_scene} = $params{event_update_scene};
 | 
			
		||||
 | 
			
		||||
    # C++ Slic3r::Model with Perl extensions in Slic3r/Model.pm
 | 
			
		||||
    $self->{model} = Slic3r::Model->new;
 | 
			
		||||
    # C++ Slic3r::Print with Perl extensions in Slic3r/Print.pm
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +81,7 @@ sub new {
 | 
			
		|||
    });
 | 
			
		||||
    
 | 
			
		||||
    # Initialize preview notebook
 | 
			
		||||
    $self->{preview_notebook} = Wx::Notebook->new($self, -1, wxDefaultPosition, [335,335], wxNB_BOTTOM);
 | 
			
		||||
    $self->{preview_notebook} = Wx::Notebook->new($self, -1, wxDefaultPosition, [-1,335], wxNB_BOTTOM);
 | 
			
		||||
    
 | 
			
		||||
    # Initialize handlers for canvases
 | 
			
		||||
    my $on_select_object = sub {
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +135,9 @@ sub new {
 | 
			
		|||
        }
 | 
			
		||||
        $_->set_scaling_factor($scale) for @{ $model_object->instances };
 | 
			
		||||
        
 | 
			
		||||
        $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%");
 | 
			
		||||
        # Set object scale on c++ side
 | 
			
		||||
        Slic3r::GUI::set_object_scale($obj_idx, $model_object->instances->[0]->scaling_factor * 100); 
 | 
			
		||||
 | 
			
		||||
#        $object->transform_thumbnail($self->{model}, $obj_idx);
 | 
			
		||||
    
 | 
			
		||||
        #update print and start background processing
 | 
			
		||||
| 
						 | 
				
			
			@ -362,37 +371,12 @@ sub new {
 | 
			
		|||
#    }
 | 
			
		||||
 | 
			
		||||
    ### Panel for right column
 | 
			
		||||
    $self->{right_panel} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 | 
			
		||||
    
 | 
			
		||||
    ### Scrolled Window for info boxes
 | 
			
		||||
    my $scrolled_window_sizer = $self->{scrolled_window_sizer} = Wx::BoxSizer->new(wxVERTICAL);
 | 
			
		||||
    $scrolled_window_sizer->SetMinSize([310, -1]);
 | 
			
		||||
    my $scrolled_window_panel = $self->{scrolled_window_panel} = Wx::ScrolledWindow->new($self->{right_panel}, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 | 
			
		||||
    $scrolled_window_panel->SetSizer($scrolled_window_sizer);
 | 
			
		||||
    $scrolled_window_panel->SetScrollbars(1, 1, 1, 1);    
 | 
			
		||||
 | 
			
		||||
    $self->{list} = Wx::ListView->new($scrolled_window_panel, -1, wxDefaultPosition, wxDefaultSize,
 | 
			
		||||
        wxLC_SINGLE_SEL | wxLC_REPORT | wxBORDER_SUNKEN | wxTAB_TRAVERSAL | wxWANTS_CHARS );
 | 
			
		||||
    $self->{list}->InsertColumn(0, L("Name"), wxLIST_FORMAT_LEFT, 145);
 | 
			
		||||
    $self->{list}->InsertColumn(1, L("Copies"), wxLIST_FORMAT_CENTER, 45);
 | 
			
		||||
    $self->{list}->InsertColumn(2, L("Scale"), wxLIST_FORMAT_CENTER, wxLIST_AUTOSIZE_USEHEADER);
 | 
			
		||||
    EVT_LIST_ITEM_SELECTED($self, $self->{list}, \&list_item_selected);
 | 
			
		||||
    EVT_LIST_ITEM_DESELECTED($self, $self->{list}, \&list_item_deselected);
 | 
			
		||||
    EVT_LIST_ITEM_ACTIVATED($self, $self->{list}, \&list_item_activated);
 | 
			
		||||
    EVT_KEY_DOWN($self->{list}, sub {
 | 
			
		||||
        my ($list, $event) = @_;
 | 
			
		||||
        if ($event->GetKeyCode == WXK_TAB) {
 | 
			
		||||
            $list->Navigate($event->ShiftDown ? &Wx::wxNavigateBackward : &Wx::wxNavigateForward);
 | 
			
		||||
        } elsif ($event->GetKeyCode == WXK_DELETE ||
 | 
			
		||||
                ($event->GetKeyCode == WXK_BACK && &Wx::wxMAC) ) {
 | 
			
		||||
            $self->remove;
 | 
			
		||||
        } else {
 | 
			
		||||
            $event->Skip;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
#    $self->{right_panel} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 | 
			
		||||
    $self->{right_panel} = Wx::ScrolledWindow->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 | 
			
		||||
    $self->{right_panel}->SetScrollbars(0, 1, 1, 1);
 | 
			
		||||
    
 | 
			
		||||
    # right pane buttons
 | 
			
		||||
    $self->{btn_export_gcode} = Wx::Button->new($self->{right_panel}, -1, L("Export G-code…"), wxDefaultPosition, [-1, 30], wxBU_LEFT);
 | 
			
		||||
    $self->{btn_export_gcode} = Wx::Button->new($self->{right_panel}, -1, L("Export G-code…"), wxDefaultPosition, [-1, 30], wxNO_BORDER);#, wxBU_LEFT);
 | 
			
		||||
    $self->{btn_reslice} = Wx::Button->new($self->{right_panel}, -1, L("Slice now"), wxDefaultPosition, [-1, 30], wxBU_LEFT);
 | 
			
		||||
    $self->{btn_print} = Wx::Button->new($self->{right_panel}, -1, L("Print…"), wxDefaultPosition, [-1, 30], wxBU_LEFT);
 | 
			
		||||
    $self->{btn_send_gcode} = Wx::Button->new($self->{right_panel}, -1, L("Send to printer"), wxDefaultPosition, [-1, 30], wxBU_LEFT);
 | 
			
		||||
| 
						 | 
				
			
			@ -460,6 +444,7 @@ sub new {
 | 
			
		|||
#    } else {
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_add}, sub { $self->add; });
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_remove}, sub { $self->remove() }); # explicitly pass no argument to remove
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_remove}, sub { Slic3r::GUI::remove_obj() }); # explicitly pass no argument to remove
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_reset}, sub { $self->reset; });
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_arrange}, sub { $self->arrange; });
 | 
			
		||||
#        EVT_BUTTON($self, $self->{btn_increase}, sub { $self->increase; });
 | 
			
		||||
| 
						 | 
				
			
			@ -476,7 +461,7 @@ sub new {
 | 
			
		|||
    $_->SetDropTarget(Slic3r::GUI::Plater::DropTarget->new($self))
 | 
			
		||||
        for grep defined($_),
 | 
			
		||||
            $self, $self->{canvas3D}, $self->{preview3D}, $self->{list};
 | 
			
		||||
#            $self, $self->{canvas}, $self->{canvas3D}, $self->{preview3D}, $self->{list};
 | 
			
		||||
#            $self, $self->{canvas}, $self->{canvas3D}, $self->{preview3D};
 | 
			
		||||
    
 | 
			
		||||
    EVT_COMMAND($self, -1, $PROGRESS_BAR_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
| 
						 | 
				
			
			@ -555,15 +540,32 @@ sub new {
 | 
			
		|||
            $presets->Layout;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $frequently_changed_parameters_sizer = $self->{frequently_changed_parameters_sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
 | 
			
		||||
        my $frequently_changed_parameters_sizer = $self->{frequently_changed_parameters_sizer} = Wx::BoxSizer->new(wxVERTICAL);
 | 
			
		||||
        Slic3r::GUI::add_frequently_changed_parameters($self->{right_panel}, $frequently_changed_parameters_sizer, $presets);
 | 
			
		||||
 | 
			
		||||
        my $expert_mode_part_sizer = Wx::BoxSizer->new(wxVERTICAL);
 | 
			
		||||
        Slic3r::GUI::add_expert_mode_part(  $self->{right_panel}, $expert_mode_part_sizer, 
 | 
			
		||||
                                            $self->{model},
 | 
			
		||||
                                            $self->{event_object_selection_changed},
 | 
			
		||||
                                            $self->{event_object_settings_changed},
 | 
			
		||||
                                            $self->{event_remove_object},
 | 
			
		||||
                                            $self->{event_update_scene});
 | 
			
		||||
#        if ($expert_mode_part_sizer->IsShown(2)==1) 
 | 
			
		||||
#        { 
 | 
			
		||||
#           $expert_mode_part_sizer->Layout;
 | 
			
		||||
#            $expert_mode_part_sizer->Show(2, 0); # ? Why doesn't work
 | 
			
		||||
#            $self->{right_panel}->Layout;
 | 
			
		||||
#       }
 | 
			
		||||
 | 
			
		||||
        my $object_info_sizer;
 | 
			
		||||
        {
 | 
			
		||||
            my $box = Wx::StaticBox->new($scrolled_window_panel, -1, L("Info"));
 | 
			
		||||
#            my $box = Wx::StaticBox->new($scrolled_window_panel, -1, L("Info"));
 | 
			
		||||
            my $box = Wx::StaticBox->new($self->{right_panel}, -1, L("Info"));
 | 
			
		||||
            $box->SetFont($Slic3r::GUI::small_bold_font);
 | 
			
		||||
            $object_info_sizer = Wx::StaticBoxSizer->new($box, wxVERTICAL);
 | 
			
		||||
            $object_info_sizer->SetMinSize([300,-1]);
 | 
			
		||||
            my $grid_sizer = Wx::FlexGridSizer->new(3, 4, 5, 5);
 | 
			
		||||
            #!my $grid_sizer = Wx::FlexGridSizer->new(3, 4, 5, 5);
 | 
			
		||||
            my $grid_sizer = Wx::FlexGridSizer->new(2, 4, 5, 5);
 | 
			
		||||
            $grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
 | 
			
		||||
            $grid_sizer->AddGrowableCol(1, 1);
 | 
			
		||||
            $grid_sizer->AddGrowableCol(3, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -578,28 +580,45 @@ sub new {
 | 
			
		|||
            );
 | 
			
		||||
            while (my $field = shift @info) {
 | 
			
		||||
                my $label = shift @info;
 | 
			
		||||
                my $text = Wx::StaticText->new($scrolled_window_panel, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
#                my $text = Wx::StaticText->new($scrolled_window_panel, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
                my $text = Wx::StaticText->new($self->{right_panel}, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
                $text->SetFont($Slic3r::GUI::small_font);
 | 
			
		||||
                $grid_sizer->Add($text, 0);
 | 
			
		||||
                #!$grid_sizer->Add($text, 0);
 | 
			
		||||
                
 | 
			
		||||
                $self->{"object_info_$field"} = Wx::StaticText->new($scrolled_window_panel, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
#                $self->{"object_info_$field"} = Wx::StaticText->new($scrolled_window_panel, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
                $self->{"object_info_$field"} = Wx::StaticText->new($self->{right_panel}, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
                $self->{"object_info_$field"}->SetFont($Slic3r::GUI::small_font);
 | 
			
		||||
                if ($field eq 'manifold') {
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($scrolled_window_panel, -1, Wx::Bitmap->new(Slic3r::var("error.png"), wxBITMAP_TYPE_PNG));
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
#                    $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($scrolled_window_panel, -1, Wx::Bitmap->new(Slic3r::var("error.png"), wxBITMAP_TYPE_PNG));
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($self->{right_panel}, -1, Wx::Bitmap->new(Slic3r::var("error.png"), wxBITMAP_TYPE_PNG));
 | 
			
		||||
                    #$self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
                    $self->{"object_info_manifold_warning_icon_show"} = sub {
 | 
			
		||||
                        if ($self->{object_info_manifold_warning_icon}->IsShown() != $_[0]) {
 | 
			
		||||
                            Slic3r::GUI::set_show_manifold_warning_icon($_[0]);
 | 
			
		||||
                            my $mode = wxTheApp->{app_config}->get("view_mode");
 | 
			
		||||
                            return if ($mode eq "" || $mode eq "simple");
 | 
			
		||||
                            $self->{object_info_manifold_warning_icon}->Show($_[0]); 
 | 
			
		||||
                            $self->Layout
 | 
			
		||||
                        }
 | 
			
		||||
                    };
 | 
			
		||||
                    $self->{"object_info_manifold_warning_icon_show"}->(0);
 | 
			
		||||
                    
 | 
			
		||||
                    my $h_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
 | 
			
		||||
                    $h_sizer->Add($self->{object_info_manifold_warning_icon}, 0);
 | 
			
		||||
                    $h_sizer->Add($self->{"object_info_$field"}, 0);
 | 
			
		||||
                    $grid_sizer->Add($h_sizer, 0, wxEXPAND);
 | 
			
		||||
                    $h_sizer->Add($text, 0);
 | 
			
		||||
                    $h_sizer->Add($self->{object_info_manifold_warning_icon}, 0, wxLEFT, 2);
 | 
			
		||||
                    $h_sizer->Add($self->{"object_info_$field"}, 0, wxLEFT, 2);
 | 
			
		||||
                    #!$grid_sizer->Add($h_sizer, 0, wxEXPAND);
 | 
			
		||||
                    $object_info_sizer->Add($h_sizer, 0, wxEXPAND|wxTOP, 4);
 | 
			
		||||
                } else {
 | 
			
		||||
                    $grid_sizer->Add($text, 0);
 | 
			
		||||
                    $grid_sizer->Add($self->{"object_info_$field"}, 0);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $print_info_sizer = $self->{print_info_sizer} = Wx::StaticBoxSizer->new(
 | 
			
		||||
                Wx::StaticBox->new($scrolled_window_panel, -1, L("Sliced Info")), wxVERTICAL);
 | 
			
		||||
#                Wx::StaticBox->new($scrolled_window_panel, -1, L("Sliced Info")), wxVERTICAL);
 | 
			
		||||
                Wx::StaticBox->new($self->{right_panel}, -1, L("Sliced Info")), wxVERTICAL);
 | 
			
		||||
        $print_info_sizer->SetMinSize([300,-1]);
 | 
			
		||||
        
 | 
			
		||||
        my $buttons_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
 | 
			
		||||
| 
						 | 
				
			
			@ -609,22 +628,27 @@ sub new {
 | 
			
		|||
        $buttons_sizer->Add($self->{btn_reslice}, 0, wxALIGN_RIGHT, 0);
 | 
			
		||||
        $buttons_sizer->Add($self->{btn_print}, 0, wxALIGN_RIGHT, 0);
 | 
			
		||||
        $buttons_sizer->Add($self->{btn_send_gcode}, 0, wxALIGN_RIGHT, 0);
 | 
			
		||||
        $buttons_sizer->Add($self->{btn_export_gcode}, 0, wxALIGN_RIGHT, 0);
 | 
			
		||||
        
 | 
			
		||||
        $scrolled_window_sizer->Add($self->{list}, 1, wxEXPAND, 5);
 | 
			
		||||
        $scrolled_window_sizer->Add($object_info_sizer, 0, wxEXPAND, 0);
 | 
			
		||||
        $scrolled_window_sizer->Add($print_info_sizer, 0, wxEXPAND, 0);
 | 
			
		||||
#        $scrolled_window_sizer->Add($self->{list}, 1, wxEXPAND, 5);
 | 
			
		||||
#        $scrolled_window_sizer->Add($object_info_sizer, 0, wxEXPAND, 0);
 | 
			
		||||
#        $scrolled_window_sizer->Add($print_info_sizer, 0, wxEXPAND, 0);
 | 
			
		||||
        #$buttons_sizer->Add($self->{btn_export_gcode}, 0, wxALIGN_RIGHT, 0);
 | 
			
		||||
 | 
			
		||||
        ### Sizer for info boxes
 | 
			
		||||
        my $info_sizer = $self->{info_sizer} = Wx::BoxSizer->new(wxVERTICAL);
 | 
			
		||||
        $info_sizer->SetMinSize([318, -1]);        
 | 
			
		||||
        $info_sizer->Add($object_info_sizer, 0, wxEXPAND | wxBOTTOM, 5);
 | 
			
		||||
        $info_sizer->Add($print_info_sizer, 0, wxEXPAND | wxBOTTOM, 5);
 | 
			
		||||
 | 
			
		||||
        my $right_sizer = Wx::BoxSizer->new(wxVERTICAL);
 | 
			
		||||
        $right_sizer->SetMinSize([320,-1]);
 | 
			
		||||
        $right_sizer->Add($presets, 0, wxEXPAND | wxTOP, 10) if defined $presets;
 | 
			
		||||
        $right_sizer->Add($frequently_changed_parameters_sizer, 0, wxEXPAND | wxTOP, 0) if defined $frequently_changed_parameters_sizer;
 | 
			
		||||
        $right_sizer->Add($buttons_sizer, 0, wxEXPAND | wxBOTTOM, 5);
 | 
			
		||||
        $right_sizer->Add($scrolled_window_panel, 1, wxEXPAND | wxALL, 1);
 | 
			
		||||
        # Show the box initially, let it be shown after the slicing is finished.
 | 
			
		||||
        $self->print_info_box_show(0);
 | 
			
		||||
 | 
			
		||||
        $self->{right_panel}->SetSizer($right_sizer);
 | 
			
		||||
        $right_sizer->SetMinSize([320, -1]);
 | 
			
		||||
        $right_sizer->Add($presets, 0, wxEXPAND | wxTOP, 10) if defined $presets;
 | 
			
		||||
        $right_sizer->Add($frequently_changed_parameters_sizer, 1, wxEXPAND | wxTOP, 0) if defined $frequently_changed_parameters_sizer;
 | 
			
		||||
        $right_sizer->Add($expert_mode_part_sizer, 0, wxEXPAND | wxTOP, 10) if defined $expert_mode_part_sizer;
 | 
			
		||||
        $right_sizer->Add($buttons_sizer, 0, wxEXPAND | wxBOTTOM | wxTOP, 10);
 | 
			
		||||
        $right_sizer->Add($info_sizer, 0, wxEXPAND | wxLEFT, 20);
 | 
			
		||||
        $right_sizer->Add($self->{btn_export_gcode}, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 20);
 | 
			
		||||
 | 
			
		||||
        my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL);
 | 
			
		||||
        $hsizer->Add($self->{preview_notebook}, 1, wxEXPAND | wxTOP, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -637,6 +661,18 @@ sub new {
 | 
			
		|||
        
 | 
			
		||||
        $sizer->SetSizeHints($self);
 | 
			
		||||
        $self->SetSizer($sizer);
 | 
			
		||||
 | 
			
		||||
        # Send sizers/buttons to C++
 | 
			
		||||
        Slic3r::GUI::set_objects_from_perl( $self->{right_panel},
 | 
			
		||||
                                $frequently_changed_parameters_sizer,
 | 
			
		||||
                                $expert_mode_part_sizer,
 | 
			
		||||
                                $info_sizer,
 | 
			
		||||
                                $self->{btn_export_gcode},
 | 
			
		||||
                                $self->{btn_export_stl},
 | 
			
		||||
                                $self->{btn_reslice},
 | 
			
		||||
                                $self->{btn_print},
 | 
			
		||||
                                $self->{btn_send_gcode},
 | 
			
		||||
                                $self->{object_info_manifold_warning_icon} );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last correct selected item for each preset
 | 
			
		||||
| 
						 | 
				
			
			@ -647,6 +683,7 @@ sub new {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    $self->update_ui_from_settings();
 | 
			
		||||
    $self->Layout;
 | 
			
		||||
    
 | 
			
		||||
    return $self;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -921,12 +958,10 @@ sub load_model_objects {
 | 
			
		|||
    foreach my $obj_idx (@obj_idx) {
 | 
			
		||||
        my $object = $self->{objects}[$obj_idx];
 | 
			
		||||
        my $model_object = $self->{model}->objects->[$obj_idx];
 | 
			
		||||
        $self->{list}->InsertStringItem($obj_idx, $object->name);
 | 
			
		||||
        $self->{list}->SetItemFont($obj_idx, Wx::Font->new(10, wxDEFAULT, wxNORMAL, wxNORMAL))
 | 
			
		||||
            if $self->{list}->can('SetItemFont');  # legacy code for wxPerl < 0.9918 not supporting SetItemFont()
 | 
			
		||||
 | 
			
		||||
        # Add object to list on c++ side
 | 
			
		||||
        Slic3r::GUI::add_object_to_list($object->name, $model_object);
 | 
			
		||||
    
 | 
			
		||||
        $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
 | 
			
		||||
        $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%");
 | 
			
		||||
 | 
			
		||||
#        $self->reset_thumbnail($obj_idx);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -936,8 +971,6 @@ sub load_model_objects {
 | 
			
		|||
    # zoom to objects
 | 
			
		||||
    Slic3r::GUI::_3DScene::zoom_to_volumes($self->{canvas3D}) if $self->{canvas3D};
 | 
			
		||||
    
 | 
			
		||||
    $self->{list}->Update;
 | 
			
		||||
    $self->{list}->Select($obj_idx[-1], 1);
 | 
			
		||||
    $self->object_list_changed;
 | 
			
		||||
    
 | 
			
		||||
    $self->schedule_background_process;
 | 
			
		||||
| 
						 | 
				
			
			@ -972,7 +1005,8 @@ sub remove {
 | 
			
		|||
    splice @{$self->{objects}}, $obj_idx, 1;
 | 
			
		||||
    $self->{model}->delete_object($obj_idx);
 | 
			
		||||
    $self->{print}->delete_object($obj_idx);
 | 
			
		||||
    $self->{list}->DeleteItem($obj_idx);
 | 
			
		||||
    # Delete object from list on c++ side
 | 
			
		||||
    Slic3r::GUI::delete_object_from_list();
 | 
			
		||||
    $self->object_list_changed;
 | 
			
		||||
    
 | 
			
		||||
    $self->select_object(undef);
 | 
			
		||||
| 
						 | 
				
			
			@ -992,7 +1026,8 @@ sub reset {
 | 
			
		|||
    @{$self->{objects}} = ();
 | 
			
		||||
    $self->{model}->clear_objects;
 | 
			
		||||
    $self->{print}->clear_objects;
 | 
			
		||||
    $self->{list}->DeleteAllItems;
 | 
			
		||||
    # Delete all objects from list on c++ side
 | 
			
		||||
    Slic3r::GUI::delete_all_objects_from_list();
 | 
			
		||||
    $self->object_list_changed;
 | 
			
		||||
    
 | 
			
		||||
    $self->select_object(undef);
 | 
			
		||||
| 
						 | 
				
			
			@ -1014,7 +1049,8 @@ sub increase {
 | 
			
		|||
        );
 | 
			
		||||
        $self->{print}->objects->[$obj_idx]->add_copy($instance->offset);
 | 
			
		||||
    }
 | 
			
		||||
    $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
 | 
			
		||||
    # Set conut of object on c++ side
 | 
			
		||||
    Slic3r::GUI::set_object_count($obj_idx, $model_object->instances_count);
 | 
			
		||||
    
 | 
			
		||||
    # only autoarrange if user has autocentering enabled
 | 
			
		||||
    $self->stop_background_process;
 | 
			
		||||
| 
						 | 
				
			
			@ -1042,7 +1078,8 @@ sub decrease {
 | 
			
		|||
            $model_object->delete_last_instance;
 | 
			
		||||
            $self->{print}->objects->[$obj_idx]->delete_last_copy;
 | 
			
		||||
        }
 | 
			
		||||
        $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
 | 
			
		||||
        # Set conut of object on c++ side
 | 
			
		||||
        Slic3r::GUI::set_object_count($obj_idx, $model_object->instances_count);
 | 
			
		||||
    } elsif (defined $copies_asked) {
 | 
			
		||||
        # The "decrease" came from the "set number of copies" dialog.
 | 
			
		||||
        $self->remove;
 | 
			
		||||
| 
						 | 
				
			
			@ -1051,11 +1088,7 @@ sub decrease {
 | 
			
		|||
        $self->resume_background_process;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($self->{objects}[$obj_idx]) {
 | 
			
		||||
        $self->{list}->Select($obj_idx, 0);
 | 
			
		||||
        $self->{list}->Select($obj_idx, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $self->update;
 | 
			
		||||
    $self->schedule_background_process;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1153,6 +1186,7 @@ sub rotate {
 | 
			
		|||
#        $model_object->center_around_origin;
 | 
			
		||||
#        $self->reset_thumbnail($obj_idx);
 | 
			
		||||
    }
 | 
			
		||||
    Slic3r::GUI::update_rotation_value(deg2rad($angle), $axis == X ? "x" : ($axis == Y ? "y" : "z"));
 | 
			
		||||
    
 | 
			
		||||
    # update print and start background processing
 | 
			
		||||
    $self->{print}->add_model_object($model_object, $obj_idx);
 | 
			
		||||
| 
						 | 
				
			
			@ -1243,8 +1277,9 @@ sub changescale {
 | 
			
		|||
            $scale = $self->_get_number_from_user(L('Enter the scale % for the selected object:'), L('Scale'), L('Invalid scaling value entered'), $model_instance->scaling_factor*100, 1);
 | 
			
		||||
            return if ! defined($scale) || $scale eq '';
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        $self->{list}->SetItem($obj_idx, 2, "$scale%");
 | 
			
		||||
 | 
			
		||||
        # Set object scale on c++ side
 | 
			
		||||
        Slic3r::GUI::set_object_scale($obj_idx, $scale);
 | 
			
		||||
        $scale /= 100;  # turn percent into factor
 | 
			
		||||
        
 | 
			
		||||
        my $variation = $scale / $model_instance->scaling_factor;
 | 
			
		||||
| 
						 | 
				
			
			@ -1687,9 +1722,15 @@ sub on_export_completed {
 | 
			
		|||
# Fill in the "Sliced info" box with the result of the G-code generator.
 | 
			
		||||
sub print_info_box_show {
 | 
			
		||||
    my ($self, $show) = @_;
 | 
			
		||||
    my $scrolled_window_panel = $self->{scrolled_window_panel}; 
 | 
			
		||||
    my $scrolled_window_sizer = $self->{scrolled_window_sizer};
 | 
			
		||||
    return if (!$show && ($scrolled_window_sizer->IsShown(2) == $show));
 | 
			
		||||
#    my $scrolled_window_panel = $self->{scrolled_window_panel}; 
 | 
			
		||||
#    my $scrolled_window_sizer = $self->{scrolled_window_sizer};
 | 
			
		||||
#    return if (!$show && ($scrolled_window_sizer->IsShown(2) == $show));
 | 
			
		||||
    my $panel = $self->{right_panel};
 | 
			
		||||
    my $sizer = $self->{info_sizer};
 | 
			
		||||
    return if (!$show && ($sizer->IsShown(2) == $show));
 | 
			
		||||
 | 
			
		||||
    Slic3r::GUI::set_show_print_info($show);
 | 
			
		||||
    return if (wxTheApp->{app_config}->get("view_mode") eq "simple");
 | 
			
		||||
 | 
			
		||||
    if ($show) {
 | 
			
		||||
        my $print_info_sizer = $self->{print_info_sizer};
 | 
			
		||||
| 
						 | 
				
			
			@ -1716,17 +1757,23 @@ sub print_info_box_show {
 | 
			
		|||
        while ( my $label = shift @info) {
 | 
			
		||||
            my $value = shift @info;
 | 
			
		||||
            next if $value eq "N/A";
 | 
			
		||||
            my $text = Wx::StaticText->new($scrolled_window_panel, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
 | 
			
		||||
#            my $text = Wx::StaticText->new($scrolled_window_panel, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
 | 
			
		||||
            my $text = Wx::StaticText->new($panel, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
 | 
			
		||||
            $text->SetFont($Slic3r::GUI::small_font);
 | 
			
		||||
            $grid_sizer->Add($text, 0);            
 | 
			
		||||
            my $field = Wx::StaticText->new($scrolled_window_panel, -1, $value, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
#            my $field = Wx::StaticText->new($scrolled_window_panel, -1, $value, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
            my $field = Wx::StaticText->new($panel, -1, $value, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
 | 
			
		||||
            $field->SetFont($Slic3r::GUI::small_font);
 | 
			
		||||
            $grid_sizer->Add($field, 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $scrolled_window_sizer->Show(2, $show);
 | 
			
		||||
    $scrolled_window_panel->Layout;
 | 
			
		||||
#    $scrolled_window_sizer->Show(2, $show);
 | 
			
		||||
#    $scrolled_window_panel->Layout;
 | 
			
		||||
    $sizer->Show(1, $show);
 | 
			
		||||
 | 
			
		||||
#?    $self->Layout;
 | 
			
		||||
#?    $panel->Refresh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub do_print {
 | 
			
		||||
| 
						 | 
				
			
			@ -2058,32 +2105,18 @@ sub on_config_change {
 | 
			
		|||
    $self->schedule_background_process;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub list_item_deselected {
 | 
			
		||||
    my ($self, $event) = @_;
 | 
			
		||||
    return if $PreventListEvents;
 | 
			
		||||
    $self->{_lecursor} = Wx::BusyCursor->new();
 | 
			
		||||
    if ($self->{list}->GetFirstSelected == -1) {
 | 
			
		||||
        $self->select_object(undef);
 | 
			
		||||
#        $self->{canvas}->Refresh;
 | 
			
		||||
        Slic3r::GUI::_3DScene::deselect_volumes($self->{canvas3D}) if $self->{canvas3D};
 | 
			
		||||
        Slic3r::GUI::_3DScene::render($self->{canvas3D}) if $self->{canvas3D};
 | 
			
		||||
    }
 | 
			
		||||
    undef $self->{_lecursor};
 | 
			
		||||
}
 | 
			
		||||
sub item_changed_selection{
 | 
			
		||||
    my ($self, $obj_idx) = @_;
 | 
			
		||||
 | 
			
		||||
sub list_item_selected {
 | 
			
		||||
    my ($self, $event) = @_;
 | 
			
		||||
    return if $PreventListEvents;
 | 
			
		||||
    $self->{_lecursor} = Wx::BusyCursor->new();
 | 
			
		||||
    my $obj_idx = $event->GetIndex;
 | 
			
		||||
    $self->select_object($obj_idx);
 | 
			
		||||
#    $self->{canvas}->Refresh;
 | 
			
		||||
    if ($self->{canvas3D}) {
 | 
			
		||||
        my $selections = $self->collect_selections;
 | 
			
		||||
        Slic3r::GUI::_3DScene::update_volumes_selection($self->{canvas3D}, \@$selections);
 | 
			
		||||
        Slic3r::GUI::_3DScene::deselect_volumes($self->{canvas3D});
 | 
			
		||||
        if ($obj_idx >= 0){
 | 
			
		||||
            my $selections = $self->collect_selections;
 | 
			
		||||
            Slic3r::GUI::_3DScene::update_volumes_selection($self->{canvas3D}, \@$selections);
 | 
			
		||||
        }
 | 
			
		||||
        Slic3r::GUI::_3DScene::render($self->{canvas3D});
 | 
			
		||||
    }
 | 
			
		||||
    undef $self->{_lecursor};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub collect_selections {
 | 
			
		||||
| 
						 | 
				
			
			@ -2095,6 +2128,7 @@ sub collect_selections {
 | 
			
		|||
    return $selections;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# doesn't used now
 | 
			
		||||
sub list_item_activated {
 | 
			
		||||
    my ($self, $event, $obj_idx) = @_;
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -2195,6 +2229,31 @@ sub object_settings_dialog {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub changed_object_settings {
 | 
			
		||||
    my ($self, $obj_idx, $parts_changed, $part_settings_changed) = @_;
 | 
			
		||||
    
 | 
			
		||||
    # update thumbnail since parts may have changed
 | 
			
		||||
    if ($parts_changed) {
 | 
			
		||||
        # recenter and re-align to Z = 0
 | 
			
		||||
        my $model_object = $self->{model}->objects->[$obj_idx];
 | 
			
		||||
        $model_object->center_around_origin;
 | 
			
		||||
        $self->reset_thumbnail($obj_idx);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    # update print
 | 
			
		||||
    if ($parts_changed || $part_settings_changed) {
 | 
			
		||||
        $self->stop_background_process;
 | 
			
		||||
        $self->{print}->reload_object($obj_idx);
 | 
			
		||||
        $self->schedule_background_process;
 | 
			
		||||
        $self->{canvas}->reload_scene if $self->{canvas};
 | 
			
		||||
        my $selections = $self->collect_selections;
 | 
			
		||||
        Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections);
 | 
			
		||||
        Slic3r::GUI::_3DScene::reload_scene($self->{canvas3D}, 0);
 | 
			
		||||
    } else {
 | 
			
		||||
        $self->resume_background_process;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Called to update various buttons depending on whether there are any objects or
 | 
			
		||||
# whether background processing (export of a G-code, sending to Octoprint, forced background re-slicing) is active.
 | 
			
		||||
sub object_list_changed {
 | 
			
		||||
| 
						 | 
				
			
			@ -2296,7 +2355,8 @@ sub selection_changed {
 | 
			
		|||
                $self->{object_info_facets}->SetLabel(sprintf(L('%d (%d shells)'), $model_object->facets_count, $stats->{number_of_parts}));
 | 
			
		||||
                if (my $errors = sum(@$stats{qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)})) {
 | 
			
		||||
                    $self->{object_info_manifold}->SetLabel(sprintf(L("Auto-repaired (%d errors)"), $errors));
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon}->Show;
 | 
			
		||||
                    #$self->{object_info_manifold_warning_icon}->Show;
 | 
			
		||||
                    $self->{"object_info_manifold_warning_icon_show"}->(1);
 | 
			
		||||
                    
 | 
			
		||||
                    # we don't show normals_fixed because we never provide normals
 | 
			
		||||
	                # to admesh, so it generates normals for all facets
 | 
			
		||||
| 
						 | 
				
			
			@ -2306,7 +2366,8 @@ sub selection_changed {
 | 
			
		|||
                    $self->{object_info_manifold_warning_icon}->SetToolTipString($message);
 | 
			
		||||
                } else {
 | 
			
		||||
                    $self->{object_info_manifold}->SetLabel(L("Yes"));
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
                    #$self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
                    $self->{"object_info_manifold_warning_icon_show"}->(0);
 | 
			
		||||
                    $self->{object_info_manifold}->SetToolTipString("");
 | 
			
		||||
                    $self->{object_info_manifold_warning_icon}->SetToolTipString("");
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -2315,7 +2376,8 @@ sub selection_changed {
 | 
			
		|||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            $self->{"object_info_$_"}->SetLabel("") for qw(size volume facets materials manifold);
 | 
			
		||||
            $self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
            #$self->{object_info_manifold_warning_icon}->Hide;
 | 
			
		||||
            $self->{"object_info_manifold_warning_icon_show"}->(0);
 | 
			
		||||
            $self->{object_info_manifold}->SetToolTipString("");
 | 
			
		||||
            $self->{object_info_manifold_warning_icon}->SetToolTipString("");
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -2328,26 +2390,21 @@ sub selection_changed {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
sub select_object {
 | 
			
		||||
    my ($self, $obj_idx) = @_;
 | 
			
		||||
    my ($self, $obj_idx, $child) = @_;
 | 
			
		||||
 | 
			
		||||
    # remove current selection
 | 
			
		||||
    foreach my $o (0..$#{$self->{objects}}) {
 | 
			
		||||
        $PreventListEvents = 1;
 | 
			
		||||
        $self->{objects}->[$o]->selected(0);
 | 
			
		||||
        $self->{list}->Select($o, 0);
 | 
			
		||||
        $PreventListEvents = 0;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (defined $obj_idx) {
 | 
			
		||||
        $self->{objects}->[$obj_idx]->selected(1);
 | 
			
		||||
        # We use this flag to avoid circular event handling
 | 
			
		||||
        # Select() happens to fire a wxEVT_LIST_ITEM_SELECTED on Windows, 
 | 
			
		||||
        # whose event handler calls this method again and again and again
 | 
			
		||||
        $PreventListEvents = 1;
 | 
			
		||||
        $self->{list}->Select($obj_idx, 1);
 | 
			
		||||
        $PreventListEvents = 0;
 | 
			
		||||
        # Select current object in the list on c++ side, if item isn't child
 | 
			
		||||
        if (!defined $child){
 | 
			
		||||
            Slic3r::GUI::select_current_object($obj_idx);}
 | 
			
		||||
    } else {
 | 
			
		||||
        # TODO: deselect all in list
 | 
			
		||||
        # Unselect all objects in the list on c++ side
 | 
			
		||||
        Slic3r::GUI::unselect_objects();
 | 
			
		||||
    }
 | 
			
		||||
    $self->selection_changed(1);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue