Reorganize image zoom functions. New zoomToFactor function is available from SubWindowHandle.
This commit is contained in:
@@ -58,10 +58,10 @@ Void SubWindowHandle::setMainWidget( QWidget *widget )
|
||||
m_cScrollArea->setWidget( widget );
|
||||
}
|
||||
|
||||
Void SubWindowHandle::processZoomChanged( Double factor, QPoint center )
|
||||
Void SubWindowHandle::processZoomChange( Double scale, QPoint center )
|
||||
{
|
||||
adjustScrollBarByZoom( factor, center );
|
||||
emit zoomChanged();
|
||||
adjustScrollBarByScale( scale, center );
|
||||
emit zoomChangedOnSubWindow();
|
||||
}
|
||||
|
||||
QSize SubWindowHandle::getScrollSize()
|
||||
@@ -82,17 +82,17 @@ Void SubWindowHandle::adjustScrollBarByOffset( QPoint Offset )
|
||||
|
||||
// This function was developed with help of the schematics presented in
|
||||
// http://stackoverflow.com/questions/13155382/jscrollpane-zoom-relative-to-mouse-position
|
||||
Void SubWindowHandle::adjustScrollBarByZoom( Double factor, QPoint center )
|
||||
Void SubWindowHandle::adjustScrollBarByScale( Double scale, QPoint center )
|
||||
{
|
||||
QScrollBar *scrollBar = m_cScrollArea->horizontalScrollBar();
|
||||
if( center.isNull() )
|
||||
{
|
||||
scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) );
|
||||
scrollBar->setValue( int( scale * scrollBar->value() + ( ( scale - 1 ) * scrollBar->pageStep() / 2 ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Int x = center.x() - m_cLastScroll.x();
|
||||
Int value = int( factor * m_cLastScroll.x() + ( ( factor - 1 ) * x ) );
|
||||
Int value = int( scale * m_cLastScroll.x() + ( ( scale - 1 ) * x ) );
|
||||
if( value > scrollBar->maximum() )
|
||||
value = scrollBar->maximum();
|
||||
if( value < scrollBar->minimum() )
|
||||
@@ -103,12 +103,12 @@ Void SubWindowHandle::adjustScrollBarByZoom( Double factor, QPoint center )
|
||||
scrollBar = m_cScrollArea->verticalScrollBar();
|
||||
if( center.isNull() )
|
||||
{
|
||||
scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) );
|
||||
scrollBar->setValue( int( scale * scrollBar->value() + ( ( scale - 1 ) * scrollBar->pageStep() / 2 ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Int y = center.y() - m_cLastScroll.y();
|
||||
Int value = int( factor * m_cLastScroll.y() + ( ( factor - 1 ) * y ) );
|
||||
Int value = int( scale * m_cLastScroll.y() + ( ( scale - 1 ) * y ) );
|
||||
if( value > scrollBar->maximum() )
|
||||
value = scrollBar->maximum();
|
||||
if( value < scrollBar->minimum() )
|
||||
|
||||
@@ -47,7 +47,7 @@ private:
|
||||
UInt m_uiCategory;
|
||||
QString m_cWindowName;
|
||||
|
||||
Void adjustScrollBarByZoom( Double factor, QPoint center );
|
||||
Void adjustScrollBarByScale( Double scale, QPoint center );
|
||||
|
||||
public:
|
||||
enum SubWindowCategories
|
||||
@@ -68,6 +68,10 @@ public:
|
||||
* Scale the image (zoomed in or out) to fit on the window.
|
||||
*/
|
||||
virtual Void zoomToFit() = 0;
|
||||
/*
|
||||
* Scale the image (zoomed in or out) to speficied absolute zoom value (1.0 = original size).
|
||||
*/
|
||||
virtual Void zoomToFactor( Double ) = 0;
|
||||
/**
|
||||
* Scale the image by a given factor
|
||||
* @param factor factor of scale. Ex: 1.2 scale the image up by 20% and
|
||||
@@ -75,6 +79,7 @@ public:
|
||||
*/
|
||||
virtual Void scaleView( Double ) = 0;
|
||||
|
||||
|
||||
virtual Double getScaleFactor() = 0;
|
||||
|
||||
Void setWindowName( QString );
|
||||
@@ -93,11 +98,11 @@ protected:
|
||||
QSize getScrollSize();
|
||||
|
||||
Q_SIGNALS:
|
||||
void zoomChanged();
|
||||
void zoomChangedOnSubWindow();
|
||||
void updateStatusBar( const QString& );
|
||||
|
||||
public Q_SLOTS:
|
||||
void processZoomChanged( double factor, QPoint center );
|
||||
void processZoomChange( double factor, QPoint center );
|
||||
void adjustScrollBarByOffset( QPoint Offset );
|
||||
void updateLastScrollValue();
|
||||
|
||||
|
||||
+20
-8
@@ -83,7 +83,7 @@ VideoSubWindow::VideoSubWindow( QWidget * parent, Bool isModule ) :
|
||||
|
||||
// Create a new interface to show images
|
||||
m_cViewArea = new ViewArea( this );
|
||||
connect( m_cViewArea, SIGNAL( zoomFactorChanged( double , QPoint) ), this, SLOT( processZoomChanged(double, QPoint) ) );
|
||||
connect( m_cViewArea, SIGNAL( zoomFactorChanged( double , QPoint) ), this, SLOT( processZoomChange(double, QPoint) ) );
|
||||
connect( m_cViewArea, SIGNAL( moveScroll( QPoint ) ), this, SLOT( adjustScrollBarByOffset(QPoint) ) );
|
||||
|
||||
connect( m_cViewArea, SIGNAL( selectionChanged( QRect ) ), this, SLOT( updateSelectedArea( QRect ) ) );
|
||||
@@ -339,9 +339,10 @@ Void VideoSubWindow::stop()
|
||||
|
||||
Void VideoSubWindow::normalSize()
|
||||
{
|
||||
Double scaleFactor = 1.0;
|
||||
m_cViewArea->setZoomFactor( scaleFactor );
|
||||
updateLastScrollValue();
|
||||
Double factor = 1.0;
|
||||
Double curFactor = getScaleFactor() ;
|
||||
if( factor != curFactor )
|
||||
m_cViewArea->scaleZoomFactor( factor/curFactor, QPoint() );
|
||||
}
|
||||
|
||||
Void VideoSubWindow::zoomToFit()
|
||||
@@ -350,10 +351,18 @@ Void VideoSubWindow::zoomToFit()
|
||||
scaleView( getScrollSize() );
|
||||
}
|
||||
|
||||
Void VideoSubWindow::zoomToFactor(Double factor)
|
||||
{
|
||||
Double curFactor;
|
||||
curFactor = getScaleFactor() ;
|
||||
if( factor != curFactor )
|
||||
m_cViewArea->scaleZoomFactor( factor/curFactor, QPoint() );
|
||||
}
|
||||
|
||||
Void VideoSubWindow::scaleView( Double scale )
|
||||
{
|
||||
Q_ASSERT( m_cViewArea->image() );
|
||||
m_cViewArea->zoomChangeEvent( scale, QPoint() );
|
||||
m_cViewArea->scaleZoomFactor( scale, QPoint() );
|
||||
}
|
||||
|
||||
Void VideoSubWindow::scaleView( const QSize & size )
|
||||
@@ -369,16 +378,19 @@ Void VideoSubWindow::scaleView( const QSize & size )
|
||||
// Calc the zoom factor
|
||||
Double wfactor = 1;
|
||||
Double hfactor = 1;
|
||||
Double factor;
|
||||
|
||||
wfactor = ( Double )newSize.width() / imgViewSize.width();
|
||||
hfactor = ( Double )newSize.height() / imgViewSize.height();
|
||||
|
||||
if( wfactor < hfactor )
|
||||
m_cViewArea->setZoomFactor( wfactor );
|
||||
factor = wfactor;
|
||||
else
|
||||
m_cViewArea->setZoomFactor( hfactor );
|
||||
factor = hfactor;
|
||||
|
||||
updateLastScrollValue();
|
||||
Double curFactor = getScaleFactor() ;
|
||||
if( factor != curFactor )
|
||||
m_cViewArea->scaleZoomFactor( factor/curFactor, QPoint() );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -165,6 +165,7 @@ public:
|
||||
Void normalSize();
|
||||
Void zoomToFit();
|
||||
Void scaleView( Double scale );
|
||||
Void zoomToFactor( Double factor );
|
||||
|
||||
Double getScaleFactor()
|
||||
{
|
||||
|
||||
+13
-11
@@ -109,19 +109,19 @@ Void ViewArea::setZoomFactor( Double f )
|
||||
update();
|
||||
}
|
||||
|
||||
Void ViewArea::zoomChangeEvent( Double factor, QPoint center )
|
||||
Void ViewArea::scaleZoomFactor( Double scale, QPoint center )
|
||||
{
|
||||
Double zoomFactor;
|
||||
Double maxZoom = 100.0;
|
||||
Double minZoom = 0.01; //( 1.0 / m_pixmap.width() );
|
||||
|
||||
if( ( m_zoomFactor == minZoom ) && ( factor < 1 ) )
|
||||
if( ( m_zoomFactor == minZoom ) && ( scale < 1 ) )
|
||||
return;
|
||||
|
||||
if( ( m_zoomFactor == maxZoom ) && ( factor > 1 ) )
|
||||
if( ( m_zoomFactor == maxZoom ) && ( scale > 1 ) )
|
||||
return;
|
||||
|
||||
zoomFactor = m_zoomFactor * factor;
|
||||
zoomFactor = m_zoomFactor * scale;
|
||||
|
||||
if( zoomFactor < minZoom )
|
||||
zoomFactor = minZoom;
|
||||
@@ -130,8 +130,8 @@ Void ViewArea::zoomChangeEvent( Double factor, QPoint center )
|
||||
zoomFactor = maxZoom;
|
||||
|
||||
setZoomFactor( zoomFactor );
|
||||
emit zoomFactorChanged( factor, center );
|
||||
|
||||
emit zoomFactorChanged( scale, center );
|
||||
}
|
||||
|
||||
void ViewArea::setMode( ViewMode mode )
|
||||
@@ -544,16 +544,17 @@ void ViewArea::paintEvent( QPaintEvent *event )
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ViewArea::wheelEvent( QWheelEvent *event )
|
||||
{
|
||||
Double factor;
|
||||
Double scale;
|
||||
|
||||
if( event->modifiers() & Qt::ControlModifier )
|
||||
{
|
||||
factor = 0.001 * event->delta();
|
||||
if(factor>0)
|
||||
factor=1.25;
|
||||
scale = 0.001 * event->delta();
|
||||
if(scale>0)
|
||||
scale=1.25;
|
||||
else
|
||||
factor=0.8;
|
||||
zoomChangeEvent( factor , event->pos() );
|
||||
scale=0.8;
|
||||
|
||||
scaleZoomFactor( scale , event->pos() );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -810,6 +811,7 @@ void ViewArea::mouseReleaseEvent( QMouseEvent *event )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool ViewArea::isPosValid( const QPoint &pos ) const
|
||||
|
||||
+2
-2
@@ -115,7 +115,7 @@ public:
|
||||
void setInputStream( PlaYUVerStream *stream );
|
||||
PlaYUVerStream* getInputStream();
|
||||
|
||||
Void zoomChangeEvent(Double factor, QPoint center);
|
||||
Void scaleZoomFactor(Double scale, QPoint center);
|
||||
|
||||
void setTool( eTool tool );
|
||||
|
||||
@@ -137,7 +137,6 @@ public Q_SLOTS:
|
||||
void setGridVisible( bool enable );
|
||||
void setSnapToGrid( bool enable );
|
||||
void setSelectedArea( QRect &rect );
|
||||
void setZoomFactor( double );
|
||||
|
||||
protected:
|
||||
void paintEvent( QPaintEvent *event );
|
||||
@@ -154,6 +153,7 @@ private:
|
||||
|
||||
bool isPosValid( const QPoint &pos ) const;
|
||||
void updateMask( const QRect &rect );
|
||||
void setZoomFactor( double );
|
||||
|
||||
QPoint windowToView( const QPoint& pt ) const;
|
||||
QRect windowToView( const QRect& rc ) const;
|
||||
|
||||
+7
-9
@@ -195,7 +195,7 @@ Void plaYUVerApp::loadFile( QString fileName, PlaYUVerStreamInfo* pStreamInfo )
|
||||
connect( videoSubWindow->getViewArea(), SIGNAL( selectionChanged( QRect ) ), m_appModuleVideo, SLOT( updateSelectionArea( QRect ) ) );
|
||||
|
||||
connect( subWindow, SIGNAL( updateStatusBar( const QString& ) ), this, SLOT( updateStatusBar( const QString& ) ) );
|
||||
connect( subWindow, SIGNAL( zoomChanged() ), this, SLOT( updateZoomFactorSBox() ) );
|
||||
connect( subWindow, SIGNAL( zoomChangedOnSubWindow() ), this, SLOT( updateZoomFactorSBox() ) );
|
||||
|
||||
videoSubWindow->zoomToFit();
|
||||
videoSubWindow->getViewArea()->setTool( m_appTool );
|
||||
@@ -399,7 +399,6 @@ Void plaYUVerApp::zoomToFit()
|
||||
{
|
||||
if( m_pcCurrentSubWindow )
|
||||
{
|
||||
|
||||
m_pcCurrentSubWindow->zoomToFit();
|
||||
updateZoomFactorSBox();
|
||||
}
|
||||
@@ -413,7 +412,8 @@ Void plaYUVerApp::zoomToFitAll()
|
||||
subWindow = qobject_cast<SubWindowHandle *>( mdiArea->subWindowList().at( i ) );
|
||||
subWindow->zoomToFit();
|
||||
}
|
||||
updateZoomFactorSBox();
|
||||
if( m_pcCurrentSubWindow )
|
||||
updateZoomFactorSBox();
|
||||
}
|
||||
|
||||
Void plaYUVerApp::scaleFrame( int ratio )
|
||||
@@ -421,17 +421,15 @@ Void plaYUVerApp::scaleFrame( int ratio )
|
||||
if( m_pcCurrentSubWindow )
|
||||
{
|
||||
m_pcCurrentSubWindow->scaleView( ( Double )( ratio ) / 100.0 );
|
||||
updateZoomFactorSBox();
|
||||
}
|
||||
}
|
||||
|
||||
Void plaYUVerApp::setZoomFromSBox( double zoom )
|
||||
Void plaYUVerApp::zoomFromSBox( double zoom )
|
||||
{
|
||||
Double lastZoom;
|
||||
if( activeSubWindow() )
|
||||
{
|
||||
lastZoom = activeSubWindow()->getScaleFactor() * 100;
|
||||
if( zoom / lastZoom != 1.0 )
|
||||
activeSubWindow()->scaleView( zoom / lastZoom );
|
||||
activeSubWindow()->zoomToFactor( zoom/100 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -924,7 +922,7 @@ Void plaYUVerApp::createToolBars()
|
||||
m_pcZoomFactorSBox->setSingleStep( 10.0 );
|
||||
m_pcZoomFactorSBox->setValue( 100.0 );
|
||||
m_pcZoomFactorSBox->setSuffix( "%" );
|
||||
connect( m_pcZoomFactorSBox, SIGNAL( valueChanged(double) ), this, SLOT( setZoomFromSBox(double) ) );
|
||||
connect( m_pcZoomFactorSBox, SIGNAL( valueChanged(double) ), this, SLOT( zoomFromSBox(double) ) );
|
||||
m_arrayToolBars[VIEW_TOOLBAR]->addWidget( m_pcZoomFactorSBox );
|
||||
m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_IN_ACT] );
|
||||
m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_OUT_ACT] );
|
||||
|
||||
+1
-1
@@ -85,7 +85,7 @@ private Q_SLOTS:
|
||||
* 80 scale the image down by 25%
|
||||
*/
|
||||
void scaleFrame( int ratio = 100.0 );
|
||||
void setZoomFromSBox( double ratio );
|
||||
void zoomFromSBox( double ratio );
|
||||
void normalSize();
|
||||
void zoomToFit();
|
||||
void zoomToFitAll();
|
||||
|
||||
Reference in New Issue
Block a user