diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index ce94d0882..def50e167 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -5,6 +5,7 @@ use utf8; use Wx 0.9901 qw(:bitmap :dialog :icon :id :misc :systemsettings :toplevelwindow :filedialog :font); +use Wx::Event qw(EVT_MENU); BEGIN { # Wrap the Wx::_load_plugin() function which doesn't work with non-ASCII paths @@ -436,6 +437,30 @@ sub scan_serial_ports { return grep !/Bluetooth|FireFly/, @ports; } +sub append_menu_item { + my ($self, $menu, $string, $description, $cb, $id, $icon, $kind) = @_; + + $id //= &Wx::NewId(); + my $item = Wx::MenuItem->new($menu, $id, $string, $description // '', $kind // 0); + $self->set_menu_item_icon($item, $icon); + $menu->Append($item); + + EVT_MENU($self, $id, $cb); + return $item; +} + +sub append_submenu { + my ($self, $menu, $string, $description, $submenu, $id, $icon) = @_; + + $id //= &Wx::NewId(); + my $item = Wx::MenuItem->new($menu, $id, $string, $description // ''); + $self->set_menu_item_icon($item, $icon); + $item->SetSubMenu($submenu); + $menu->Append($item); + + return $item; +} + sub set_menu_item_icon { my ($self, $menuItem, $icon) = @_; diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 1b07d37ef..12ae8abbc 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -10,7 +10,7 @@ use List::Util qw(min); use Slic3r::Geometry qw(X Y Z); use Wx qw(:frame :bitmap :id :misc :notebook :panel :sizer :menu :dialog :filedialog :font :icon wxTheApp); -use Wx::Event qw(EVT_CLOSE EVT_MENU EVT_NOTEBOOK_PAGE_CHANGED); +use Wx::Event qw(EVT_CLOSE EVT_NOTEBOOK_PAGE_CHANGED); use base 'Wx::Frame'; our $qs_last_input_file; @@ -109,60 +109,60 @@ sub _init_menubar { # File menu my $fileMenu = Wx::Menu->new; { - $self->_append_menu_item($fileMenu, "Open STL/OBJ/AMF…\tCtrl+O", 'Open a model', sub { + wxTheApp->append_menu_item($fileMenu, "Open STL/OBJ/AMF…\tCtrl+O", 'Open a model', sub { $self->{plater}->add if $self->{plater}; }, undef, 'brick_add.png'); - $self->_append_menu_item($fileMenu, "Open 2.5D TIN mesh…", 'Import a 2.5D TIN mesh', sub { + wxTheApp->append_menu_item($fileMenu, "Open 2.5D TIN mesh…", 'Import a 2.5D TIN mesh', sub { $self->{plater}->add_tin if $self->{plater}; }, undef, 'map_add.png'); $fileMenu->AppendSeparator(); - $self->_append_menu_item($fileMenu, "&Load Config…\tCtrl+L", 'Load exported configuration file', sub { + wxTheApp->append_menu_item($fileMenu, "&Load Config…\tCtrl+L", 'Load exported configuration file', sub { $self->load_config_file; }, undef, 'plugin_add.png'); - $self->_append_menu_item($fileMenu, "&Export Config…\tCtrl+E", 'Export current configuration to file', sub { + wxTheApp->append_menu_item($fileMenu, "&Export Config…\tCtrl+E", 'Export current configuration to file', sub { $self->export_config; }, undef, 'plugin_go.png'); - $self->_append_menu_item($fileMenu, "&Load Config Bundle…", 'Load presets from a bundle', sub { + wxTheApp->append_menu_item($fileMenu, "&Load Config Bundle…", 'Load presets from a bundle', sub { $self->load_configbundle; }, undef, 'lorry_add.png'); - $self->_append_menu_item($fileMenu, "&Export Config Bundle…", 'Export all presets to file', sub { + wxTheApp->append_menu_item($fileMenu, "&Export Config Bundle…", 'Export all presets to file', sub { $self->export_configbundle; }, undef, 'lorry_go.png'); $fileMenu->AppendSeparator(); my $repeat; - $self->_append_menu_item($fileMenu, "Q&uick Slice…\tCtrl+U", 'Slice file', sub { + wxTheApp->append_menu_item($fileMenu, "Q&uick Slice…\tCtrl+U", 'Slice file', sub { wxTheApp->CallAfter(sub { $self->quick_slice; $repeat->Enable(defined $Slic3r::GUI::MainFrame::last_input_file); }); }, undef, 'cog_go.png'); - $self->_append_menu_item($fileMenu, "Quick Slice and Save &As…\tCtrl+Alt+U", 'Slice file and save as', sub { + wxTheApp->append_menu_item($fileMenu, "Quick Slice and Save &As…\tCtrl+Alt+U", 'Slice file and save as', sub { wxTheApp->CallAfter(sub { $self->quick_slice(save_as => 1); $repeat->Enable(defined $Slic3r::GUI::MainFrame::last_input_file); }); }, undef, 'cog_go.png'); - $repeat = $self->_append_menu_item($fileMenu, "&Repeat Last Quick Slice\tCtrl+Shift+U", 'Repeat last quick slice', sub { + $repeat = wxTheApp->append_menu_item($fileMenu, "&Repeat Last Quick Slice\tCtrl+Shift+U", 'Repeat last quick slice', sub { wxTheApp->CallAfter(sub { $self->quick_slice(reslice => 1); }); }, undef, 'cog_go.png'); $repeat->Enable(0); $fileMenu->AppendSeparator(); - $self->_append_menu_item($fileMenu, "Slice to SV&G…\tCtrl+G", 'Slice file to SVG', sub { + wxTheApp->append_menu_item($fileMenu, "Slice to SV&G…\tCtrl+G", 'Slice file to SVG', sub { $self->quick_slice(save_as => 1, export_svg => 1); }, undef, 'shape_handles.png'); $fileMenu->AppendSeparator(); - $self->_append_menu_item($fileMenu, "Repair STL file…", 'Automatically repair an STL file', sub { + wxTheApp->append_menu_item($fileMenu, "Repair STL file…", 'Automatically repair an STL file', sub { $self->repair_stl; }, undef, 'wrench.png'); $fileMenu->AppendSeparator(); # Cmd+, is standard on OS X - what about other operating systems? - $self->_append_menu_item($fileMenu, "Preferences…\tCtrl+,", 'Application preferences', sub { + wxTheApp->append_menu_item($fileMenu, "Preferences…\tCtrl+,", 'Application preferences', sub { Slic3r::GUI::Preferences->new($self)->ShowModal; }, wxID_PREFERENCES); $fileMenu->AppendSeparator(); - $self->_append_menu_item($fileMenu, "&Quit", 'Quit Slic3r', sub { + wxTheApp->append_menu_item($fileMenu, "&Quit", 'Quit Slic3r', sub { $self->Close(0); }, wxID_EXIT); } @@ -174,23 +174,22 @@ sub _init_menubar { $self->{plater_menu} = Wx::Menu->new; { my $selectMenu = $self->{plater_select_menu} = Wx::Menu->new; - my $selectMenuItem = $self->{plater_menu}->AppendSubMenu($selectMenu, "Select", 'Select an object in the plater'); - wxTheApp->set_menu_item_icon($selectMenuItem, 'brick.png'); + wxTheApp->append_submenu($self->{plater_menu}, "Select", 'Select an object in the plater', $selectMenu, undef, 'brick.png'); } - $self->_append_menu_item($self->{plater_menu}, "Select Next Object\tCtrl+Right", 'Select Next Object in the plater', sub { + wxTheApp->append_menu_item($self->{plater_menu}, "Select Next Object\tCtrl+Right", 'Select Next Object in the plater', sub { $plater->select_next; }, undef, 'arrow_right.png'); - $self->_append_menu_item($self->{plater_menu}, "Select Prev Object\tCtrl+Left", 'Select Previous Object in the plater', sub { + wxTheApp->append_menu_item($self->{plater_menu}, "Select Prev Object\tCtrl+Left", 'Select Previous Object in the plater', sub { $plater->select_prev; }, undef, 'arrow_left.png'); $self->{plater_menu}->AppendSeparator(); - $self->_append_menu_item($self->{plater_menu}, "Export G-code...", 'Export current plate as G-code', sub { + wxTheApp->append_menu_item($self->{plater_menu}, "Export G-code...", 'Export current plate as G-code', sub { $plater->export_gcode; }, undef, 'cog_go.png'); - $self->_append_menu_item($self->{plater_menu}, "Export plate as STL...", 'Export current plate as STL', sub { + wxTheApp->append_menu_item($self->{plater_menu}, "Export plate as STL...", 'Export current plate as STL', sub { $plater->export_stl; }, undef, 'brick_go.png'); - $self->_append_menu_item($self->{plater_menu}, "Export plate with modifiers as AMF...", 'Export current plate as AMF, including all modifier meshes', sub { + wxTheApp->append_menu_item($self->{plater_menu}, "Export plate with modifiers as AMF...", 'Export current plate as AMF, including all modifier meshes', sub { $plater->export_amf; }, undef, 'brick_go.png'); @@ -201,13 +200,13 @@ sub _init_menubar { # Settings menu my $settingsMenu = Wx::Menu->new; { - $self->_append_menu_item($settingsMenu, "P&rint Settings…\tCtrl+1", 'Show the print settings editor', sub { + wxTheApp->append_menu_item($settingsMenu, "P&rint Settings…\tCtrl+1", 'Show the print settings editor', sub { $self->{plater}->show_preset_editor('print'); }, undef, 'cog.png'); - $self->_append_menu_item($settingsMenu, "&Filament Settings…\tCtrl+2", 'Show the filament settings editor', sub { + wxTheApp->append_menu_item($settingsMenu, "&Filament Settings…\tCtrl+2", 'Show the filament settings editor', sub { $self->{plater}->show_preset_editor('filament'); }, undef, 'spool.png'); - $self->_append_menu_item($settingsMenu, "Print&er Settings…\tCtrl+3", 'Show the printer settings editor', sub { + wxTheApp->append_menu_item($settingsMenu, "Print&er Settings…\tCtrl+3", 'Show the printer settings editor', sub { $self->{plater}->show_preset_editor('printer'); }, undef, 'printer_empty.png'); } @@ -215,15 +214,15 @@ sub _init_menubar { # View menu { $self->{viewMenu} = Wx::Menu->new; - $self->_append_menu_item($self->{viewMenu}, "Top\tCtrl+4" , 'Top View' , sub { $self->select_view('top' ); }); - $self->_append_menu_item($self->{viewMenu}, "Bottom\tCtrl+5" , 'Bottom View' , sub { $self->select_view('bottom' ); }); - $self->_append_menu_item($self->{viewMenu}, "Left\tCtrl+6" , 'Left View' , sub { $self->select_view('left' ); }); - $self->_append_menu_item($self->{viewMenu}, "Right\tCtrl+7" , 'Right View' , sub { $self->select_view('right' ); }); - $self->_append_menu_item($self->{viewMenu}, "Front\tCtrl+8" , 'Front View' , sub { $self->select_view('front' ); }); - $self->_append_menu_item($self->{viewMenu}, "Back\tCtrl+9" , 'Back View' , sub { $self->select_view('back' ); }); - $self->_append_menu_item($self->{viewMenu}, "Diagonal\tCtrl+0", 'Diagonal View', sub { $self->select_view('diagonal'); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Top\tCtrl+4" , 'Top View' , sub { $self->select_view('top' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Bottom\tCtrl+5" , 'Bottom View' , sub { $self->select_view('bottom' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Left\tCtrl+6" , 'Left View' , sub { $self->select_view('left' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Right\tCtrl+7" , 'Right View' , sub { $self->select_view('right' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Front\tCtrl+8" , 'Front View' , sub { $self->select_view('front' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Back\tCtrl+9" , 'Back View' , sub { $self->select_view('back' ); }); + wxTheApp->append_menu_item($self->{viewMenu}, "Diagonal\tCtrl+0", 'Diagonal View', sub { $self->select_view('diagonal'); }); $self->{viewMenu}->AppendSeparator(); - $self->{color_toolpaths_by_role} = $self->_append_menu_item($self->{viewMenu}, + $self->{color_toolpaths_by_role} = wxTheApp->append_menu_item($self->{viewMenu}, "Color Toolpaths by Role", 'Color toolpaths according to perimeter/infill/support material', sub { @@ -233,7 +232,7 @@ sub _init_menubar { }, undef, undef, wxITEM_RADIO ); - $self->{color_toolpaths_by_extruder} = $self->_append_menu_item($self->{viewMenu}, + $self->{color_toolpaths_by_extruder} = wxTheApp->append_menu_item($self->{viewMenu}, "Color Toolpaths by Filament", 'Color toolpaths using the configured extruder/filament color', sub { @@ -253,13 +252,13 @@ sub _init_menubar { # Window menu my $windowMenu = Wx::Menu->new; { - $self->_append_menu_item($windowMenu, "&Plater\tCtrl+T", 'Show the plater', sub { + wxTheApp->append_menu_item($windowMenu, "&Plater\tCtrl+T", 'Show the plater', sub { $self->select_tab(0); }, undef, 'application_view_tile.png'); - $self->_append_menu_item($windowMenu, "&Controller\tCtrl+Y", 'Show the printer controller', sub { + wxTheApp->append_menu_item($windowMenu, "&Controller\tCtrl+Y", 'Show the printer controller', sub { $self->select_tab(1); }, undef, 'printer_empty.png') unless ($Slic3r::GUI::Settings->{_}{no_controller}); - $self->_append_menu_item($windowMenu, "DLP Projector…\tCtrl+P", 'Open projector window for DLP printing', sub { + wxTheApp->append_menu_item($windowMenu, "DLP Projector…\tCtrl+P", 'Open projector window for DLP printing', sub { $self->{plater}->pause_background_process; Slic3r::GUI::SLAPrintOptions->new($self)->ShowModal; $self->{plater}->resume_background_process; @@ -269,22 +268,22 @@ sub _init_menubar { # Help menu my $helpMenu = Wx::Menu->new; { - $self->_append_menu_item($helpMenu, "&Configuration $Slic3r::GUI::ConfigWizard::wizard…", "Run Configuration $Slic3r::GUI::ConfigWizard::wizard", sub { + wxTheApp->append_menu_item($helpMenu, "&Configuration $Slic3r::GUI::ConfigWizard::wizard…", "Run Configuration $Slic3r::GUI::ConfigWizard::wizard", sub { $self->config_wizard; }); $helpMenu->AppendSeparator(); - $self->_append_menu_item($helpMenu, "Slic3r &Website", 'Open the Slic3r website in your browser', sub { + wxTheApp->append_menu_item($helpMenu, "Slic3r &Website", 'Open the Slic3r website in your browser', sub { Wx::LaunchDefaultBrowser('http://slic3r.org/'); }); - my $versioncheck = $self->_append_menu_item($helpMenu, "Check for &Updates...", 'Check for new Slic3r versions', sub { + my $versioncheck = wxTheApp->append_menu_item($helpMenu, "Check for &Updates...", 'Check for new Slic3r versions', sub { wxTheApp->check_version(1); }); $versioncheck->Enable(wxTheApp->have_version_check); - $self->_append_menu_item($helpMenu, "Slic3r &Manual", 'Open the Slic3r manual in your browser', sub { + wxTheApp->append_menu_item($helpMenu, "Slic3r &Manual", 'Open the Slic3r manual in your browser', sub { Wx::LaunchDefaultBrowser('http://manual.slic3r.org/'); }); $helpMenu->AppendSeparator(); - $self->_append_menu_item($helpMenu, "&About Slic3r", 'Show about dialog', sub { + wxTheApp->append_menu_item($helpMenu, "&About Slic3r", 'Show about dialog', sub { wxTheApp->about; }); } @@ -631,15 +630,4 @@ sub select_view { $self->{plater}->select_view($direction); } -sub _append_menu_item { - my ($self, $menu, $string, $description, $cb, $id, $icon, $kind) = @_; - - $id //= &Wx::NewId(); - my $item = $menu->Append($id, $string, $description, $kind); - wxTheApp->set_menu_item_icon($item, $icon); - - EVT_MENU($self, $id, $cb); - return $item; -} - 1; diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 5df6e6766..57c33c7ed 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1962,7 +1962,7 @@ sub on_model_change { if ($count > 1) { $name .= " (${count}x)"; } - my $item = $self->GetFrame->_append_menu_item($menu, $name, 'Select object', sub { + my $item = wxTheApp->append_menu_item($menu, $name, 'Select object', sub { $self->select_object($i); $self->refresh_canvases; }, undef, undef, wxITEM_CHECK); @@ -2313,105 +2313,109 @@ sub object_menu { my $frame = $self->GetFrame; my $menu = Wx::Menu->new; - $frame->_append_menu_item($menu, "Delete\tCtrl+Del", 'Remove the selected object', sub { + wxTheApp->append_menu_item($menu, "Delete\tCtrl+Del", 'Remove the selected object', sub { $self->remove; }, undef, 'brick_delete.png'); - $frame->_append_menu_item($menu, "Increase copies\tCtrl++", 'Place one more copy of the selected object', sub { + wxTheApp->append_menu_item($menu, "Increase copies\tCtrl++", 'Place one more copy of the selected object', sub { $self->increase; }, undef, 'add.png'); - $frame->_append_menu_item($menu, "Decrease copies\tCtrl+-", 'Remove one copy of the selected object', sub { + wxTheApp->append_menu_item($menu, "Decrease copies\tCtrl+-", 'Remove one copy of the selected object', sub { $self->decrease; }, undef, 'delete.png'); - $frame->_append_menu_item($menu, "Set number of copies…", 'Change the number of copies of the selected object', sub { + wxTheApp->append_menu_item($menu, "Set number of copies…", 'Change the number of copies of the selected object', sub { $self->set_number_of_copies; }, undef, 'textfield.png'); $menu->AppendSeparator(); - $frame->_append_menu_item($menu, "Move to bed center", 'Center object around bed center', sub { + wxTheApp->append_menu_item($menu, "Move to bed center", 'Center object around bed center', sub { $self->center_selected_object_on_bed; }, undef, 'arrow_in.png'); - $frame->_append_menu_item($menu, "Rotate 45° clockwise", 'Rotate the selected object by 45° clockwise', sub { + wxTheApp->append_menu_item($menu, "Rotate 45° clockwise", 'Rotate the selected object by 45° clockwise', sub { $self->rotate(-45); }, undef, 'arrow_rotate_clockwise.png'); - $frame->_append_menu_item($menu, "Rotate 45° counter-clockwise", 'Rotate the selected object by 45° counter-clockwise', sub { + wxTheApp->append_menu_item($menu, "Rotate 45° counter-clockwise", 'Rotate the selected object by 45° counter-clockwise', sub { $self->rotate(+45); }, undef, 'arrow_rotate_anticlockwise.png'); - my $rotateMenu = Wx::Menu->new; - my $rotateMenuItem = $menu->AppendSubMenu($rotateMenu, "Rotate", 'Rotate the selected object by an arbitrary angle'); - wxTheApp->set_menu_item_icon($rotateMenuItem, 'textfield.png'); - $frame->_append_menu_item($rotateMenu, "Around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', sub { - $self->rotate(undef, X); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($rotateMenu, "Around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', sub { - $self->rotate(undef, Y); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($rotateMenu, "Around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', sub { - $self->rotate(undef, Z); - }, undef, 'bullet_blue.png'); + { + my $rotateMenu = Wx::Menu->new; + wxTheApp->append_menu_item($rotateMenu, "Around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', sub { + $self->rotate(undef, X); + }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($rotateMenu, "Around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', sub { + $self->rotate(undef, Y); + }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($rotateMenu, "Around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', sub { + $self->rotate(undef, Z); + }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Rotate", 'Rotate the selected object by an arbitrary angle', $rotateMenu, undef, 'textfield.png'); + } - my $mirrorMenu = Wx::Menu->new; - my $mirrorMenuItem = $menu->AppendSubMenu($mirrorMenu, "Mirror", 'Mirror the selected object'); - wxTheApp->set_menu_item_icon($mirrorMenuItem, 'shape_flip_horizontal.png'); - $frame->_append_menu_item($mirrorMenu, "Along X axis…", 'Mirror the selected object along the X axis', sub { - $self->mirror(X); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($mirrorMenu, "Along Y axis…", 'Mirror the selected object along the Y axis', sub { - $self->mirror(Y); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($mirrorMenu, "Along Z axis…", 'Mirror the selected object along the Z axis', sub { - $self->mirror(Z); - }, undef, 'bullet_blue.png'); + { + my $mirrorMenu = Wx::Menu->new; + wxTheApp->append_menu_item($mirrorMenu, "Along X axis…", 'Mirror the selected object along the X axis', sub { + $self->mirror(X); + }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($mirrorMenu, "Along Y axis…", 'Mirror the selected object along the Y axis', sub { + $self->mirror(Y); + }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($mirrorMenu, "Along Z axis…", 'Mirror the selected object along the Z axis', sub { + $self->mirror(Z); + }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Mirror", 'Mirror the selected object', $mirrorMenu, undef, 'shape_flip_horizontal.png'); + } - my $scaleMenu = Wx::Menu->new; - my $scaleMenuItem = $menu->AppendSubMenu($scaleMenu, "Scale", 'Scale the selected object along a single axis'); - wxTheApp->set_menu_item_icon($scaleMenuItem, 'arrow_out.png'); - $frame->_append_menu_item($scaleMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub { - $self->changescale(undef); - }); - $frame->_append_menu_item($scaleMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { - $self->changescale(X); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($scaleMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { - $self->changescale(Y); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($scaleMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { - $self->changescale(Z); - }, undef, 'bullet_blue.png'); + { + my $scaleMenu = Wx::Menu->new; + wxTheApp->append_menu_item($scaleMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub { + $self->changescale(undef); + }); + wxTheApp->append_menu_item($scaleMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { + $self->changescale(X); + }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($scaleMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { + $self->changescale(Y); + }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($scaleMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { + $self->changescale(Z); + }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Scale", 'Scale the selected object by a given factor', $scaleMenu, undef, 'arrow_out.png'); + } - my $scaleToSizeMenu = Wx::Menu->new; - my $scaleToSizeMenuItem = $menu->AppendSubMenu($scaleToSizeMenu, "Scale to size", 'Scale the selected object along a single axis'); - wxTheApp->set_menu_item_icon($scaleToSizeMenuItem, 'arrow_out.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub { - $self->changescale(undef, 1); - }); - $frame->_append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { - $self->changescale(X, 1); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { - $self->changescale(Y, 1); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { - $self->changescale(Z, 1); - }, undef, 'bullet_blue.png'); + { + my $scaleToSizeMenu = Wx::Menu->new; + wxTheApp->append_menu_item($scaleToSizeMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub { + $self->changescale(undef, 1); + }); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { + $self->changescale(X, 1); + }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { + $self->changescale(Y, 1); + }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { + $self->changescale(Z, 1); + }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Scale to size", 'Scale the selected object to match a given size', $scaleToSizeMenu, undef, 'arrow_out.png'); + } - $frame->_append_menu_item($menu, "Split", 'Split the selected object into individual parts', sub { + wxTheApp->append_menu_item($menu, "Split", 'Split the selected object into individual parts', sub { $self->split_object; }, undef, 'shape_ungroup.png'); - $frame->_append_menu_item($menu, "Cut…", 'Open the 3D cutting tool', sub { + wxTheApp->append_menu_item($menu, "Cut…", 'Open the 3D cutting tool', sub { $self->object_cut_dialog; }, undef, 'package.png'); $menu->AppendSeparator(); - $frame->_append_menu_item($menu, "Settings…", 'Open the object editor dialog', sub { + wxTheApp->append_menu_item($menu, "Settings…", 'Open the object editor dialog', sub { $self->object_settings_dialog; }, undef, 'cog.png'); $menu->AppendSeparator(); - $frame->_append_menu_item($menu, "Reload from Disk", 'Reload the selected file from Disk', sub { + wxTheApp->append_menu_item($menu, "Reload from Disk", 'Reload the selected file from Disk', sub { $self->reload_from_disk; }, undef, 'arrow_refresh.png'); - $frame->_append_menu_item($menu, "Export object as STL…", 'Export this single object as STL file', sub { + wxTheApp->append_menu_item($menu, "Export object as STL…", 'Export this single object as STL file', sub { $self->export_object_stl; }, undef, 'brick_go.png'); - $frame->_append_menu_item($menu, "Export object and modifiers as AMF…", 'Export this single object and all associated modifiers as AMF file', sub { + wxTheApp->append_menu_item($menu, "Export object and modifiers as AMF…", 'Export this single object and all associated modifiers as AMF file', sub { $self->export_object_amf; }, undef, 'brick_go.png'); diff --git a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm index 17090438d..308627b3f 100644 --- a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm +++ b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm @@ -163,35 +163,30 @@ sub new { my $item = $event->GetItem; my $frame = $self->GetFrame; my $menu = Wx::Menu->new; - - my $scaleToSizeMenu = Wx::Menu->new; - my $scaleToSizeMenuItem = $menu->AppendSubMenu($scaleToSizeMenu, "Scale to size", 'Scale the selected object along a single axis'); - wxTheApp->set_menu_item_icon($scaleToSizeMenuItem, 'arrow_out.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Uniformly… ", 'Scale the selected object along the XYZ axes', sub { - $self->changescale(undef, 1); - }); - $frame->_append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { - $self->changescale(X, 1); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { - $self->changescale(Y, 1); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { - $self->changescale(Z, 1); - }, undef, 'bullet_blue.png'); - my $rotateMenu = Wx::Menu->new; - my $rotateMenuItem = $menu->AppendSubMenu($rotateMenu, "Rotate", 'Rotate the selected object by an arbitrary angle'); - wxTheApp->set_menu_item_icon($rotateMenuItem, 'textfield.png'); - $frame->_append_menu_item($rotateMenu, "Around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', sub { - $self->rotate(undef, X); - }, undef, 'bullet_red.png'); - $frame->_append_menu_item($rotateMenu, "Around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', sub { - $self->rotate(undef, Y); - }, undef, 'bullet_green.png'); - $frame->_append_menu_item($rotateMenu, "Around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', sub { - $self->rotate(undef, Z); - }, undef, 'bullet_blue.png'); - + + { + my $scaleToSizeMenu = Wx::Menu->new; + wxTheApp->append_menu_item($scaleToSizeMenu, "Uniformly… ", 'Scale the selected object along the XYZ axes', + sub { $self->changescale(undef, 1) }); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', + sub { $self->changescale(X, 1) }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', + sub { $self->changescale(Y, 1) }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', + sub { $self->changescale(Z, 1) }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Scale to size", 'Scale the selected object along a single axis', + $scaleToSizeMenu, undef, 'arrow_out.png'); + } + { + my $rotateMenu = Wx::Menu->new; + wxTheApp->append_menu_item($rotateMenu, "Around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', + sub { $self->rotate(undef, X) }, undef, 'bullet_red.png'); + wxTheApp->append_menu_item($rotateMenu, "Around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', + sub { $self->rotate(undef, Y) }, undef, 'bullet_green.png'); + wxTheApp->append_menu_item($rotateMenu, "Around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', + sub { $self->rotate(undef, Z) }, undef, 'bullet_blue.png'); + wxTheApp->append_submenu($menu, "Rotate", 'Rotate the selected object by an arbitrary angle', $rotateMenu, undef, 'textfield.png'); + } $frame->PopupMenu($menu, $event->GetPoint); }); EVT_BUTTON($self, $self->{btn_load_part}, sub { $self->on_btn_load(0) }); diff --git a/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm b/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm index 2cca0d901..854748765 100644 --- a/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm +++ b/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm @@ -53,16 +53,6 @@ sub PartSettingsChanged { my ($self) = @_; return $self->{parts}->PartSettingsChanged || $self->{layers}->LayersChanged; } -sub _append_menu_item { - my ($self, $menu, $string, $description, $cb, $id, $icon, $kind) = @_; - - $id //= &Wx::NewId(); - my $item = $menu->Append($id, $string, $description, $kind); - wxTheApp->set_menu_item_icon($item, $icon); - - EVT_MENU($self, $id, $cb); - return $item; -} package Slic3r::GUI::Plater::ObjectDialog::BaseTab; diff --git a/lib/Slic3r/GUI/Plater/OverrideSettingsPanel.pm b/lib/Slic3r/GUI/Plater/OverrideSettingsPanel.pm index 8e5e6b52b..9e91a7a56 100644 --- a/lib/Slic3r/GUI/Plater/OverrideSettingsPanel.pm +++ b/lib/Slic3r/GUI/Plater/OverrideSettingsPanel.pm @@ -53,8 +53,6 @@ sub new { my $menu = Wx::Menu->new; my $last_cat = ''; foreach my $opt_key (@{$self->{options}}) { - my $id = &Wx::NewId(); - # add icon, if we have one for this category my $icon; if (my $cat = $Slic3r::Config::Options->{$opt_key}{category}) { @@ -65,14 +63,14 @@ sub new { $icon = $icons{$cat}; } - my $menuItem = $menu->Append($id, $self->{option_labels}{$opt_key}); - wxTheApp->set_menu_item_icon($menuItem, $icon) if $icon; - - EVT_MENU($menu, $id, sub { + my $cb = sub { $self->{config}->set($opt_key, $self->{default_config}->get($opt_key)); $self->update_optgroup; $self->{on_change}->($opt_key) if $self->{on_change}; - }); + }; + + wxTheApp->append_menu_item($menu, $self->{option_labels}{$opt_key}, + $Slic3r::Config::Options->{$opt_key}{tooltip}, $cb, undef, $icon); } $self->PopupMenu($menu, $btn->GetPosition); $menu->Destroy;