diff options
Diffstat (limited to 'lib/tqwtplot3d/src/qwt3d_mousekeyboard.cpp')
| -rw-r--r-- | lib/tqwtplot3d/src/qwt3d_mousekeyboard.cpp | 387 | 
1 files changed, 387 insertions, 0 deletions
| diff --git a/lib/tqwtplot3d/src/qwt3d_mousekeyboard.cpp b/lib/tqwtplot3d/src/qwt3d_mousekeyboard.cpp new file mode 100644 index 0000000..800bc06 --- /dev/null +++ b/lib/tqwtplot3d/src/qwt3d_mousekeyboard.cpp @@ -0,0 +1,387 @@ +#if defined(_MSC_VER) /* MSVC Compiler */
 +#pragma warning ( disable : 4305 )
 +#pragma warning ( disable : 4786 )
 +#endif
 +
 +#include "qwt3d_plot.h"
 +
 +using namespace std;
 +using namespace Qwt3D;
 +
 +
 +/**
 +	Standard mouse button Function. Prepares the call to mouseMoveEvent
 +	\see mouseMoveEvent()
 +*/
 +void Plot3D::mousePressEvent( QMouseEvent *e )
 +{
 +	lastMouseMovePosition_ = e->pos();
 +	mpressed_ = true;
 +}
 +
 +/**
 +	Standard mouse button Function. Completes the call to mouseMoveEvent
 +	\see mouseMoveEvent()
 +*/
 +void Plot3D::mouseReleaseEvent( QMouseEvent* )
 +{
 +	mpressed_ = false;
 +}
 +
 +/**
 +	Standard mouse button Function
 +	\see assignMouse()
 +*/
 +void Plot3D::mouseMoveEvent( QMouseEvent *e )
 +{
 +	if (!mpressed_ || !mouseEnabled())
 +  {
 +    e->ignore();
 +		return;
 +  }
 +	
 +#if QT_VERSION < 0x040000
 +	MouseState bstate = e->state();
 +#else
 +  MouseState bstate(e->buttons(),e->modifiers());
 +#endif
 +
 +	QPoint diff = e->pos() - lastMouseMovePosition_;
 +
 +	setRotationMouse(bstate, 3, diff);	
 +	setScaleMouse(bstate, 5, diff);	
 +	setShiftMouse(bstate, 2, diff);	
 +		
 +	lastMouseMovePosition_ = e->pos();
 +}
 +
 +void Plot3D::setRotationMouse(MouseState bstate, double accel, QPoint diff)
 +{
 +	// Rotation
 +	double w = max(1,width());
 +	double h = max(1,height());
 +		
 +	double relx = accel*360 * diff.x() / w; 
 +	double relyz = accel*360 * diff.y() / h; 
 +	
 +	double new_xrot = xRotation();
 +	double new_yrot = yRotation();
 +	double new_zrot = zRotation();
 +	
 +	if ( bstate == xrot_mstate_ )
 +		new_xrot = round(xRotation() + relyz) % 360; 
 +	if ( bstate == yrot_mstate_ )
 +		new_yrot = round(yRotation() + relx) % 360; 
 +	if ( bstate == zrot_mstate_ )
 +		new_zrot = round(zRotation() + relx) % 360; 
 +		
 +	setRotation(new_xrot, new_yrot, new_zrot); 
 +}
 +
 +void Plot3D::setScaleMouse(MouseState bstate, double accel, QPoint diff)
 +{
 +	// Scale
 +		double w = max(1,width());
 +		double h = max(1,height());
 +
 +		double relx = diff.x() * accel / w; relx = exp(relx) - 1;
 +		double relyz = diff.y() * accel / h; relyz = exp(relyz) - 1; 
 +
 +		double new_xscale = xScale();
 +		double new_yscale = yScale();
 +		double new_zscale = zScale();
 +
 +		if ( bstate == xscale_mstate_)
 +			new_xscale = max(0.0,xScale() + relx);
 +		if ( bstate == yscale_mstate_)
 +			new_yscale = max(0.0,yScale() - relyz);
 +		if ( bstate == zscale_mstate_)
 +			new_zscale = max(0.0,zScale() - relyz);
 +
 +		setScale(new_xscale, new_yscale, new_zscale); 
 +
 +		if ( bstate == zoom_mstate_)
 +			setZoom(max(0.0,zoom() - relyz));
 +}
 +
 +void Plot3D::setShiftMouse(MouseState bstate, double accel, QPoint diff)
 +{
 +	// Shift
 +	double w = max(1,width());
 +	double h = max(1,height());
 +
 +	double relx = diff.x() * accel / w; 
 +	double relyz = diff.y() * accel / h;
 +
 +	double new_xshift = xViewportShift();
 +	double new_yshift = yViewportShift();
 +
 +	if ( bstate == xshift_mstate_)
 +		new_xshift = xViewportShift() + relx;
 +	if ( bstate == yshift_mstate_)
 +		new_yshift = yViewportShift() - relyz;
 +
 +	setViewportShift(new_xshift, new_yshift); 
 +}
 +
 +/**
 +	Standard wheel Function - zoom (wheel only) or z-scale (shift+wheel)
 +*/
 +void Plot3D::wheelEvent( QWheelEvent *e )
 +{
 +	if (!mouseEnabled())
 +		return;
 +	
 +	double accel = 0.05;
 +	
 +	double step =  accel * e->delta() / WHEEL_DELTA ;
 +	step = exp(step)-1;
 +
 +#if QT_VERSION < 0x040000
 +	if ( e->state() & Qt::ShiftButton )
 +#else
 +	if ( e->modifiers() & Qt::ShiftModifier )
 +#endif
 +		setScale(xScale(),yScale(), max(0.0,zScale() + step));
 +	else
 +		setZoom(max(0.0,zoom() + step ));
 +}
 +
 +/**
 +	Sets the key/mousebutton combination for data/coordinatesystem moves inside the widget\n\n
 +	default behaviour:\n
 +
 +	\verbatim
 +	rotate around x axis: Qt::LeftButton 
 +	rotate around y axis: Qt::LeftButton | Qt::ShiftButton
 +	rotate around z axis: Qt::LeftButton 
 +	scale x:              Qt::LeftButton | Qt::AltButton 
 +	scale y:              Qt::LeftButton | Qt::AltButton 
 +	scale z:              Qt::LeftButton | Qt::AltButton | Qt::ShiftButton
 +	zoom:                 Qt::LeftButton | Qt::AltButton | Qt::ControlButton
 +	shifting along x:     Qt::LeftButton | Qt::ControlButton 
 +	shifting along y:     Qt::LeftButton | Qt::ControlButton
 +	\endverbatim
 +
 +	mouseMoveEvent() evaluates this function - if overridden, their usefulness becomes somehow limited
 +*/
 +void Plot3D::assignMouse(MouseState xrot, MouseState yrot, MouseState zrot,
 +											 MouseState xscale, MouseState yscale, MouseState zscale,
 +											 MouseState zoom, MouseState xshift, MouseState yshift)
 +{
 +	xrot_mstate_   = 	xrot;  
 +  yrot_mstate_   =  yrot;  
 +  zrot_mstate_   =  zrot;  
 +  xscale_mstate_ =  xscale;
 +  yscale_mstate_ =  yscale;
 +  zscale_mstate_ =  zscale;
 +  zoom_mstate_   =  zoom;  
 +  xshift_mstate_ =  xshift;
 +  yshift_mstate_ =  yshift;
 +}
 +
 +/** 
 +The function has no effect if you derive from Plot3D and overrides the mouse Function too careless.
 +In this case check first against mouseEnabled() in your version of mouseMoveEvent() and wheelEvent().
 +A more fine grained input control can be achieved by combining assignMouse() with enableMouse(). 
 +*/
 +void Plot3D::enableMouse(bool val) {mouse_input_enabled_ = val;}
 +
 +/** 
 +\see enableMouse()
 +*/
 +void Plot3D::disableMouse(bool val) {mouse_input_enabled_ = !val;}
 +bool Plot3D::mouseEnabled() const {return mouse_input_enabled_;}
 +
 +
 +
 +
 +void Plot3D::keyPressEvent( QKeyEvent *e )
 +{
 +	if (!keyboardEnabled())
 +  {
 +    e->ignore();
 +    return;
 +  }	
 +
 +#if QT_VERSION < 0x040000
 +  int bstate = e->state() & Qt::KeyButtonMask; // filter kbd modifier only
 +  KeyboardState keyseq = bstate + e->key();
 +#else
 +  KeyboardState keyseq(e->key(), e->modifiers());
 +#endif
 +
 +	setRotationKeyboard(keyseq, kbd_rot_speed_);	
 +	setScaleKeyboard(keyseq, kbd_scale_speed_);	
 +	setShiftKeyboard(keyseq, kbd_shift_speed_);	
 +}
 +
 +void Plot3D::setRotationKeyboard(KeyboardState kseq, double speed)
 +{
 +	// Rotation
 +	double w = max(1,width());
 +	double h = max(1,height());
 +		
 +	double relx = speed*360 / w; 
 +	double relyz = speed*360 / h; 
 +	
 +	double new_xrot = xRotation();
 +	double new_yrot = yRotation();
 +	double new_zrot = zRotation();
 +	
 +	if ( kseq == xrot_kstate_[0] )
 +		new_xrot = round(xRotation() + relyz) % 360; 
 +	if ( kseq == xrot_kstate_[1] )
 +		new_xrot = round(xRotation() - relyz) % 360; 
 +	if ( kseq == yrot_kstate_[0] )
 +		new_yrot = round(yRotation() + relx) % 360; 
 +	if ( kseq == yrot_kstate_[1] )
 +		new_yrot = round(yRotation() - relx) % 360; 
 +	if ( kseq == zrot_kstate_[0] )
 +		new_zrot = round(zRotation() + relx) % 360; 
 +	if ( kseq == zrot_kstate_[1] )
 +		new_zrot = round(zRotation() - relx) % 360; 
 +		
 +	setRotation(new_xrot, new_yrot, new_zrot); 
 +}
 +
 +void Plot3D::setScaleKeyboard(KeyboardState kseq, double speed)
 +{
 +	// Scale
 +		double w = max(1,width());
 +		double h = max(1,height());
 +
 +		double relx = speed / w; relx = exp(relx) - 1;
 +		double relyz = speed / h; relyz = exp(relyz) - 1; 
 +
 +		double new_xscale = xScale();
 +		double new_yscale = yScale();
 +		double new_zscale = zScale();
 +
 +		if ( kseq == xscale_kstate_[0])
 +			new_xscale = max(0.0,xScale() + relx);
 +		if ( kseq == xscale_kstate_[1])
 +			new_xscale = max(0.0,xScale() - relx);
 +		if ( kseq == yscale_kstate_[0])
 +			new_yscale = max(0.0,yScale() - relyz);
 +		if ( kseq == yscale_kstate_[1])
 +			new_yscale = max(0.0,yScale() + relyz);
 +		if ( kseq == zscale_kstate_[0])
 +			new_zscale = max(0.0,zScale() - relyz);
 +		if ( kseq == zscale_kstate_[1])
 +			new_zscale = max(0.0,zScale() + relyz);
 +
 +		setScale(new_xscale, new_yscale, new_zscale); 
 +
 +		if ( kseq == zoom_kstate_[0])
 +			setZoom(max(0.0,zoom() - relyz));
 +		if ( kseq == zoom_kstate_[1])
 +			setZoom(max(0.0,zoom() + relyz));
 +}
 +
 +void Plot3D::setShiftKeyboard(KeyboardState kseq, double speed)
 +{
 +	// Shift
 +	double w = max(1,width());
 +	double h = max(1,height());
 +
 +	double relx = speed / w; 
 +	double relyz = speed / h;
 +
 +	double new_xshift = xViewportShift();
 +	double new_yshift = yViewportShift();
 +
 +	if ( kseq == xshift_kstate_[0])
 +		new_xshift = xViewportShift() + relx;
 +	if ( kseq == xshift_kstate_[1])
 +		new_xshift = xViewportShift() - relx;
 +	if ( kseq == yshift_kstate_[0])
 +		new_yshift = yViewportShift() - relyz;
 +	if ( kseq == yshift_kstate_[1])
 +		new_yshift = yViewportShift() + relyz;
 +
 +	setViewportShift(new_xshift, new_yshift); 
 +}
 +
 +/**
 +	Sets the keybutton combination for data/coordinatesystem moves inside the widget\n\n
 +	default behaviour:\n
 +
 +	\verbatim
 +	rotate around x axis: [Key_Down, Key_Up] 
 +	rotate around y axis: SHIFT+[Key_Right, Key_Left]
 +	rotate around z axis: [Key_Right, Key_Left] 
 +	scale x:              ALT+[Key_Right, Key_Left] 
 +	scale y:              ALT+[Key_Up, Key_Down] 
 +	scale z:              ALT+SHIFT[Key_Down, Key_Up] 
 +	zoom:                 ALT+CTRL+[Key_Down, Key_Up]
 +	shifting along x:     CTRL+[Key_Right, Key_Left] 
 +	shifting along z:     CTRL+[Key_Down, Key_Up]
 +	\endverbatim
 +*/
 +void Plot3D::assignKeyboard(
 +       KeyboardState xrot_n, KeyboardState xrot_p
 +      ,KeyboardState yrot_n, KeyboardState yrot_p
 +      ,KeyboardState zrot_n, KeyboardState zrot_p
 +			,KeyboardState xscale_n, KeyboardState xscale_p 
 +      ,KeyboardState yscale_n, KeyboardState yscale_p
 +      ,KeyboardState zscale_n, KeyboardState zscale_p
 +			,KeyboardState zoom_n, KeyboardState zoom_p
 +      ,KeyboardState xshift_n, KeyboardState xshift_p
 +      ,KeyboardState yshift_n, KeyboardState yshift_p
 +      )
 +{
 +	xrot_kstate_[0]   =  xrot_n;  
 +  yrot_kstate_[0]   =  yrot_n;  
 +  zrot_kstate_[0]   =  zrot_n;  
 +	xrot_kstate_[1]   =  xrot_p;  
 +  yrot_kstate_[1]   =  yrot_p;  
 +  zrot_kstate_[1]   =  zrot_p;  
 +  
 +  xscale_kstate_[0] =  xscale_n;
 +  yscale_kstate_[0] =  yscale_n;
 +  zscale_kstate_[0] =  zscale_n;
 +  xscale_kstate_[1] =  xscale_p;
 +  yscale_kstate_[1] =  yscale_p;
 +  zscale_kstate_[1] =  zscale_p;
 +
 +  zoom_kstate_[0]   =  zoom_n;  
 +  xshift_kstate_[0] =  xshift_n;
 +  yshift_kstate_[0] =  yshift_n;
 +  zoom_kstate_[1]   =  zoom_p;  
 +  xshift_kstate_[1] =  xshift_p;
 +  yshift_kstate_[1] =  yshift_p;
 +}
 +
 +/** 
 +The function has no effect if you derive from Plot3D and overrides the keyboard Functions too careless.
 +In this case check first against keyboardEnabled() in your version of keyPressEvent()
 +A more fine grained input control can be achieved by combining assignKeyboard() with enableKeyboard(). 
 +*/
 +void Plot3D::enableKeyboard(bool val) {kbd_input_enabled_ = val;}
 +
 +/** 
 +\see enableKeyboard()
 +*/
 +void Plot3D::disableKeyboard(bool val) {kbd_input_enabled_ = !val;}
 +bool Plot3D::keyboardEnabled() const {return kbd_input_enabled_;}
 +
 +/**
 +Values < 0 are ignored. Default is (3,5,5)
 +*/
 +void Plot3D::setKeySpeed(double rot, double scale, double shift)
 +{
 +  if (rot > 0)
 +    kbd_rot_speed_ = rot;
 +  if (scale > 0)
 +    kbd_scale_speed_ = scale;
 +  if (shift > 0)
 +    kbd_shift_speed_ = shift;
 +}
 +
 +void Plot3D::keySpeed(double& rot, double& scale, double& shift) const
 +{
 +  rot = kbd_rot_speed_;
 +  scale = kbd_scale_speed_;
 +  shift = kbd_shift_speed_;
 +}
 | 
