Scaling and centering cleanup of view.
This commit is contained in:
+75
-43
@@ -43,8 +43,11 @@ namespace
|
|||||||
const int nZoomLevels = 14;
|
const int nZoomLevels = 14;
|
||||||
const double zoomLevels[nZoomLevels] = { 8, 6, 4, 3, 2, 1.5, 1, 0.75, 0.67, 0.50, 0.33, 0.25, 0.15, 0.10 };
|
const double zoomLevels[nZoomLevels] = { 8, 6, 4, 3, 2, 1.5, 1, 0.75, 0.67, 0.50, 0.33, 0.25, 0.15, 0.10 };
|
||||||
|
|
||||||
|
const double PTS_PER_INCH = 72.0;
|
||||||
const double ZOOM_TO_FIT_PAD = 16.0;
|
const double ZOOM_TO_FIT_PAD = 16.0;
|
||||||
|
|
||||||
|
const QColor backgroundColor( 192, 192, 192 );
|
||||||
|
|
||||||
const QColor shadowColor( 64, 64, 64, 128 );
|
const QColor shadowColor( 64, 64, 64, 128 );
|
||||||
const double shadowOffsetPixels = 4;
|
const double shadowOffsetPixels = 4;
|
||||||
|
|
||||||
@@ -73,8 +76,6 @@ glabels::View::View( QWidget *parent ) : QWidget(parent)
|
|||||||
{
|
{
|
||||||
mState = IdleState;
|
mState = IdleState;
|
||||||
|
|
||||||
setZoomReal( 1, false );
|
|
||||||
|
|
||||||
mModel = 0;
|
mModel = 0;
|
||||||
mMarkupVisible = true;
|
mMarkupVisible = true;
|
||||||
mGridVisible = true;
|
mGridVisible = true;
|
||||||
@@ -82,6 +83,8 @@ glabels::View::View( QWidget *parent ) : QWidget(parent)
|
|||||||
mInObjectCreateMode = false;
|
mInObjectCreateMode = false;
|
||||||
|
|
||||||
setMouseTracking( true );
|
setMouseTracking( true );
|
||||||
|
|
||||||
|
setMinimumSize( 640, 400 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -125,9 +128,13 @@ glabels::View::setModel( LabelModel* model )
|
|||||||
|
|
||||||
if ( model )
|
if ( model )
|
||||||
{
|
{
|
||||||
|
setZoomReal( 1, false );
|
||||||
|
|
||||||
connect( model, SIGNAL(changed()), this, SLOT(onModelChanged()) );
|
connect( model, SIGNAL(changed()), this, SLOT(onModelChanged()) );
|
||||||
connect( model, SIGNAL(selectionChanged()), this, SLOT(onModelSelectionChanged()) );
|
connect( model, SIGNAL(selectionChanged()), this, SLOT(onModelSelectionChanged()) );
|
||||||
connect( model, SIGNAL(sizeChanged()), this, SLOT(onModelSizeChanged()) );
|
connect( model, SIGNAL(sizeChanged()), this, SLOT(onModelSizeChanged()) );
|
||||||
|
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,9 +232,9 @@ glabels::View::zoomToFit()
|
|||||||
using std::min;
|
using std::min;
|
||||||
using std::max;
|
using std::max;
|
||||||
|
|
||||||
double x_scale = (72.0/physicalDpiX()) * ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
|
double x_scale = ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
|
||||||
double y_scale = (72.0/physicalDpiY()) * ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
|
double y_scale = ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
|
||||||
double newZoom = min( x_scale, y_scale );
|
double newZoom = min( x_scale, y_scale ) * PTS_PER_INCH / physicalDpiX();
|
||||||
|
|
||||||
// Limits
|
// Limits
|
||||||
newZoom = min( newZoom, zoomLevels[0] );
|
newZoom = min( newZoom, zoomLevels[0] );
|
||||||
@@ -266,53 +273,40 @@ glabels::View::setZoomReal( double zoom, bool zoomToFitFlag )
|
|||||||
mZoom = zoom;
|
mZoom = zoom;
|
||||||
mZoomToFitFlag = zoomToFitFlag;
|
mZoomToFitFlag = zoomToFitFlag;
|
||||||
|
|
||||||
|
/* Actual scale depends on DPI of display (assume DpiX == DpiY). */
|
||||||
|
mScale = zoom * physicalDpiX() / PTS_PER_INCH;
|
||||||
|
|
||||||
|
/* Adjust origin to center label in widget. */
|
||||||
|
mX0 = (width()/mScale - mModel->w()) / 2;
|
||||||
|
mY0 = (height()/mScale - mModel->h()) / 2;
|
||||||
|
|
||||||
update();
|
update();
|
||||||
|
|
||||||
emit zoomChanged();
|
emit zoomChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
|
||||||
/// Paint Event Handler
|
|
||||||
///
|
|
||||||
void
|
|
||||||
glabels::View::paintEvent( QPaintEvent* event )
|
|
||||||
{
|
|
||||||
if ( mModel )
|
|
||||||
{
|
|
||||||
QPainter painter( this );
|
|
||||||
|
|
||||||
painter.setRenderHint( QPainter::Antialiasing, true );
|
|
||||||
painter.setRenderHint( QPainter::TextAntialiasing, true );
|
|
||||||
painter.setRenderHint( QPainter::SmoothPixmapTransform, true );
|
|
||||||
|
|
||||||
painter.scale( mZoom, mZoom );
|
|
||||||
|
|
||||||
drawBgLayer( &painter );
|
|
||||||
drawGridLayer( &painter );
|
|
||||||
drawMarkupLayer( &painter );
|
|
||||||
drawObjectsLayer( &painter );
|
|
||||||
drawFgLayer( &painter );
|
|
||||||
drawHighlightLayer( &painter );
|
|
||||||
drawSelectRegionLayer( &painter );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Resize Event Handler
|
/// Resize Event Handler
|
||||||
///
|
///
|
||||||
void
|
void
|
||||||
glabels::View::resizeEvent( QResizeEvent *event )
|
glabels::View::resizeEvent( QResizeEvent *event )
|
||||||
{
|
{
|
||||||
|
if ( mModel )
|
||||||
|
{
|
||||||
if ( mZoomToFitFlag )
|
if ( mZoomToFitFlag )
|
||||||
{
|
{
|
||||||
zoomToFit();
|
zoomToFit();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Re-adjust origin to center label in widget. */
|
||||||
|
mX0 = (width()/mScale - mModel->w()) / 2;
|
||||||
|
mY0 = (height()/mScale - mModel->h()) / 2;
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -325,11 +319,12 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
|
|||||||
if ( mModel )
|
if ( mModel )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Translate to label coordinates
|
* Transform to label coordinates
|
||||||
*/
|
*/
|
||||||
QTransform transform;
|
QTransform transform;
|
||||||
|
|
||||||
transform.scale( mZoom, mZoom );
|
transform.scale( mScale, mScale );
|
||||||
|
transform.translate( mX0, mY0 );
|
||||||
|
|
||||||
QPointF pWorld = transform.inverted().map( event->posF() );
|
QPointF pWorld = transform.inverted().map( event->posF() );
|
||||||
double xWorld = pWorld.x();
|
double xWorld = pWorld.x();
|
||||||
@@ -352,11 +347,11 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
|
|||||||
|
|
||||||
case IdleState:
|
case IdleState:
|
||||||
if ( mModel->isSelectionAtomic() &&
|
if ( mModel->isSelectionAtomic() &&
|
||||||
mModel->handleAt( mZoom, xWorld, yWorld ) )
|
mModel->handleAt( mScale, xWorld, yWorld ) )
|
||||||
{
|
{
|
||||||
setCursor( Qt::CrossCursor );
|
setCursor( Qt::CrossCursor );
|
||||||
}
|
}
|
||||||
else if ( mModel->objectAt( mZoom, xWorld, yWorld ) )
|
else if ( mModel->objectAt( mScale, xWorld, yWorld ) )
|
||||||
{
|
{
|
||||||
setCursor( Qt::SizeAllCursor );
|
setCursor( Qt::SizeAllCursor );
|
||||||
}
|
}
|
||||||
@@ -436,11 +431,12 @@ glabels::View::mousePressEvent( QMouseEvent* event )
|
|||||||
if ( mModel )
|
if ( mModel )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Translate to label coordinates
|
* Transform to label coordinates
|
||||||
*/
|
*/
|
||||||
QTransform transform;
|
QTransform transform;
|
||||||
|
|
||||||
transform.scale( mZoom, mZoom );
|
transform.scale( mScale, mScale );
|
||||||
|
transform.translate( mX0, mY0 );
|
||||||
|
|
||||||
QPointF pWorld = transform.inverted().map( event->posF() );
|
QPointF pWorld = transform.inverted().map( event->posF() );
|
||||||
double xWorld = pWorld.x();
|
double xWorld = pWorld.x();
|
||||||
@@ -458,7 +454,7 @@ glabels::View::mousePressEvent( QMouseEvent* event )
|
|||||||
LabelModelObject* object = 0;
|
LabelModelObject* object = 0;
|
||||||
Handle* handle = 0;
|
Handle* handle = 0;
|
||||||
if ( mModel->isSelectionAtomic() &&
|
if ( mModel->isSelectionAtomic() &&
|
||||||
(handle = mModel->handleAt( mZoom, xWorld, yWorld )) != 0 )
|
(handle = mModel->handleAt( mScale, xWorld, yWorld )) != 0 )
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Start an object resize
|
// Start an object resize
|
||||||
@@ -469,7 +465,7 @@ glabels::View::mousePressEvent( QMouseEvent* event )
|
|||||||
|
|
||||||
mState = ArrowResize;
|
mState = ArrowResize;
|
||||||
}
|
}
|
||||||
else if ( (object = mModel->objectAt( mZoom, xWorld, yWorld )) != 0 )
|
else if ( (object = mModel->objectAt( mScale, xWorld, yWorld )) != 0 )
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Start a Move Selection (adjusting selection if necessary)
|
// Start a Move Selection (adjusting selection if necessary)
|
||||||
@@ -545,11 +541,12 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
|
|||||||
if ( mModel )
|
if ( mModel )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Translate to label coordinates
|
* Transform to label coordinates
|
||||||
*/
|
*/
|
||||||
QTransform transform;
|
QTransform transform;
|
||||||
|
|
||||||
transform.scale( mZoom, mZoom );
|
transform.scale( mScale, mScale );
|
||||||
|
transform.translate( mX0, mY0 );
|
||||||
|
|
||||||
QPointF pWorld = transform.inverted().map( event->posF() );
|
QPointF pWorld = transform.inverted().map( event->posF() );
|
||||||
double xWorld = pWorld.x();
|
double xWorld = pWorld.x();
|
||||||
@@ -747,6 +744,41 @@ glabels::View::handleResizeMotion( double xWorld, double yWorld )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Paint Event Handler
|
||||||
|
///
|
||||||
|
void
|
||||||
|
glabels::View::paintEvent( QPaintEvent* event )
|
||||||
|
{
|
||||||
|
if ( mModel )
|
||||||
|
{
|
||||||
|
QPainter painter( this );
|
||||||
|
|
||||||
|
painter.setRenderHint( QPainter::Antialiasing, true );
|
||||||
|
painter.setRenderHint( QPainter::TextAntialiasing, true );
|
||||||
|
painter.setRenderHint( QPainter::SmoothPixmapTransform, true );
|
||||||
|
|
||||||
|
/* Fill background before any transformations */
|
||||||
|
painter.setBrush( QBrush( backgroundColor ) );
|
||||||
|
painter.setPen( Qt::NoPen );
|
||||||
|
painter.drawRect( rect() );
|
||||||
|
|
||||||
|
/* Transform. */
|
||||||
|
painter.scale( mScale, mScale );
|
||||||
|
painter.translate( mX0, mY0 );
|
||||||
|
|
||||||
|
/* Now draw from the bottom layer up. */
|
||||||
|
drawBgLayer( &painter );
|
||||||
|
drawGridLayer( &painter );
|
||||||
|
drawMarkupLayer( &painter );
|
||||||
|
drawObjectsLayer( &painter );
|
||||||
|
drawFgLayer( &painter );
|
||||||
|
drawHighlightLayer( &painter );
|
||||||
|
drawSelectRegionLayer( &painter );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Draw Background Layer
|
/// Draw Background Layer
|
||||||
///
|
///
|
||||||
@@ -761,7 +793,7 @@ glabels::View::drawBgLayer( QPainter* painter )
|
|||||||
painter->setBrush( QBrush( shadowColor ) );
|
painter->setBrush( QBrush( shadowColor ) );
|
||||||
painter->setPen( Qt::NoPen );
|
painter->setPen( Qt::NoPen );
|
||||||
|
|
||||||
painter->translate( shadowOffsetPixels/mZoom, shadowOffsetPixels/mZoom );
|
painter->translate( shadowOffsetPixels/mScale, shadowOffsetPixels/mScale );
|
||||||
|
|
||||||
if ( mModel->rotate() )
|
if ( mModel->rotate() )
|
||||||
{
|
{
|
||||||
|
|||||||
+6
-3
@@ -115,18 +115,20 @@ namespace glabels
|
|||||||
// Event handlers
|
// Event handlers
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
protected:
|
protected:
|
||||||
void paintEvent( QPaintEvent* event );
|
|
||||||
void resizeEvent( QResizeEvent* event );
|
void resizeEvent( QResizeEvent* event );
|
||||||
void mouseMoveEvent( QMouseEvent* event );
|
void mouseMoveEvent( QMouseEvent* event );
|
||||||
void mousePressEvent( QMouseEvent* event );
|
void mousePressEvent( QMouseEvent* event );
|
||||||
void mouseReleaseEvent( QMouseEvent* event );
|
void mouseReleaseEvent( QMouseEvent* event );
|
||||||
void leaveEvent( QEvent* event );
|
void leaveEvent( QEvent* event );
|
||||||
|
void paintEvent( QPaintEvent* event );
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
// Private methods
|
// Private methods
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
private:
|
private:
|
||||||
|
void handleResizeMotion( double xWorld, double yWorld );
|
||||||
|
|
||||||
void drawBgLayer( QPainter* painter );
|
void drawBgLayer( QPainter* painter );
|
||||||
void drawGridLayer( QPainter* painter );
|
void drawGridLayer( QPainter* painter );
|
||||||
void drawMarkupLayer( QPainter* painter );
|
void drawMarkupLayer( QPainter* painter );
|
||||||
@@ -135,8 +137,6 @@ namespace glabels
|
|||||||
void drawHighlightLayer( QPainter* painter );
|
void drawHighlightLayer( QPainter* painter );
|
||||||
void drawSelectRegionLayer( QPainter* painter );
|
void drawSelectRegionLayer( QPainter* painter );
|
||||||
|
|
||||||
void handleResizeMotion( double xWorld, double yWorld );
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
// Private slots
|
// Private slots
|
||||||
@@ -169,6 +169,9 @@ namespace glabels
|
|||||||
|
|
||||||
double mZoom;
|
double mZoom;
|
||||||
bool mZoomToFitFlag;
|
bool mZoomToFitFlag;
|
||||||
|
double mScale;
|
||||||
|
double mX0;
|
||||||
|
double mY0;
|
||||||
|
|
||||||
bool mMarkupVisible;
|
bool mMarkupVisible;
|
||||||
bool mGridVisible;
|
bool mGridVisible;
|
||||||
|
|||||||
Reference in New Issue
Block a user