From fd8a3303c46ebdd65bc1ef89ee159805c6d2c1cd Mon Sep 17 00:00:00 2001 From: Gilbert Date: Sun, 14 Oct 2018 21:51:02 +0200 Subject: [PATCH] Extended GUI (#4419) * Extended GUI - 2nd try. * Update Preferences.pm missing comma --- lib/Slic3r/GUI.pm | 1 + lib/Slic3r/GUI/ColorScheme.pm | 70 +++- lib/Slic3r/GUI/Plater.pm | 303 ++++++++++++++---- lib/Slic3r/GUI/Preferences.pm | 12 +- var/arrow_rotate_x_anticlockwise.png | Bin 0 -> 599 bytes var/arrow_rotate_x_clockwise.png | Bin 0 -> 595 bytes var/arrow_rotate_y_anticlockwise.png | Bin 0 -> 716 bytes var/arrow_rotate_y_clockwise.png | Bin 0 -> 706 bytes var/arrow_rotate_z_anticlockwise.png | Bin 0 -> 644 bytes var/arrow_rotate_z_clockwise.png | Bin 0 -> 629 bytes var/shape_flip_horizontal_x.png | Bin 0 -> 497 bytes var/shape_flip_horizontal_y.png | Bin 0 -> 492 bytes var/shape_flip_horizontal_z.png | Bin 0 -> 403 bytes var/solarized/arrow_rotate_x_180.png | Bin 0 -> 701 bytes var/solarized/arrow_rotate_x_180_16.png | Bin 0 -> 487 bytes .../arrow_rotate_x_anticlockwise90.png | Bin 0 -> 767 bytes .../arrow_rotate_x_anticlockwise90_16.png | Bin 0 -> 785 bytes var/solarized/arrow_rotate_x_clockwise90.png | Bin 0 -> 712 bytes .../arrow_rotate_x_clockwise90_16.png | Bin 0 -> 792 bytes var/solarized/arrow_rotate_y_180.png | Bin 0 -> 640 bytes var/solarized/arrow_rotate_y_180_16.png | Bin 0 -> 482 bytes .../arrow_rotate_y_anticlockwise90.png | Bin 0 -> 722 bytes .../arrow_rotate_y_anticlockwise90_16.png | Bin 0 -> 735 bytes var/solarized/arrow_rotate_y_clockwise90.png | Bin 0 -> 708 bytes .../arrow_rotate_y_clockwise90_16.png | Bin 0 -> 748 bytes var/solarized/arrow_rotate_z_180.png | Bin 0 -> 748 bytes var/solarized/arrow_rotate_z_180_16.png | Bin 0 -> 544 bytes .../arrow_rotate_z_anticlockwise45.png | Bin 0 -> 720 bytes .../arrow_rotate_z_anticlockwise45_16.png | Bin 0 -> 725 bytes .../arrow_rotate_z_anticlockwise90.png | Bin 0 -> 753 bytes .../arrow_rotate_z_anticlockwise90_16.png | Bin 0 -> 737 bytes var/solarized/arrow_rotate_z_clockwise45.png | Bin 0 -> 707 bytes .../arrow_rotate_z_clockwise45_16.png | Bin 0 -> 716 bytes var/solarized/arrow_rotate_z_clockwise90.png | Bin 0 -> 723 bytes .../arrow_rotate_z_clockwise90_16.png | Bin 0 -> 734 bytes 35 files changed, 317 insertions(+), 69 deletions(-) create mode 100644 var/arrow_rotate_x_anticlockwise.png create mode 100644 var/arrow_rotate_x_clockwise.png create mode 100644 var/arrow_rotate_y_anticlockwise.png create mode 100644 var/arrow_rotate_y_clockwise.png create mode 100644 var/arrow_rotate_z_anticlockwise.png create mode 100644 var/arrow_rotate_z_clockwise.png create mode 100644 var/shape_flip_horizontal_x.png create mode 100644 var/shape_flip_horizontal_y.png create mode 100644 var/shape_flip_horizontal_z.png create mode 100644 var/solarized/arrow_rotate_x_180.png create mode 100644 var/solarized/arrow_rotate_x_180_16.png create mode 100644 var/solarized/arrow_rotate_x_anticlockwise90.png create mode 100644 var/solarized/arrow_rotate_x_anticlockwise90_16.png create mode 100644 var/solarized/arrow_rotate_x_clockwise90.png create mode 100644 var/solarized/arrow_rotate_x_clockwise90_16.png create mode 100644 var/solarized/arrow_rotate_y_180.png create mode 100644 var/solarized/arrow_rotate_y_180_16.png create mode 100644 var/solarized/arrow_rotate_y_anticlockwise90.png create mode 100644 var/solarized/arrow_rotate_y_anticlockwise90_16.png create mode 100644 var/solarized/arrow_rotate_y_clockwise90.png create mode 100644 var/solarized/arrow_rotate_y_clockwise90_16.png create mode 100644 var/solarized/arrow_rotate_z_180.png create mode 100644 var/solarized/arrow_rotate_z_180_16.png create mode 100644 var/solarized/arrow_rotate_z_anticlockwise45.png create mode 100644 var/solarized/arrow_rotate_z_anticlockwise45_16.png create mode 100644 var/solarized/arrow_rotate_z_anticlockwise90.png create mode 100644 var/solarized/arrow_rotate_z_anticlockwise90_16.png create mode 100644 var/solarized/arrow_rotate_z_clockwise45.png create mode 100644 var/solarized/arrow_rotate_z_clockwise45_16.png create mode 100644 var/solarized/arrow_rotate_z_clockwise90.png create mode 100644 var/solarized/arrow_rotate_z_clockwise90_16.png diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 1bbffc92e..8ed184fc4 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -94,6 +94,7 @@ our $Settings = { tabbed_preset_editors => 1, show_host => 0, nudge_val => 1, + extended_gui => 0, reload_hide_dialog => 0, reload_behavior => 0 }, diff --git a/lib/Slic3r/GUI/ColorScheme.pm b/lib/Slic3r/GUI/ColorScheme.pm index dec1dc392..6beca9f94 100644 --- a/lib/Slic3r/GUI/ColorScheme.pm +++ b/lib/Slic3r/GUI/ColorScheme.pm @@ -6,7 +6,7 @@ use POSIX; use vars qw(@ISA @EXPORT); use Exporter 'import'; our @ISA = 'Exporter'; -our @EXPORT = qw($DEFAULT_COLORSCHEME $SOLID_BACKGROUNDCOLOR @SELECTED_COLOR @HOVER_COLOR @TOP_COLOR @BOTTOM_COLOR @GRID_COLOR @GROUND_COLOR @COLOR_CUTPLANE @COLOR_PARTS @COLOR_INFILL @COLOR_SUPPORT @COLOR_UNKNOWN @BED_COLOR @BED_GRID @BED_SELECTED @BED_OBJECTS @BED_INSTANCE @BED_DRAGGED @BED_CENTER @BED_SKIRT @BED_CLEARANCE @BED_DARK @BACKGROUND255 @TOOL_DARK @TOOL_SUPPORT @TOOL_STEPPERIM @TOOL_INFILL @TOOL_SHADE @TOOL_COLOR @BACKGROUND_COLOR @SPLINE_L_PEN @SPLINE_O_PEN @SPLINE_I_PEN @SPLINE_R_PEN ); +our @EXPORT = qw($DEFAULT_COLORSCHEME $SOLID_BACKGROUNDCOLOR @SELECTED_COLOR @HOVER_COLOR @TOP_COLOR @BOTTOM_COLOR @GRID_COLOR @GROUND_COLOR @COLOR_CUTPLANE @COLOR_PARTS @COLOR_INFILL @COLOR_SUPPORT @COLOR_UNKNOWN @BED_COLOR @BED_GRID @BED_SELECTED @BED_OBJECTS @BED_INSTANCE @BED_DRAGGED @BED_CENTER @BED_SKIRT @BED_CLEARANCE @BED_DARK @BACKGROUND255 @TOOL_DARK @TOOL_SUPPORT @TOOL_STEPPERIM @TOOL_INFILL @TOOL_SHADE @TOOL_COLOR @BACKGROUND_COLOR @SPLINE_L_PEN @SPLINE_O_PEN @SPLINE_I_PEN @SPLINE_R_PEN @rotateX90cw @rotateX90ccw @rotateX180 @rotateY90cw @rotateY90ccw @rotateY180 @rotateZ90cw @rotateZ90ccw @rotateZ180 @rotate45cw @rotate45ccw @rotateX90cwT @rotateX90ccwT @rotateY90cwT @rotateY90ccwT @rotateZ90cwT @rotateZ90ccwT @rotateZ45cwT @rotateZ45ccwT @mirrorX @mirrorY @mirrorZ ); # DEFAULT values our $DEFAULT_COLORSCHEME = 1; @@ -45,6 +45,34 @@ our @SPLINE_I_PEN = (255, 0, 0); our @SPLINE_R_PEN = (5, 120, 160); our @BED_DARK = (0, 0, 0); +# ICONS for the Context Menu +our @rotateX90cw = "arrow_rotate_x_clockwise.png"; +our @rotateX90ccw = "arrow_rotate_x_anticlockwise.png"; +our @rotateX180 = "arrow_rotate_x_clockwise.png"; +our @rotateY90cw = "arrow_rotate_y_clockwise.png"; +our @rotateY90ccw = "arrow_rotate_y_anticlockwise.png"; +our @rotateY180 = "arrow_rotate_y_clockwise.png"; +our @rotateZ90cw = "arrow_rotate_z_clockwise.png"; +our @rotateZ90ccw = "arrow_rotate_z_anticlockwise.png"; +our @rotateZ180 = "arrow_rotate_z_clockwise.png"; +our @rotate45cw = "arrow_rotate_z_clockwise.png"; +our @rotate45ccw = "arrow_rotate_z_anticlockwise.png"; +our @mirrorX = 'shape_flip_horizontal_x.png'; +our @mirrorY = 'shape_flip_horizontal_y.png'; +our @mirrorZ = 'shape_flip_horizontal_z.png'; + +# ICONS for the Toolbar (might be different) +our @rotateX90cwT = "arrow_rotate_x_clockwise.png"; +our @rotateX90ccwT = "arrow_rotate_x_anticlockwise.png"; +our @rotateY90cwT = "arrow_rotate_y_clockwise.png"; +our @rotateY90ccwT = "arrow_rotate_y_anticlockwise.png"; +our @rotateZ90cwT = "arrow_rotate_z_clockwise.png"; +our @rotateZ90ccwT = "arrow_rotate_z_anticlockwise.png"; +our @rotateZ45cwT = "arrow_rotate_z_clockwise.png"; +our @rotateZ45ccwT = "arrow_rotate_z_anticlockwise.png"; + + + # S O L A R I Z E # # http://ethanschoonover.com/solarized our @COLOR_BASE03 = (0.00000,0.16863,0.21176); @@ -72,6 +100,12 @@ our @COLOR_GREEN = (0.52157,0.60000,0.00000); sub getSolarized { # add this name to Preferences.pm $DEFAULT_COLORSCHEME = 0; # DISABLE default color scheme $SOLID_BACKGROUNDCOLOR = 1; # Switch between SOLID or FADED background color + my $largeicons = 0; # Default: 0. 1 for large icons-set. + + if ($Slic3r::GUI::Settings->{_}{extended_gui} >= 4){ + $largeicons = 1; + } + @SELECTED_COLOR = @COLOR_MAGENTA; # Color of selected Model @HOVER_COLOR = @COLOR_VIOLET; # Color when hovering over Model # @TOP_COLOR = @COLOR_BASE2; # FADE Background color - only used if $SOLID_BACKGROUNDCOLOR = 0 @@ -112,6 +146,40 @@ sub getSolarized { # add this name to Preferences.pm @SPLINE_I_PEN = map { ceil($_ * 255) } @COLOR_MAGENTA; # Interactive color @SPLINE_R_PEN = map { ceil($_ * 255) } @COLOR_VIOLET; # Resulting color + if ($largeicons == 1){ # use large icons + # ICONS for the Toolbar (might be different) + our @rotateX90cwT = 'solarized/arrow_rotate_x_clockwise90.png'; + our @rotateX90ccwT = 'solarized/arrow_rotate_x_anticlockwise90.png'; + our @rotateY90cwT = 'solarized/arrow_rotate_y_clockwise90.png'; + our @rotateY90ccwT = 'solarized/arrow_rotate_y_anticlockwise90.png'; + our @rotateZ90cwT = 'solarized/arrow_rotate_z_clockwise90.png'; + our @rotateZ90ccwT = 'solarized/arrow_rotate_z_anticlockwise90.png'; + our @rotateZ45cwT = 'solarized/arrow_rotate_z_clockwise45.png'; + our @rotateZ45ccwT = 'solarized/arrow_rotate_z_anticlockwise45.png'; + } else { + # use default or small icons + our @rotateX90cwT = 'solarized/arrow_rotate_x_clockwise90_16.png'; + our @rotateX90ccwT = 'solarized/arrow_rotate_x_anticlockwise90_16.png'; + our @rotateY90cwT = 'solarized/arrow_rotate_y_clockwise90_16.png'; + our @rotateY90ccwT = 'solarized/arrow_rotate_y_anticlockwise90_16.png'; + our @rotateZ90cwT = 'solarized/arrow_rotate_z_clockwise90_16.png'; + our @rotateZ90ccwT = 'solarized/arrow_rotate_z_anticlockwise90_16.png'; + our @rotateZ45cwT = 'solarized/arrow_rotate_z_clockwise45_16.png'; + our @rotateZ45ccwT = 'solarized/arrow_rotate_z_anticlockwise45_16.png'; + } + + our @rotateX90cw = 'solarized/arrow_rotate_x_clockwise90_16.png'; + our @rotateX90ccw = 'solarized/arrow_rotate_x_anticlockwise90_16.png'; + our @rotateX180 = 'solarized/arrow_rotate_x_180_16.png'; + our @rotateY90cw = 'solarized/arrow_rotate_y_clockwise90_16.png'; + our @rotateY90ccw = 'solarized/arrow_rotate_y_anticlockwise90_16.png'; + our @rotateY180 = 'solarized/arrow_rotate_y_180_16.png'; + our @rotateZ90cw = 'solarized/arrow_rotate_z_clockwise90_16.png'; + our @rotateZ90ccw = 'solarized/arrow_rotate_z_anticlockwise90_16.png'; + our @rotateZ180 = 'solarized/arrow_rotate_z_180_16.png'; + our @rotate45cw = 'solarized/arrow_rotate_z_clockwise45_16.png'; + our @rotate45ccw = 'solarized/arrow_rotate_z_anticlockwise45_16.png'; + } sub getDefault{ diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 4c083bbfe..f1d2cb735 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -31,6 +31,7 @@ use Wx qw(:button :cursor :dialog :filedialog :keycode :icon :font :id :misc use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE EVT_COMBOBOX EVT_TIMER EVT_NOTEBOOK_PAGE_CHANGED EVT_LEFT_UP EVT_CLOSE); use base qw(Wx::Panel Class::Accessor); +use Slic3r::GUI::ColorScheme; __PACKAGE__->mk_accessors(qw(presets)); @@ -42,6 +43,12 @@ use constant TB_EXPORT_GCODE => &Wx::NewId; use constant TB_EXPORT_STL => &Wx::NewId; use constant TB_MORE => &Wx::NewId; use constant TB_FEWER => &Wx::NewId; +use constant TB_X90CW => &Wx::NewId; +use constant TB_X90CCW => &Wx::NewId; +use constant TB_Y90CW => &Wx::NewId; +use constant TB_Y90CCW => &Wx::NewId; +use constant TB_Z90CW => &Wx::NewId; +use constant TB_Z90CCW => &Wx::NewId; use constant TB_45CW => &Wx::NewId; use constant TB_45CCW => &Wx::NewId; use constant TB_ROTFACE => &Wx::NewId; @@ -191,9 +198,22 @@ sub new { $self->{htoolbar}->AddTool(TB_MORE, "More", Wx::Bitmap->new($Slic3r::var->("add.png"), wxBITMAP_TYPE_PNG), ''); $self->{htoolbar}->AddTool(TB_FEWER, "Fewer", Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG), ''); $self->{htoolbar}->AddSeparator; - $self->{htoolbar}->AddTool(TB_45CCW, "45° ccw", Wx::Bitmap->new($Slic3r::var->("arrow_rotate_anticlockwise.png"), wxBITMAP_TYPE_PNG), ''); - $self->{htoolbar}->AddTool(TB_45CW, "45° cw", Wx::Bitmap->new($Slic3r::var->("arrow_rotate_clockwise.png"), wxBITMAP_TYPE_PNG), ''); + + if ($Slic3r::GUI::Settings->{_}{extended_gui} >= 2) { # if Toolbar enabled + $self->{htoolbar}->AddTool(TB_X90CCW, "90° X ccw", Wx::Bitmap->new(@rotateX90ccwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_X90CW, "90° X cw", Wx::Bitmap->new(@rotateX90cwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_Y90CCW, "90° Y ccw", Wx::Bitmap->new(@rotateY90ccwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_Y90CW, "90° Y cw", Wx::Bitmap->new(@rotateY90cwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_Z90CCW, "90° Z ccw", Wx::Bitmap->new(@rotateZ90ccwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_Z90CW, "90° Z cw", Wx::Bitmap->new(@rotateZ90cwT, wxBITMAP_TYPE_PNG), ''); + } + + $self->{htoolbar}->AddTool(TB_45CCW, "45° ccw", Wx::Bitmap->new(@rotateZ45ccwT, wxBITMAP_TYPE_PNG), ''); + $self->{htoolbar}->AddTool(TB_45CW, "45° cw", Wx::Bitmap->new(@rotateZ45cwT, wxBITMAP_TYPE_PNG), ''); $self->{htoolbar}->AddTool(TB_ROTFACE, "Rotate face", Wx::Bitmap->new($Slic3r::var->("rotate_face.png"), wxBITMAP_TYPE_PNG), ''); + + $self->{htoolbar}->AddSeparator; + $self->{htoolbar}->AddTool(TB_SCALE, "Scale…", Wx::Bitmap->new($Slic3r::var->("arrow_out.png"), wxBITMAP_TYPE_PNG), ''); $self->{htoolbar}->AddTool(TB_SPLIT, "Split", Wx::Bitmap->new($Slic3r::var->("shape_ungroup.png"), wxBITMAP_TYPE_PNG), ''); $self->{htoolbar}->AddTool(TB_CUT, "Cut…", Wx::Bitmap->new($Slic3r::var->("package.png"), wxBITMAP_TYPE_PNG), ''); @@ -208,8 +228,14 @@ sub new { arrange => "Arrange", increase => "", decrease => "", - rotate45ccw => "", - rotate45cw => "", + rotateX90ccw => "", + rotateX90cw => "", + rotateY90ccw => "", + rotateY90cw => "", + rotateZ90ccw => "", + rotateZ90cw => "", + rotateZ45ccw => "", + rotateZ45cw => "", rotateFace => "", changescale => "Scale…", split => "Split", @@ -217,10 +243,43 @@ sub new { layers => "Layer heights…", settings => "Settings…", ); + my %tbar_buttonsToolTip = ( + add => "Adds new Objects", + remove => "Delete Object", + reset => "Clears the Plate of all Objects", + arrange => "Automaitally arrange Objects", + increase => "Add another Copy", + decrease => "Remove a Copy", + rotateX90ccw => "Rotate around X by 90° counter clockwise", + rotateX90cw => "Rotate around X by 90° clockwise", + rotateY90ccw => "Rotate around Y by 90° counter clockwise", + rotateY90cw => "Rotate around Y by 90° clockwise", + rotateZ90ccw => "Rotate around Z by 90° counter clockwise", + rotateZ90cw => "Rotate around Z by 90° clockwise", + rotateZ45ccw => "Rotate around Z by 45° counter clockwise", + rotateZ45cw => "Rotate around Z by 45° clockwise", + rotateFace => "Rotate to Face", + changescale => "Change Scale of Object", + split => "Split Object", + cut => "Cut Object", + settings => "Settings, Parts, Modifiers and Layers", + ); $self->{btoolbar} = Wx::BoxSizer->new(wxHORIZONTAL); - for (qw(add remove reset arrange increase decrease rotate45ccw rotate45cw rotateFace changescale split cut layers settings)) { - $self->{"btn_$_"} = Wx::Button->new($self, -1, $tbar_buttons{$_}, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); - $self->{btoolbar}->Add($self->{"btn_$_"}); + + + if ($Slic3r::GUI::Settings->{_}{extended_gui} >= 2) { # if Toolbar enabled + for (qw(add remove reset arrange increase decrease rotateX90ccw rotateX90cw rotateY90ccw rotateY90cw rotateZ90ccw rotateZ90cw rotateZ45ccw rotateZ45cw changescale split cut settings)) { + $self->{"btn_$_"} = Wx::Button->new($self, -1, $tbar_buttons{$_}, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); + $self->{btoolbar}->Add($self->{"btn_$_"}); + $self->{"btn_$_"}->SetToolTipString($tbar_buttonsToolTip{$_}); + } + } else { + for (qw(add remove reset arrange increase decrease rotateZ45ccw rotateZ45cw rotateFace changescale split cut settings)) { + $self->{"btn_$_"} = Wx::Button->new($self, -1, $tbar_buttons{$_}, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); + $self->{btoolbar}->Add($self->{"btn_$_"}); + $self->{"btn_$_"}->SetToolTipString($tbar_buttonsToolTip{$_}); + } + } } @@ -235,26 +294,36 @@ sub new { $self->{btn_send_gcode}->Hide; if ($Slic3r::GUI::have_button_icons) { - my %icons = qw( - add brick_add.png - remove brick_delete.png - reset cross.png - arrange bricks.png - export_gcode cog_go.png - print arrow_up.png - send_gcode arrow_up.png - export_stl brick_go.png + my %icons = ( + add => "brick_add.png", + remove => "brick_delete.png", + reset => "cross.png", + arrange => "bricks.png", + export_gcode => "cog_go.png", + print => "arrow_up.png", + send_gcode => "arrow_up.png", + export_stl => "brick_go.png", - increase add.png - decrease delete.png - rotate45cw arrow_rotate_clockwise.png - rotate45ccw arrow_rotate_anticlockwise.png - rotateFace rotate_face.png - changescale arrow_out.png - split shape_ungroup.png - cut package.png - layers variable_layer_height.png - settings cog.png + increase => "add.png", + decrease => "delete.png", + + + rotateX90cw => @rotateX90cwT, + rotateX90ccw => @rotateX90ccwT, + rotateY90cw => @rotateY90cwT, + rotateY90ccw => @rotateY90ccwT, + rotateZ90cw => @rotateZ90cwT, + rotateZ90ccw => @rotateZ90ccwT, + rotateZ45cw => @rotateZ45cwT, + rotateZ45ccw => @rotateZ45ccwT, + + rotateFace => "rotate_face.png", + changescale => "arrow_out.png", + split => "shape_ungroup.png", + cut => "package.png", + layers => "variable_layer_height.png", + settings => "cog.png", + ); for (grep $self->{"btn_$_"}, keys %icons) { $self->{"btn_$_"}->SetBitmap(Wx::Bitmap->new($Slic3r::var->($icons{$_}), wxBITMAP_TYPE_PNG)); @@ -285,9 +354,18 @@ sub new { EVT_TOOL($self, TB_ARRANGE, sub { $self->arrange; }); EVT_TOOL($self, TB_MORE, sub { $self->increase; }); EVT_TOOL($self, TB_FEWER, sub { $self->decrease; }); - EVT_TOOL($self, TB_45CW, sub { $_[0]->rotate(-45) }); - EVT_TOOL($self, TB_45CCW, sub { $_[0]->rotate(45) }); + if ($Slic3r::GUI::Settings->{_}{extended_gui} >= 2) { # if Toolbar enabled + EVT_TOOL($self, TB_X90CW, sub { $_[0]->rotate(-90, X) }); + EVT_TOOL($self, TB_X90CCW, sub { $_[0]->rotate(90, X) }); + EVT_TOOL($self, TB_Y90CW, sub { $_[0]->rotate(-90, Y) }); + EVT_TOOL($self, TB_Y90CCW, sub { $_[0]->rotate(90, Y) }); + EVT_TOOL($self, TB_Z90CW, sub { $_[0]->rotate(-90, Z) }); + EVT_TOOL($self, TB_Z90CCW, sub { $_[0]->rotate(90, Z) }); + } + EVT_TOOL($self, TB_45CW, sub { $_[0]->rotate(-45, Z) }); + EVT_TOOL($self, TB_45CCW, sub { $_[0]->rotate(45, Z) }); EVT_TOOL($self, TB_ROTFACE, sub { $_[0]->rotate_face }); + EVT_TOOL($self, TB_SCALE, sub { $self->changescale(undef); }); EVT_TOOL($self, TB_SPLIT, sub { $self->split_object; }); EVT_TOOL($self, TB_CUT, sub { $_[0]->object_cut_dialog }); @@ -300,9 +378,22 @@ sub new { EVT_BUTTON($self, $self->{btn_arrange}, sub { $self->arrange; }); EVT_BUTTON($self, $self->{btn_increase}, sub { $self->increase; }); EVT_BUTTON($self, $self->{btn_decrease}, sub { $self->decrease; }); + + if ($Slic3r::GUI::Settings->{_}{extended_gui} >= 2) { # if Toolbar enabled + EVT_BUTTON($self, $self->{btn_rotateX90cw}, sub { $_[0]->rotate(-90, X) }); + EVT_BUTTON($self, $self->{btn_rotateX90ccw}, sub { $_[0]->rotate(90, X) }); + EVT_BUTTON($self, $self->{btn_rotateY90cw}, sub { $_[0]->rotate(-90, Y) }); + EVT_BUTTON($self, $self->{btn_rotateY90ccw}, sub { $_[0]->rotate(90, Y) }); + EVT_BUTTON($self, $self->{btn_rotateZ90cw}, sub { $_[0]->rotate(-90, Z) }); + EVT_BUTTON($self, $self->{btn_rotateZ90ccw}, sub { $_[0]->rotate(90, Z) }); + } + EVT_BUTTON($self, $self->{btn_rotateZ45cw}, sub { $_[0]->rotate(-45, Z) }); + EVT_BUTTON($self, $self->{btn_rotateZ45ccw}, sub { $_[0]->rotate(45, Z) }); + EVT_BUTTON($self, $self->{btn_rotateFace}, sub { $_[0]->rotate_face }); + EVT_BUTTON($self, $self->{btn_rotate45cw}, sub { $_[0]->rotate(-45) }); EVT_BUTTON($self, $self->{btn_rotate45ccw}, sub { $_[0]->rotate(45) }); - EVT_BUTTON($self, $self->{btn_rotateFace}, sub { $_[0]->rotate_face }); + EVT_BUTTON($self, $self->{btn_changescale}, sub { $self->changescale(undef); }); EVT_BUTTON($self, $self->{btn_split}, sub { $self->split_object; }); EVT_BUTTON($self, $self->{btn_cut}, sub { $_[0]->object_cut_dialog }); @@ -2939,11 +3030,11 @@ sub selection_changed { my $method = $have_sel ? 'Enable' : 'Disable'; $self->{"btn_$_"}->$method - for grep $self->{"btn_$_"}, qw(remove increase decrease rotate45cw rotate45ccw rotateFace changescale split cut layers settings); + for grep $self->{"btn_$_"}, qw(remove increase decrease rotateX90cw rotateX90ccw rotateY90cw rotateY90ccw rotateZ90cw rotateZ90ccw rotateZ45cw rotateZ45ccw rotateFace changescale split cut layers settings); if ($self->{htoolbar}) { $self->{htoolbar}->EnableTool($_, $have_sel) - for (TB_REMOVE, TB_MORE, TB_FEWER, TB_45CW, TB_45CCW, TB_ROTFACE, TB_SCALE, TB_SPLIT, TB_CUT, TB_LAYERS, TB_SETTINGS); + for (TB_REMOVE, TB_MORE, TB_FEWER, TB_X90CW, TB_X90CCW, TB_Y90CW, TB_Y90CCW, TB_Z90CW, TB_Z90CCW, TB_45CW, TB_45CCW, TB_ROTFACE, TB_SCALE, TB_SPLIT, TB_CUT, TB_LAYERS, TB_SETTINGS); } if ($self->{object_info_size}) { # have we already loaded the info pane? @@ -3085,46 +3176,124 @@ sub object_menu { 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(); - 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'); - wxTheApp->append_menu_item($menu, "Rotate 45° clockwise", 'Rotate the selected object by 45° clockwise', sub { - $self->rotate(-45); - }, undef, 'arrow_rotate_clockwise.png'); - 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'); + + if (!$Slic3r::GUI::Settings->{_}{autocenter}){ + $menu->AppendSeparator(); + 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'); + } + if ($Slic3r::GUI::Settings->{_}{extended_gui} == 1 or $Slic3r::GUI::Settings->{_}{extended_gui} == 3 or $Slic3r::GUI::Settings->{_}{extended_gui} == 5){ # if context enabled + $menu->AppendSeparator(); + if ($Slic3r::GUI::Settings->{_}{extended_gui} == 1) { + wxTheApp->append_menu_item($menu, "Rotate 90° clockwise (X)", 'Rotate the selected object by 90° clockwise', sub { + $self->rotate(-90, X); + }, undef, @rotateX90cw); + wxTheApp->append_menu_item($menu, "Rotate 90° counter clockwise (X)", 'Rotate the selected object by 90° counter clockwise', sub { + $self->rotate(90, X); + }, undef, @rotateX90ccw); + wxTheApp->append_menu_item($menu, "Rotate 180° (X)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, X); + }, undef, @rotateX180); + } elsif ($Slic3r::GUI::Settings->{_}{extended_gui} > 1) { + wxTheApp->append_menu_item($menu, "Rotate 180° (X)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, X); + }, undef, @rotateX180); + wxTheApp->append_menu_item($menu, "Rotate around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', sub { + $self->rotate(undef, X); + }, undef, @rotateX90ccw); + wxTheApp->append_menu_item($menu, "Mirror along X axis", 'Mirror the selected object along the X axis', sub { + $self->mirror(X); + }, undef, @mirrorX); + } + $menu->AppendSeparator(); + if ($Slic3r::GUI::Settings->{_}{extended_gui} == 1) { + wxTheApp->append_menu_item($menu, "Rotate 90° clockwise (Y)", 'Rotate the selected object by 90° clockwise', sub { + $self->rotate(-90, Y); + }, undef, @rotateY90cw); + wxTheApp->append_menu_item($menu, "Rotate 90° counter clockwise (Y)", 'Rotate the selected object by 90° counter clockwise', sub { + $self->rotate(90, Y); + }, undef, @rotateY90ccw); + wxTheApp->append_menu_item($menu, "Rotate 180° (Y)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, Y); + }, undef, @rotateY180); + } elsif ($Slic3r::GUI::Settings->{_}{extended_gui} > 1) { + wxTheApp->append_menu_item($menu, "Rotate 180° (Y)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, Y); + }, undef, @rotateY180); + wxTheApp->append_menu_item($menu, "Rotate around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', sub { + $self->rotate(undef, Y); + }, undef, @rotateY90ccw); + wxTheApp->append_menu_item($menu, "Mirror along Y axis", 'Mirror the selected object along the Y axis', sub { + $self->mirror(Y); + }, undef, @mirrorY); + } + $menu->AppendSeparator(); + if ($Slic3r::GUI::Settings->{_}{extended_gui} == 1) { + wxTheApp->append_menu_item($menu, "Rotate 90° clockwise (Z)", 'Rotate the selected object by 90° clockwise', sub { + $self->rotate(-90, Z); + }, undef, @rotateZ90cw); + wxTheApp->append_menu_item($menu, "Rotate 90° counter clockwise (Z)", 'Rotate the selected object by 90° counter clockwise', sub { + $self->rotate(90, Z); + }, undef, @rotateZ90ccw); + wxTheApp->append_menu_item($menu, "Rotate 180° (Z)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, Z); + }, undef, @rotateZ180); + } elsif ($Slic3r::GUI::Settings->{_}{extended_gui} > 1) { + wxTheApp->append_menu_item($menu, "Rotate 180° (Z)", 'Rotate the selected object by 180°', sub { + $self->rotate(180, Z); + }, undef, @rotateZ180); + wxTheApp->append_menu_item($menu, "Rotate around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', sub { + $self->rotate(undef, Z); + }, undef, @rotateZ90ccw); + wxTheApp->append_menu_item($menu, "Mirror along Z axis", 'Mirror the selected object along the Z axis', sub { + $self->mirror(Z); + }, undef, @mirrorZ); + } + } else { + wxTheApp->append_menu_item($menu, "Rotate 45° clockwise (Z))", 'Rotate the selected object by 45° clockwise', sub { + $self->rotate(-45, Z); + }, undef, @rotateZ90cw); + wxTheApp->append_menu_item($menu, "Rotate 45° counter clockwise (Z))", 'Rotate the selected object by 45° counter clockwise', sub { + $self->rotate(+45, Z); + }, undef, @rotateZ90ccw); + + } wxTheApp->append_menu_item($menu, "Rotate Face to Plane", 'Rotates the selected object to have the selected face parallel with a plane', sub { $self->rotate_face; }, undef, 'rotate_face.png'); + $menu->AppendSeparator(); - { - 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; - 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'); + # Extended GUI: + # only at option 0,2,4 + if ($Slic3r::GUI::Settings->{_}{extended_gui} == 0 or $Slic3r::GUI::Settings->{_}{extended_gui} == 2 or $Slic3r::GUI::Settings->{_}{extended_gui} == 4){ + { + 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, @rotateX90ccw); + 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, @rotateY90ccw); + 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, @rotateZ90ccw); + wxTheApp->append_submenu($menu, "Rotate", 'Rotate the selected object by an arbitrary angle', $rotateMenu, undef, 'textfield.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, @mirrorX); + wxTheApp->append_menu_item($mirrorMenu, "Along Y axis", 'Mirror the selected object along the Y axis', sub { + $self->mirror(Y); + }, undef, @mirrorY); + wxTheApp->append_menu_item($mirrorMenu, "Along Z axis", 'Mirror the selected object along the Z axis', sub { + $self->mirror(Z); + }, undef, @mirrorZ); + wxTheApp->append_submenu($menu, "Mirror", 'Mirror the selected object', $mirrorMenu, undef, 'shape_flip_horizontal.png'); + } } { diff --git a/lib/Slic3r/GUI/Preferences.pm b/lib/Slic3r/GUI/Preferences.pm index e63ca8cbc..117a2f0c8 100644 --- a/lib/Slic3r/GUI/Preferences.pm +++ b/lib/Slic3r/GUI/Preferences.pm @@ -109,6 +109,16 @@ sub new { default => $Slic3r::GUI::Settings->{_}{reload_behavior}, width => 180, )); + $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new( # Extended GUI - Context and/or Toolbar + opt_id => 'extended_gui', + type => 'select', + label => 'Extended GUI: ', + tooltip => 'Choose extended rotate commands in the toolbar and/or in the context menu. If you don\'t use the default color scheme, the themed icons for the toolbar will be used. Requires a restart of Slic3r.', + labels => ['Default', 'Context only', 'Toolbar only', 'Toolbar and Context', 'Toolbar only (big)', 'Toolbar (big) and Context'], + values => [0, 1, 2, 3, 4, 5], + default => $Slic3r::GUI::Settings->{_}{extended_gui}, + width => 180, + )); $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new( # colorscheme opt_id => 'colorscheme', type => 'select', @@ -116,7 +126,7 @@ sub new { tooltip => 'Choose between color schemes - restart of Slic3r required.', labels => ['Default','Solarized'], # add more schemes, if you want in ColorScheme.pm. values => ['getDefault','getSolarized'], # add more schemes, if you want - those are the names of the corresponding function in ColorScheme.pm. - default => $Slic3r::GUI::Settings->{_}{colorscheme} // 'getDefault', + default => $Slic3r::GUI::Settings->{_}{colorscheme}, width => 180, )); diff --git a/var/arrow_rotate_x_anticlockwise.png b/var/arrow_rotate_x_anticlockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c26fa04ef17aae5d2baa62f9fdb798a85c8668 GIT binary patch literal 599 zcmV-d0;v6oP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000ic000ic0Tn1pfB*mh8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMF*7s+ zTY3Nh0jNntK~y+TrBc63LSYo`@9=L(#YsXC5>tdwixLeo5ESH<=#(`?Du`eR3R;Mg z3W~b6xU{ysvE|LJt*xHZ_q~Uv=^LWq@a}i-J?H*e~M@%NfXhb|c5&1k3jjA{~v8-~|1+K1CRI9{vO7#20 za7YXWM7vFNyTr{65e}=XoK>=dQi&LkjjGSj#Qi;ScSp2ZhREY1^|Ac^9mGU z#~{jT=jU_8VnswEMI0T?@$f)28bq;3cs$ysfLxYrSGF#z3i2`*3|=D;AbdVzf1hx> zh5NTaB4I2}R=>R^PEUUX1bJcq#?laH(onA(ZOU&rJjdbTNRJ&H=#>|_t5_O1J5!L$ z5zVF{QmYZkB;oZE@wgm`pL=^E)kHu7$H%HJBFS=Dl?wHLLfVA_MVzX`AyUl*fH6aNpVIBan5Wu5nj(-dzj(PZs%-w lSD2fz4aYXTn2<^Cd;>o`;NbXq1Azbl002ovPDHLkV1nRk`2GL@ literal 0 HcmV?d00001 diff --git a/var/arrow_rotate_x_clockwise.png b/var/arrow_rotate_x_clockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..3caf237551225da4aceafcbf9e8856e7c40bd919 GIT binary patch literal 595 zcmV-Z0<8UsP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000ic000ic0Tn1pfB*mh8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMF*7s+ zTY3Nh0i;PpK~y+TrBY2xLO~SmclaNI3_(zE5u~<}6crWAk45y*(uJUcL_MJogW6Su zq6LZiAKJEgix#zT)23h0qOIpN^IqChUq!Sy%*>rRXYM`sE|B~eEQ5c6We~f&Ipp(0 zCq*6Jnw^Iici#9>laCk^`Iz+!ubi2gW6;Y`Wv6zN%*k z1LEd}xVs~6Z;9(`qSYd*RbqWzGjq)39O`wV*E4=?w~76IVsDSQxG+R6FR7R1^G(Y6 z5>S*OnoZ+Z`FLYvgm_#kxV$`X;)Er h3E{L@tna?Sg%39l-;nz`+O7Zq002ovPDHLkV1g|l_6z_3 literal 0 HcmV?d00001 diff --git a/var/arrow_rotate_y_anticlockwise.png b/var/arrow_rotate_y_anticlockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..abc7535df696087b1a6bc171f225d2605b883547 GIT binary patch literal 716 zcmV;-0yF)IP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003{ zP)t-s|NsAPz+-H@U}LdZU#(Se!enm0VpyY3RG&+2zhY3CM{T}hM~^^ix?f$YQ(2}^ zR-sK&oJvE9JXxhsPM1bipiEz^RZyBpOqE1ir%_X#N=}$YN|QrEi90@oIBB_FX0=;~ z$b6yGma5pGr`DdC&X9PzaE!`=tJtBU)S0H$oTSv7o6wS;(Uy6*afQcwsn?*O(U*b1 zcYeHem&}fv&y$$WkZG%7ozaw_(w2?KhLp>Ugus1fwp^stoTAg2e!g}}l0rs}KSGH+ zK7=@9u~?zgn0vZ%Ns&U5$%&K8i;~KVMT|Z{hdOe#X_m~6kIIN;r(HygJzk(#TAfrm zeKT>gX^+W=gv5P`#)5~$e}uz+g2H=KmQ68pEMuixd%Jao!+wIoe1O4ue!q85l1eRZ zDLa2PH+wNrluS;MNiA+DFL5g@Z73{kC;$KdQ}2y20000VbW%=J0BhLTYZ}YT8q3RT zYuNpQg8kTncY@gcrfbU@%WKorB7}SZ0004EOGiWihy@);0001UPytSL4NWa=9bG*x2%lTuK*i9=*u>P#oChqxYhkI&$1fmg zWo;t_7O=ImcMxV^5OH*Jb^!~xy6L)$GB9|+EfMqd@)nn1@bQHSNc#DE1q22KhlIjJ zq{6}@BBP>XV&k9!(lYT0iAl*RscCRyWaZK`GPAN#{gac6=D|D&1pt8*7@|+|lXL(8 y02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM0000004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003; zP)t-s|NsAPz+-H@U}LdZU#(Se!enm0VpyY3RG&+2zhY3CM{T}hM~^^ix?f$YQ(2}^ zR-sK&oJvE9JXxhsPM1bWkwQt4K}C!{HhC~IbS*J+EG=#+Gj=X8aw}=MUS_phhsb=P z)0V2(pr_WJna+@Sx^Rrjf~(k}qSTqD)tsc%o14&*p3#iNRU8bqgsc>frZ3=g2H@M zmQGWhN@}fRkI9FN$AyW;f``O^e7|*q!h2htRZf^jW~pC`#)E~!esr~MQk6|cjXz$Y zS6ZG`JAXAddoezPH#T`N|NsB_HoT7j0016zQchCL;#2d9Y_EG0G>%iK~xyiV_+Z-Ffz%>Gqb?CtZWL3 zO3Es#>>N-5PBnE6O)YI5T`mZpTTfrvz|hFp#MF!jEWm4SVZz5RAZTf2Ed&;@v9+@o zW?&F;aI|uQo9oQLAnM}k<__a~cru8IdwKgvK>5CY{sDnO!6BiN5Pn#AL}XNSOl+JK zR6%?~Vo*{@a*C8R%!t&q^o&dyStP$?xig@FY&Z)5T~!z>-8$VH0000PbVXQnQ*UN; ocVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy07*qoM6N<$g0ibF;s5{u literal 0 HcmV?d00001 diff --git a/var/arrow_rotate_z_anticlockwise.png b/var/arrow_rotate_z_anticlockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..5f497694fc1d6242dba68e26897c2669d9dee1cf GIT binary patch literal 644 zcmV-~0(004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 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 literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_x_180_16.png b/var/solarized/arrow_rotate_x_180_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e11a3fb7ea3161e8bec91e0178f2b25236abe07e GIT binary patch literal 487 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iW000iW0hPRRNdN!<8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0XRuSK~y+TV?YNRckED^yl`Q|>=i5S0O|jCjP(ECwYRx*+fcvZc148>R2g=# zV9lDTAWg^^WB>{d4w?#8jtXWiUAhrnGgbqD80eynP;C%^Zu5a7yZ^s?aTS4|Ui$x} zy#~dQ2g!*Lmq7gt*L?lj2~^EU_|@(;D26;*G+TuMsHp*_`QTB6&5Ktr1=A-_?FD0) z_>;zRxB+*qEgKkMp$)K%s;w!`4l`G*0Wnh6-jcUrsPHT}w{f09B41K*OYA#*!uQ?0n73{VOOtU+U?B d_!$lu7y!}IYPtXz2<89)002ovPDHLkV1m`syNv(< literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_x_anticlockwise90.png b/var/solarized/arrow_rotate_x_anticlockwise90.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7f984fa71a6d8770775e3da4f4938a84da0f70 GIT binary patch literal 767 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iX000iX0Z03gtpET38FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0#HdrK~z{rwU*y%6G0S*_l*RfLGTq6`V2xZl;Sf;ZoCjHiVHeAeog;}(LES+AjMp;>~s2sm~xo9L&R_a1>hiH2+Sfp$P zi$ZwwhDlyVwdc4BwxS`*RrRp~ko+IXQrM4C z{dw-$Q*aePZfW;=b{1>{dAt7NT?0d_LJb(~Ea>!4$OQ_!b?2^STFnLI7Tdt_@?*Ts zo<4ejVY4)lcXi0^I``6}AjK63?G2F%Gv-iN`!r-KKd-eV96%QQib=K8wt4Tr-T z9TX^NmIf$W2#wp`3G?>BFgQp;E=FHcp;e%4!QKhwqrbb0`#_+;Dp022cRJ%|fsi)~ z0tJ_WvXn3k$4^6r{-~UfzM_P<{8{{F)Y;lfzYi!c*4A)<%cXg+kW`^DF3T$`Mm2V( z8W7|UG;khdnMWw&9gMn3eyRl)SIA6eGme%Gb xh8OX=)iOgl&jpJ`G}>)DrCFiW%1Xz?-d}mx47ERN`c(h`002ovPDHLkV1kyuT9^O; literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_x_anticlockwise90_16.png b/var/solarized/arrow_rotate_x_anticlockwise90_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc9eb0bbc37cc4d29897b710d74608e75edfcae GIT binary patch literal 785 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 Y0NKlGeZ4#1jsO4v07*qoM6N<$f+_LAaR2}S literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_y_anticlockwise90.png b/var/solarized/arrow_rotate_y_anticlockwise90.png new file mode 100644 index 0000000000000000000000000000000000000000..593e29738c172f91a8448a0997cc4ad809ac4c0f GIT binary patch literal 722 zcmV;@0xkWCP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 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 Hu0mjf$KN~B literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_z_anticlockwise90.png b/var/solarized/arrow_rotate_z_anticlockwise90.png new file mode 100644 index 0000000000000000000000000000000000000000..a78b1b96c13526254eb6500216e30a16c1edb106 GIT binary patch literal 753 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iX000iX0Z03gtpET38FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0zyedK~z{rwU;q((?A%8{c8{d8{$VWv7(B#D;vL}s!`R}Vqs|74&7KQ5J=r4 z5G@m;it1nzVv?xy33IR2GiT?qdv4U>iIO|t`+Pau=W|pPMG(v7@<}?Gy?eC%C4I2< zwQ%en95_sJbd=8L^O(lBfsH;^y!mjeF7@#WsF55VrW#9`KG-Pqj~~DOJS3?P$$j3Q zoD3=7fsK;eaMP3#Bn6Bz$+gm84~%VakX(SQ4J@MeLkGM_PX9jJ{e&_CL|v>DQ7b@l zlK9NBZ^eAV%(8QmHZi`l`m&LHoHk`och0KsJWPCo^;aa#d`3b2^93kZ=5ke94gK&V`hTtw6;D8#3a zT#!TDserz6K@On;OtVo?h`5Vfki%l4y}=-b4h#`~0R)W^J$`2QXd*a z*og%l7R|@RIZ@ZjRwkVh4n*#7O2ny{3W!~`rVWdYR98f{QAyAg1_Ba;y zf*8_)jywzBkleO2dUJeS-;fCH)odr;l0GE#p)n13OC}bJMNkoI(7h=Y_5j_M_fdr8 zE3a*}AC7yN38PGMtu#0^Rr`ZM=Y<)9E^f+qV55&MM7L<`I?=&;FQ>%!%S&A!Duzyv j*|U8=Mx!3D=SB1nW~d!f=u-vm00000NkvXXu0mjfytP98 literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_z_anticlockwise90_16.png b/var/solarized/arrow_rotate_z_anticlockwise90_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f439d71788e4053cadfcbc8273bb1584c2db31a9 GIT binary patch literal 737 zcmV<70v`Q|P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iV000iV0mt~%HUIzs8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0y0TNK~y+TZBjvK6HyTTA_#&fJqTXKrU*TFk>bIlipLzhsCbsDU=AW86qJgX zNTAv#)rRaQo89bIlWoWbo$*G5;lIfq{{B;vE@L-vp_vX#~ zAv`oq+kZB)e&S-Rd23?f+nVo5eP<-tfM=oz&qZ-t$>l^fpTGK2mXG!*{c$PT9zPjs zw0xn)ZzOV{0LM%su`?&jxi_`i;T~--?y1YC{qq~&eIBAe?tou#Kv{eZivFrkD3(qy zDw)i2M!r0|3DY@osK<7tuDC|$m5K|Q<5Rs%`YBoDYuE{Nf+b+<~y!d`F)CZm~SBtKT zceWiSr$Qh9vYF|;Xqgu#7g7v2Cm%rI;gp+iw=9UJq&*Qq*e1ODpa3Ew#Nf`O$ME&b z+He61!as1^xGY|n&ZHUHvXd18^Z*y+`bDpsQtkmcm?Qzb%>PBiaj;3?222+ zcfi5(g_6N)rv;%~tX2aA&l4{Ullac~RJ?c)#d3kZe}W0ni`+6ybA-(6`mv}i8{7rH zbGiDKS@i-tb23GDPLif3HSGWafPJQE9?|l7hl?O^PA@$Fx}}wsl2)l4VyDbQ)pg%& zB9X=m^Ax+lnbGzP?ff4Z1D&Y!w&_yG%+=NKbUe;phoVc#9ivolx1 TrI*Tz00000NkvXXu0mjfVo6I? literal 0 HcmV?d00001 diff --git a/var/solarized/arrow_rotate_z_clockwise45.png b/var/solarized/arrow_rotate_z_clockwise45.png new file mode 100644 index 0000000000000000000000000000000000000000..70a7fa5b2fcd46bb91b8792ec8e238efccffcfb7 GIT binary patch literal 707 zcmV;!0zCbRP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iY000iY0qR1rzyJUM8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0u)I^K~z{r#g|P^!ay9wIf!fH!ksIQU|hIr;wemAcnTs$`G^}Ad@blDj9x&( z$I3_u#R|3pH>mR}ZKmy;(kU7izXWFH|K4NT`Jmu=US^idrBQFU%}S$T2|RFE>W3WP z^h|5+T&>sZ16I$VjWR;4SZ}pp>Kn$91IQeedM0X_rVMQic004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iW000iW0hPRRNdN!<8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0v$<2K~y+TbyLr46HyR;2N66d;>k-rmL7`uSJaaSb5wil(H!hSdJqZ~MUwin zn?{K7z1_`{?wZXHFpF(XmzJ`2l^nWF+B6hAw1{3j7SXcPH!pe1wv7WHEW>=?d^2yB z#DiMa)pw>jZd9vuj0Wmu+EG~e^vOGL|`V4k=zWh%hM1iA00t@8@LH7Md zlshA!s(%Up*c&8p@4*z@=k`zUATGe+6Ka~TksjRQMNGR{74 z7*nq6o)gztU0=V*&)JcqAaKq&WFE=2r6tAlybFRX18B8xKKpoGox+ne1004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iX000iX0Z03gtpET38FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0whU9K~z{rwU^6I!ax{>c@Wpeg*#V1f-4ha6XQdexbP{67{euQTyR^^S8zeX z-blDCjFAwE6{G@*4^ZbIZKl&Rg#lT72~7F_?=Wqr)0FS~YcrirtwN<@XNyHg;Dh~i zE9CIDX*;9I^?W|xWAzL=C?lF37s_Qw7eW;|fXqRrI2ut-vzL?4Z5m8RFb^o&P^rOy1B!FnRQa*9p z{&du(Ox!M&%OHg83_q;8;Ksuil`@7-ClsFCHzEPRS-$Zc2_UBBm`MYeWF0W=syqPB zFhD-xK4*8H$yN=06n+5=j0G{VrOb%GXi>sSNSPhedq3c>H-7@?A z*`dvtREE_6767L~d+V_#IyMaewCA5SVXPwuOb)gRu&x|1IoLRWi5xHo*eHOh954qk zz6dvw1LhDo+EtJ>0dfEas{zcBE0yfjXguEeLd1H5{$OAwF2!GB8D$Mk@WkVr^#+Tj zco|@44*$xN=Lzgfgr~ zA+ke`1i%6OKq>f7oY`!q-;@Fo0=MNZLag4F2OuR1lm^=n`{x0%0U2B@q?r-004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000iV000iV0mt~%HUIzs8FWQhbW?9;ba!ELWdLwtX>N2bZe?^JG%heMGBNQW zX_Wu~0xwBKK~y+TZBt8Y6Hyet3lUr>;>wM>D_N9+(2d|)H@Yym@%0Ca6?7q8CV!Dw!pIVKci`&QA<9kas&F+LGITU{= z5jaqQVaRPoV%~Q5u%}&9nn&6+zmS}iWeYcQVy2LVOwoj>Sc9lg3xp!E&pTIyPnACP z{V7I9+qjvN<*W|%x(z?KJciB9219DD4m~3t^u|9@5w~?_WJ$dow+|7_%xxoiZFLcT z{b+PVad8FCCVeM8!|wMBf)^p|U~SvDnGfHKJ=+7`fAp5eapC^!jay{Qzc$UAWtRD% z@=9aqAAA6J9zG8G^R+sh9`#-H#+QGi0LzXC3kx77#WdV~@)S1KK6Dg7pukQifvMaS zBRftt=pmZx4m{UX7I{pP{u27}rIWz*+XHZu+TVYJumFWa1YIBHF`OkU800tL;QjKu zlD}OP|K&@it3))-OY~>l#^$7|!1BsmFuWg?*)k**nF&m&YSWmRIY|UTIGT`Uh2J8r zXJB@|!mNgYn>iV?PiWeJWmyN(mD#^M*8jO^kA4du+55)UC|q#Gxg}< Q>Hq)$07*qoM6N<$f@=Xm2><{9 literal 0 HcmV?d00001