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
+75 -43
View File
@@ -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,44 +273,26 @@ 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 )
{ {
@@ -311,9 +300,14 @@ glabels::View::resizeEvent( QResizeEvent *event )
} }
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
View File
@@ -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;