You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
8.3 KiB
300 lines
8.3 KiB
/***************************************************************************
|
|
qsctool.cpp
|
|
-------------------
|
|
begin : Sun Jan 30 2000
|
|
copyright : (C) 2000 by Kamil Dobkowski
|
|
email : kamildbk@friko.onet.pl
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include"qsctool.h"
|
|
#include"qsdrvqt.h"
|
|
#include"qsplotview.h"
|
|
#include<qpainter.h>
|
|
|
|
QSTool::QSTool( QObject *parent )
|
|
: QObject( parent )
|
|
{
|
|
m_drv = NULL;
|
|
m_view = NULL;
|
|
m_state = StateReady;
|
|
m_snap_to_grid = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
QSTool::~QSTool()
|
|
{
|
|
deactivate();
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::activate( QSPlotView *parent_view )
|
|
{
|
|
m_view = parent_view;
|
|
m_state = StateReady;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::deactivate()
|
|
{
|
|
release_driver();
|
|
m_view = NULL;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::canvasEvent( QEvent *e )
|
|
{
|
|
switch ( e->type() ) {
|
|
case QEvent::MouseButtonDblClick: return eventMouseDblClick( static_cast<QMouseEvent*>(e) );
|
|
case QEvent::MouseButtonPress: return eventMousePress( static_cast<QMouseEvent*>(e) );
|
|
case QEvent::MouseButtonRelease: return eventMouseRelease( static_cast<QMouseEvent*>(e) );
|
|
case QEvent::MouseMove: return eventMouseMove( static_cast<QMouseEvent*>(e) );
|
|
case QEvent::KeyPress: return eventKeyPress( static_cast<QKeyEvent*>(e) );
|
|
case QEvent::KeyRelease: return eventKeyRelease( static_cast<QKeyEvent*>(e) );
|
|
default: break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventMouseDblClick( QMouseEvent *e )
|
|
{
|
|
if ( m_state == StateReady && e->button() == Qt::LeftButton ) {
|
|
canvasDoubleClicked( e->pos(), e->state() );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventMousePress( QMouseEvent *e )
|
|
{
|
|
if ( m_state == StateReady ) {
|
|
if ( e->button() == Qt::RightButton ) {
|
|
m_state = StateRightButtonPressed;
|
|
return true;
|
|
}
|
|
else if ( e->button() == Qt::MidButton ) {
|
|
m_state = StateMiddleButtonPressed;
|
|
return true;
|
|
}
|
|
else if ( e->button() == Qt::LeftButton ) {
|
|
m_state = StateLeftButtonPressed;
|
|
m_drag_start_pos = e->pos();
|
|
m_drag_start_key = e->state();
|
|
m_drag_prev_pos = e->pos();
|
|
m_drag_prev_key = e->state();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventMouseRelease( QMouseEvent *e )
|
|
{
|
|
if ( m_state == StateRightButtonPressed && e->button() == Qt::RightButton ) {
|
|
m_state = StateReady;
|
|
canvasRightButtonClicked( e->pos(), e->state() );
|
|
return true;
|
|
}
|
|
if ( m_state == StateMiddleButtonPressed && e->button() == Qt::MidButton ) {
|
|
m_state = StateReady;
|
|
canvasMiddleButtonClicked( e->pos(), e->state() );
|
|
return true;
|
|
}
|
|
if ( m_state == StateLeftButtonPressed && e->button() == Qt::LeftButton ) {
|
|
m_state = StateReady;
|
|
canvasClicked( e->pos(), e->state() );
|
|
return true;
|
|
}
|
|
if ( m_state == StateDragging && e->button() == Qt::LeftButton ) {
|
|
m_state = StateReady;
|
|
canvasDragMove( e->pos(), m_drag_prev_pos, m_drag_start_pos, e->state(), m_drag_prev_key, m_drag_start_key );
|
|
canvasDragEnd( e->pos(), m_drag_start_pos, e->state(), m_drag_start_key );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventMouseMove( QMouseEvent *e )
|
|
{
|
|
if ( m_state == StateLeftButtonPressed && (e->state() & Qt::LeftButton) ) {
|
|
// eliminate some noise moves
|
|
if ( abs(m_drag_start_pos.x()-e->pos().x()) > 2 ||
|
|
abs(m_drag_start_pos.y()-e->pos().y()) > 2 ||
|
|
(m_drag_start_key& Qt::ShiftButton) )
|
|
if ( canvasDragStart( m_drag_start_pos, e->state() ) ) {
|
|
m_state = StateDragging;
|
|
canvasDragMove( e->pos(), m_drag_prev_pos, m_drag_start_pos, e->state(), m_drag_prev_key, m_drag_start_key );
|
|
m_drag_prev_pos = e->pos();
|
|
m_drag_prev_key = e->state();
|
|
} else {
|
|
m_state = StateReady;
|
|
}
|
|
return true;
|
|
}
|
|
else if ( m_state == StateDragging && (e->state() & Qt::LeftButton) ) {
|
|
canvasDragMove( e->pos(), m_drag_prev_pos, m_drag_start_pos, e->state(), m_drag_prev_key, m_drag_start_key );
|
|
m_drag_prev_pos = e->pos();
|
|
m_drag_prev_key = e->state();
|
|
return true;
|
|
}
|
|
else if ( m_state == StateReady ) {
|
|
canvasMove( e->pos() );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventKeyPress( QKeyEvent* )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::eventKeyRelease( QKeyEvent* )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::canvasClicked( const QPoint&, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
void QSTool::canvasMiddleButtonClicked( const QPoint&, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
void QSTool::canvasRightButtonClicked( const QPoint&, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
bool QSTool::canvasDragStart( const QPoint&, int )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
void QSTool::canvasDragMove( const QPoint&, const QPoint&, const QPoint&, int, int, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
void QSTool::canvasDragEnd( const QPoint&, const QPoint&, int, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::canvasMove( const QPoint& )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::canvasDoubleClicked( const QPoint&, int )
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
QSDrvQt *QSTool::driver()
|
|
{
|
|
if ( !m_drv ) {
|
|
m_drv = new QSDrvQt();
|
|
m_drv->setDC(new QPainter(m_view->canvasWidget()),m_view->dpi(),true);
|
|
m_drv->startDrawing();
|
|
}
|
|
return m_drv;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
void QSTool::release_driver()
|
|
{
|
|
if ( m_drv ) {
|
|
m_drv->stopDrawing();
|
|
delete m_drv; m_drv = NULL;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
double QSTool::snapToGridX( double canvas_x, int keyState )
|
|
{
|
|
double result = canvas_x;
|
|
double spacing_x = m_view->gridSpacingX();
|
|
if ( m_view->gridVisible() && spacing_x > 0.0 && !(keyState & Qt::ShiftButton) )
|
|
result = QSCoord::mmToPixels( floor(QSCoord::pixelsToMM(canvas_x,driver()->dpi)/spacing_x+0.5)*spacing_x, driver()->dpi );
|
|
return result;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
double QSTool::snapToGridY( double canvas_y, int keyState )
|
|
{
|
|
double result = canvas_y;
|
|
double spacing_y = m_view->gridSpacingY();
|
|
if ( m_view->gridVisible() && spacing_y > 0.0 && !(keyState & Qt::ShiftButton) )
|
|
result = QSCoord::mmToPixels( floor(QSCoord::pixelsToMM(canvas_y,driver()->dpi)/spacing_y+0.5)*spacing_y, driver()->dpi );
|
|
return result;
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
QSPt2f QSTool::snapToGrid( const QPoint& pos, int keyState )
|
|
{
|
|
return snapToGrid( QSPt2f(pos), keyState );
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
QSPt2f QSTool::snapToGrid( const QSPt2f& pos, int keyState )
|
|
{
|
|
return QSPt2f( snapToGridX(pos.x,keyState), snapToGridY(pos.y,keyState) );
|
|
}
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
int QSTool::snapAngle( int angle, int keyState )
|
|
{
|
|
if ( !(keyState & Qt::ShiftButton) ) angle = int(angle/15)*15;
|
|
return angle;
|
|
}
|
|
|
|
|
|
|
|
|