From 93cd7b5f714cd8213ab1d694af93e72dd011dd74 Mon Sep 17 00:00:00 2001 From: Luis Lucas Date: Sun, 25 Jan 2015 23:46:29 +0000 Subject: [PATCH] Set minimum zoom equal to window size minus 5 pixels. --- app/VideoSubWindow.cpp | 8 ++++---- app/ViewArea.cpp | 41 ++++++++++++++++++++++++++++++++++++----- app/ViewArea.h | 2 +- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app/VideoSubWindow.cpp b/app/VideoSubWindow.cpp index 27b4934..a3ebe31 100644 --- a/app/VideoSubWindow.cpp +++ b/app/VideoSubWindow.cpp @@ -348,7 +348,7 @@ Void VideoSubWindow::normalSize() if( factor != curFactor ) { Double usedScale; - usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, QPoint() ); + usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, QPoint(), QSize() ); adjustScrollBarByScale( usedScale, QPoint() ); } } @@ -366,7 +366,7 @@ Void VideoSubWindow::zoomToFactor( Double factor, QPoint center ) if( factor != curFactor ) { Double usedScale; - usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, center ); + usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, center, QSize() ); adjustScrollBarByScale( usedScale, center ); } } @@ -377,7 +377,7 @@ Void VideoSubWindow::scaleView( Double scale, QPoint center ) if( scale != 1.0 ) { Double usedScale; - usedScale = m_cViewArea->scaleZoomFactor( scale, center ); + usedScale = m_cViewArea->scaleZoomFactor( scale, center, getScrollSize() ); adjustScrollBarByScale( usedScale, center ); } } @@ -409,7 +409,7 @@ Void VideoSubWindow::scaleView( const QSize & size, QPoint center ) if( factor != curFactor ) { Double usedScale; - usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, center ); + usedScale = m_cViewArea->scaleZoomFactor( factor / curFactor, center, getScrollSize() ); adjustScrollBarByScale( usedScale, center ); } } diff --git a/app/ViewArea.cpp b/app/ViewArea.cpp index 8eb145c..954dc8c 100644 --- a/app/ViewArea.cpp +++ b/app/ViewArea.cpp @@ -109,12 +109,41 @@ Void ViewArea::setZoomFactor( Double f ) update(); } -Double ViewArea::scaleZoomFactor( Double scale, QPoint center ) +Double ViewArea::scaleZoomFactor( Double scale, QPoint center, QSize minimumSize ) { - Double zoomFactor; Double maxZoom = 100.0; Double minZoom = 0.01; //( 1.0 / m_pixmap.width() ); Double new_scale = 1.0; + Double zoomFactor = m_zoomFactor * scale; + + if(!minimumSize.isNull()) + { + Double cw = m_pixmap.width()*m_zoomFactor; + Double ch = m_pixmap.height()*m_zoomFactor; + Double fw = m_pixmap.width()*zoomFactor; + Double fh = m_pixmap.height()*zoomFactor; + Double mw = minimumSize.width(); + Double mh = minimumSize.height(); + + if( (cw < mw) && (ch < mh) && (scale < 1) ) + { + return new_scale; + } + + if( (fw < mw) && (fh < mh) && (scale < 1) ) + { + Double wfactor = mw/fw; + Double hfactor = mh/fh; + + if( wfactor < hfactor ) + scale = wfactor; + else + scale = hfactor; + + zoomFactor = zoomFactor * scale; + scale = zoomFactor/m_zoomFactor; + } + } if( ( m_zoomFactor == minZoom ) && ( scale < 1 ) ) return new_scale; @@ -122,7 +151,7 @@ Double ViewArea::scaleZoomFactor( Double scale, QPoint center ) if( ( m_zoomFactor == maxZoom ) && ( scale > 1 ) ) return new_scale; - zoomFactor = m_zoomFactor * scale; + new_scale = scale; if( zoomFactor < minZoom ) @@ -289,7 +318,7 @@ void ViewArea::resizeEvent( QResizeEvent *event ) if( size().isEmpty() || m_pixmap.isNull() ) return; - updateOffset(); + updateSize(); update(); } //////////////////////////////////////////////////////////////////////////////// @@ -567,7 +596,9 @@ void ViewArea::wheelEvent( QWheelEvent *event ) else scale=0.8; - usedScale = scaleZoomFactor( scale , event->pos() ); + QWidget *p = parentWidget(); + QSize minimumSize = QSize( p->size().width() - 5, p->size().height() - 5 ); + usedScale = scaleZoomFactor( scale , event->pos(), minimumSize ); if( usedScale != 1.0 ) { emit zoomFactorChanged_byWheel( usedScale, event->pos() ); diff --git a/app/ViewArea.h b/app/ViewArea.h index 77f6868..9eec6ac 100644 --- a/app/ViewArea.h +++ b/app/ViewArea.h @@ -116,7 +116,7 @@ public: PlaYUVerStream* getInputStream(); // Scale function. Return used scale value (it may change when it touches the min or max zoom value) - Double scaleZoomFactor(Double scale, QPoint center); + Double scaleZoomFactor(Double scale, QPoint center, QSize minimumSize); void setTool( eTool tool );