diff --git a/source/app/SubWindowHandle.cpp b/source/app/SubWindowHandle.cpp index a361a52..e15e061 100644 --- a/source/app/SubWindowHandle.cpp +++ b/source/app/SubWindowHandle.cpp @@ -43,7 +43,7 @@ SubWindowHandle::SubWindowHandle( QWidget * parent ) : // Create a new interface to show images m_cViewArea = new ViewArea( this ); - connect( m_cViewArea, SIGNAL( zoomFactorChanged( double ) ), this, SLOT( adjustScrollBarByZoom(double) ) ); + connect( m_cViewArea, SIGNAL( zoomFactorChanged( double , QPoint) ), this, SLOT( adjustScrollBarByZoom(double, QPoint) ) ); connect( m_cViewArea, SIGNAL( moveScroll( QPoint ) ), this, SLOT( adjustScrollBarByOffset(QPoint) ) ); // Define the cViewArea as the widget inside the scroll area @@ -56,6 +56,7 @@ SubWindowHandle::SubWindowHandle( QWidget * parent ) : m_cWindowName = QString( " " ); m_bIsPlaying = false; + m_cLastScroll = QPoint(); } SubWindowHandle::~SubWindowHandle() @@ -243,7 +244,7 @@ Void SubWindowHandle::zoomToFit() Void SubWindowHandle::scaleViewFactor( Double factor ) { Q_ASSERT( m_cViewArea->image() ); - m_cViewArea->zoomChangeEvent( factor ); + m_cViewArea->zoomChangeEvent( factor , QPoint() ); } Void SubWindowHandle::scaleView( Double scale ) @@ -280,16 +281,49 @@ void SubWindowHandle::adjustScrollBarByOffset( QPoint Offset ) { QScrollBar *scrollBar = m_cScrollArea->horizontalScrollBar(); scrollBar->setValue( int( scrollBar->value() + Offset.x() ) ); + m_cLastScroll.setX( scrollBar->value() ); scrollBar = m_cScrollArea->verticalScrollBar(); scrollBar->setValue( int( scrollBar->value() + Offset.y() ) ); + m_cLastScroll.setY( scrollBar->value() ); } -void SubWindowHandle::adjustScrollBarByZoom( double factor ) +// 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 ) { QScrollBar *scrollBar = m_cScrollArea->horizontalScrollBar(); - scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) ); + if( center.isNull() ) + { + scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) ); + } + else + { + Int x = center.x() - m_cLastScroll.x(); + Int value = int( factor * m_cLastScroll.x() + ( ( factor - 1 ) * x ) ); + if ( value > scrollBar->maximum() ) + value = scrollBar->maximum(); + if ( value < scrollBar->minimum() ) + value = scrollBar->minimum(); + scrollBar->setValue( value ); + m_cLastScroll.setX( value ); + } + scrollBar = m_cScrollArea->verticalScrollBar(); - scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) ); + if( center.isNull() ) + { + scrollBar->setValue( int( factor * scrollBar->value() + ( ( factor - 1 ) * scrollBar->pageStep() / 2 ) ) ); + } + else + { + Int y = center.y() - m_cLastScroll.y(); + Int value = int( factor * m_cLastScroll.y() + ( ( factor - 1 ) * y ) ); + if ( value > scrollBar->maximum() ) + value = scrollBar->maximum(); + if ( value < scrollBar->minimum() ) + value = scrollBar->minimum(); + scrollBar->setValue( value ); + m_cLastScroll.setY( value ); + } } diff --git a/source/app/SubWindowHandle.h b/source/app/SubWindowHandle.h index 2e4d661..4a13ced 100644 --- a/source/app/SubWindowHandle.h +++ b/source/app/SubWindowHandle.h @@ -59,6 +59,8 @@ private: Bool m_bIsPlaying; + QPoint m_cLastScroll; + public: SubWindowHandle( QWidget * parent = 0 ); ~SubWindowHandle(); @@ -152,7 +154,7 @@ protected: void closeEvent( QCloseEvent *event ); public Q_SLOTS: - void adjustScrollBarByZoom( double factor ); + void adjustScrollBarByZoom( double factor , QPoint center ); void adjustScrollBarByOffset( QPoint Offset ); }; diff --git a/source/app/ViewArea.cpp b/source/app/ViewArea.cpp index c19a301..2cea3ad 100755 --- a/source/app/ViewArea.cpp +++ b/source/app/ViewArea.cpp @@ -107,7 +107,7 @@ Double ViewArea::getZoomFactor() // return QSize( w, h ); // } -Void ViewArea::zoomChangeEvent(Double factor) +Void ViewArea::zoomChangeEvent(Double factor, QPoint center ) { Double zoomFactor; Double maxZoom = 100.0; @@ -128,7 +128,7 @@ Void ViewArea::zoomChangeEvent(Double factor) zoomFactor = maxZoom; setZoomFactor( zoomFactor ); - emit zoomFactorChanged(factor); + emit zoomFactorChanged(factor, center); } @@ -528,7 +528,7 @@ void ViewArea::wheelEvent( QWheelEvent *event ) else factor=0.8; - zoomChangeEvent( factor ); + zoomChangeEvent( factor , event->pos() ); } void ViewArea::mousePressEvent( QMouseEvent *event ) diff --git a/source/app/ViewArea.h b/source/app/ViewArea.h index daec08b..b708280 100755 --- a/source/app/ViewArea.h +++ b/source/app/ViewArea.h @@ -106,7 +106,7 @@ public: void setInputStream( InputStream *stream ); InputStream* getInputStream(); - Void zoomChangeEvent(Double factor); + Void zoomChangeEvent(Double factor, QPoint center); Double getZoomFactor(); // QSize sizeHint() const; @@ -115,7 +115,7 @@ signals: void selectionChanged( const QRect &rect ); void positionChanged( const QPoint &pos, InputStream *stream ); void moveScroll( QPoint offset ); - void zoomFactorChanged( double ); + void zoomFactorChanged( double factor , QPoint center); public slots: void setNormalMode();