Scaling and centering cleanup of view.

This commit is contained in:
Jim Evins
2015-08-15 14:26:23 -04:00
parent ec60767184
commit 95f5ee5e76
2 changed files with 90 additions and 55 deletions
+84 -52
View File
@@ -40,10 +40,13 @@
//
namespace
{
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 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 ZOOM_TO_FIT_PAD = 16.0;
const double PTS_PER_INCH = 72.0;
const double ZOOM_TO_FIT_PAD = 16.0;
const QColor backgroundColor( 192, 192, 192 );
const QColor shadowColor( 64, 64, 64, 128 );
const double shadowOffsetPixels = 4;
@@ -73,8 +76,6 @@ glabels::View::View( QWidget *parent ) : QWidget(parent)
{
mState = IdleState;
setZoomReal( 1, false );
mModel = 0;
mMarkupVisible = true;
mGridVisible = true;
@@ -82,6 +83,8 @@ glabels::View::View( QWidget *parent ) : QWidget(parent)
mInObjectCreateMode = false;
setMouseTracking( true );
setMinimumSize( 640, 400 );
}
@@ -125,9 +128,13 @@ glabels::View::setModel( LabelModel* model )
if ( model )
{
setZoomReal( 1, false );
connect( model, SIGNAL(changed()), this, SLOT(onModelChanged()) );
connect( model, SIGNAL(selectionChanged()), this, SLOT(onModelSelectionChanged()) );
connect( model, SIGNAL(sizeChanged()), this, SLOT(onModelSizeChanged()) );
update();
}
}
@@ -225,9 +232,9 @@ glabels::View::zoomToFit()
using std::min;
using std::max;
double x_scale = (72.0/physicalDpiX()) * ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
double y_scale = (72.0/physicalDpiY()) * ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
double newZoom = min( x_scale, y_scale );
double x_scale = ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
double y_scale = ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
double newZoom = min( x_scale, y_scale ) * PTS_PER_INCH / physicalDpiX();
// Limits
newZoom = min( newZoom, zoomLevels[0] );
@@ -266,52 +273,39 @@ glabels::View::setZoomReal( double zoom, bool zoomToFitFlag )
mZoom = zoom;
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();
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
///
void
glabels::View::resizeEvent( QResizeEvent *event )
{
if ( mZoomToFitFlag )
if ( mModel )
{
zoomToFit();
}
else
{
update();
if ( mZoomToFitFlag )
{
zoomToFit();
}
else
{
/* Re-adjust origin to center label in widget. */
mX0 = (width()/mScale - mModel->w()) / 2;
mY0 = (height()/mScale - mModel->h()) / 2;
update();
}
}
}
@@ -325,11 +319,12 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
if ( mModel )
{
/*
* Translate to label coordinates
* Transform to label coordinates
*/
QTransform transform;
transform.scale( mZoom, mZoom );
transform.scale( mScale, mScale );
transform.translate( mX0, mY0 );
QPointF pWorld = transform.inverted().map( event->posF() );
double xWorld = pWorld.x();
@@ -352,11 +347,11 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
case IdleState:
if ( mModel->isSelectionAtomic() &&
mModel->handleAt( mZoom, xWorld, yWorld ) )
mModel->handleAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::CrossCursor );
}
else if ( mModel->objectAt( mZoom, xWorld, yWorld ) )
else if ( mModel->objectAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::SizeAllCursor );
}
@@ -436,11 +431,12 @@ glabels::View::mousePressEvent( QMouseEvent* event )
if ( mModel )
{
/*
* Translate to label coordinates
* Transform to label coordinates
*/
QTransform transform;
transform.scale( mZoom, mZoom );
transform.scale( mScale, mScale );
transform.translate( mX0, mY0 );
QPointF pWorld = transform.inverted().map( event->posF() );
double xWorld = pWorld.x();
@@ -458,7 +454,7 @@ glabels::View::mousePressEvent( QMouseEvent* event )
LabelModelObject* object = 0;
Handle* handle = 0;
if ( mModel->isSelectionAtomic() &&
(handle = mModel->handleAt( mZoom, xWorld, yWorld )) != 0 )
(handle = mModel->handleAt( mScale, xWorld, yWorld )) != 0 )
{
//
// Start an object resize
@@ -469,7 +465,7 @@ glabels::View::mousePressEvent( QMouseEvent* event )
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)
@@ -545,11 +541,12 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
if ( mModel )
{
/*
* Translate to label coordinates
* Transform to label coordinates
*/
QTransform transform;
transform.scale( mZoom, mZoom );
transform.scale( mScale, mScale );
transform.translate( mX0, mY0 );
QPointF pWorld = transform.inverted().map( event->posF() );
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
///
@@ -761,7 +793,7 @@ glabels::View::drawBgLayer( QPainter* painter )
painter->setBrush( QBrush( shadowColor ) );
painter->setPen( Qt::NoPen );
painter->translate( shadowOffsetPixels/mZoom, shadowOffsetPixels/mZoom );
painter->translate( shadowOffsetPixels/mScale, shadowOffsetPixels/mScale );
if ( mModel->rotate() )
{
+6 -3
View File
@@ -115,18 +115,20 @@ namespace glabels
// Event handlers
/////////////////////////////////////
protected:
void paintEvent( QPaintEvent* event );
void resizeEvent( QResizeEvent* event );
void mouseMoveEvent( QMouseEvent* event );
void mousePressEvent( QMouseEvent* event );
void mouseReleaseEvent( QMouseEvent* event );
void leaveEvent( QEvent* event );
void paintEvent( QPaintEvent* event );
/////////////////////////////////////
// Private methods
/////////////////////////////////////
private:
void handleResizeMotion( double xWorld, double yWorld );
void drawBgLayer( QPainter* painter );
void drawGridLayer( QPainter* painter );
void drawMarkupLayer( QPainter* painter );
@@ -135,8 +137,6 @@ namespace glabels
void drawHighlightLayer( QPainter* painter );
void drawSelectRegionLayer( QPainter* painter );
void handleResizeMotion( double xWorld, double yWorld );
/////////////////////////////////////
// Private slots
@@ -169,6 +169,9 @@ namespace glabels
double mZoom;
bool mZoomToFitFlag;
double mScale;
double mX0;
double mY0;
bool mMarkupVisible;
bool mGridVisible;