Add panning support
This commit is contained in:
parent
43d764feff
commit
dd7830b1b7
1 changed files with 32 additions and 3 deletions
|
@ -2,15 +2,15 @@ package Slic3r::GUI::PreviewCanvas;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_TIMER EVT_MOUSEWHEEL);
|
use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS);
|
||||||
# must load OpenGL *before* Wx::GLCanvas
|
# must load OpenGL *before* Wx::GLCanvas
|
||||||
use OpenGL qw(:glconstants :glfunctions :glufunctions);
|
use OpenGL qw(:glconstants :glfunctions :glufunctions);
|
||||||
use base qw(Wx::GLCanvas Class::Accessor);
|
use base qw(Wx::GLCanvas Class::Accessor);
|
||||||
use Slic3r::Geometry qw(X Y Z MIN MAX triangle_normal normalize deg2rad tan);
|
use Slic3r::Geometry qw(X Y Z MIN MAX triangle_normal normalize deg2rad tan);
|
||||||
use Wx::GLCanvas qw(:all);
|
use Wx::GLCanvas qw(:all);
|
||||||
|
|
||||||
__PACKAGE__->mk_accessors( qw(timer x_rot y_rot dirty init mesh_center zoom
|
__PACKAGE__->mk_accessors( qw(quat dirty init mesh_center
|
||||||
verts norms) );
|
verts norms initpos) );
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, $parent, $mesh) = @_;
|
my ($class, $parent, $mesh) = @_;
|
||||||
|
@ -51,10 +51,39 @@ sub new {
|
||||||
|
|
||||||
$self->Refresh;
|
$self->Refresh;
|
||||||
});
|
});
|
||||||
|
EVT_MOUSE_EVENTS($self, sub {
|
||||||
|
my ($self, $e) = @_;
|
||||||
|
|
||||||
|
if ($e->Dragging() && $e->LeftIsDown()) {
|
||||||
|
$self->handle_rotation($e);
|
||||||
|
} elsif ($e->Dragging() && $e->RightIsDown()) {
|
||||||
|
$self->handle_translation($e);
|
||||||
|
} elsif ($e->LeftUp() || $e->RightUp()) {
|
||||||
|
$self->initpos(undef);
|
||||||
|
} else {
|
||||||
|
$e->Skip();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub handle_translation {
|
||||||
|
my ($self, $e) = @_;
|
||||||
|
|
||||||
|
if (not defined $self->initpos) {
|
||||||
|
$self->initpos($e->GetPosition());
|
||||||
|
} else {
|
||||||
|
my ($orig, @orig3d, $new, @new3d);
|
||||||
|
$new = $e->GetPosition();
|
||||||
|
$orig = $self->initpos;
|
||||||
|
@orig3d = $self->mouse_to_3d($orig->x, $orig->y);
|
||||||
|
@new3d = $self->mouse_to_3d($new->x, $new->y);
|
||||||
|
glTranslatef($new3d[0] - $orig3d[0], $new3d[1] - $orig3d[1], 0);
|
||||||
|
$self->initpos($new);
|
||||||
|
$self->Refresh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub mouse_to_3d {
|
sub mouse_to_3d {
|
||||||
my ($self, $x, $y) = @_;
|
my ($self, $x, $y) = @_;
|
||||||
|
|
Loading…
Add table
Reference in a new issue