# HG changeset patch # User Hasan Yavuz Ă–ZDERYA # Date 2017-01-29 07:45:41 # Node ID c78aec692ac0b85831105529a69b663c5b3cf33e # Parent da3f4cd6026d35d531090367e10a2149bcbf993e experimental scrollbar behaviour for large data plots diff --git a/src/plot.cpp b/src/plot.cpp --- a/src/plot.cpp +++ b/src/plot.cpp @@ -41,7 +41,7 @@ Plot::Plot(QWidget* parent) : QObject::connect(&zoomer, &Zoomer::unzoomed, this, &Plot::unzoomed); - zoomer.setZoomBase(); + zoomer.setZoomBase(QRectF(0,-1,2,500)); grid.attach(this); legend.attach(this); diff --git a/src/scrollzoomer.cpp b/src/scrollzoomer.cpp --- a/src/scrollzoomer.cpp +++ b/src/scrollzoomer.cpp @@ -42,6 +42,8 @@ ScrollZoomer::ScrollZoomer( QWidget *can d_vScrollData( NULL ), d_inZoom( false ) { + d_limits = QRectF(0, -10, 10000, 20); + for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_alignCanvasToScales[ axis ] = false; @@ -61,6 +63,8 @@ ScrollZoomer::~ScrollZoomer() void ScrollZoomer::rescale() { + qDebug() << "rescale"; + QwtScaleWidget *xScale = plot()->axisWidget( xAxis() ); QwtScaleWidget *yScale = plot()->axisWidget( yAxis() ); @@ -265,16 +269,20 @@ bool ScrollZoomer::needScrollBar( Qt::Or if ( orientation == Qt::Horizontal ) { mode = d_hScrollData->mode; - baseMin = zoomBase().left(); - baseMax = zoomBase().right(); + // baseMin = zoomBase().left(); + // baseMax = zoomBase().right(); + baseMin = d_limits.left(); + baseMax = d_limits.right(); zoomMin = zoomRect().left(); zoomMax = zoomRect().right(); } else { mode = d_vScrollData->mode; - baseMin = zoomBase().top(); - baseMax = zoomBase().bottom(); + // baseMin = zoomBase().top(); + // baseMax = zoomBase().bottom(); + baseMin = d_limits.top(); + baseMax = d_limits.bottom(); zoomMin = zoomRect().top(); zoomMax = zoomRect().bottom(); } @@ -300,6 +308,8 @@ bool ScrollZoomer::needScrollBar( Qt::Or void ScrollZoomer::updateScrollBars() { + qDebug() << "updateScrollBars()"; + if ( !canvas() ) return; @@ -323,8 +333,10 @@ void ScrollZoomer::updateScrollBars() ScrollBar *sb = scrollBar( Qt::Horizontal ); sb->setPalette( plot()->palette() ); sb->setInverted( !plot()->axisScaleDiv( xAxis ).isIncreasing() ); - sb->setBase( zoomBase().left(), zoomBase().right() ); + // sb->setBase( zoomBase().left(), zoomBase().right() ); + sb->setBase( d_limits.left(), d_limits.right() ); sb->moveSlider( zoomRect().left(), zoomRect().right() ); + qDebug() << "moveSlider" << zoomRect().left() << zoomRect().right(); if ( !sb->isVisibleTo( canvas() ) ) { @@ -349,7 +361,7 @@ void ScrollZoomer::updateScrollBars() ScrollBar *sb = scrollBar( Qt::Vertical ); sb->setPalette( plot()->palette() ); sb->setInverted( plot()->axisScaleDiv( yAxis ).isIncreasing() ); - sb->setBase( zoomBase().top(), zoomBase().bottom() ); + sb->setBase( d_limits.top(), d_limits.bottom() ); sb->moveSlider( zoomRect().top(), zoomRect().bottom() ); if ( !sb->isVisibleTo( canvas() ) ) @@ -487,3 +499,33 @@ int ScrollZoomer::oppositeAxis( int axis return axis; } + +void ScrollZoomer::moveTo( const QPointF &pos ) +{ + // QwtPlotZoomer::moveTo(pos); + // return; + + double x = pos.x(); + double y = pos.y(); + + if ( x < d_limits.left() ) + x = d_limits.left(); + if ( x > d_limits.right() - zoomRect().width() ) + x = d_limits.right() - zoomRect().width(); + + if ( y < d_limits.top() ) + y = d_limits.top(); + if ( y > d_limits.bottom() - zoomRect().height() ) + y = d_limits.bottom() - zoomRect().height(); + + qDebug() << "x,y: "<zoomStack[d_data->zoomRectIndex].moveTo( x, y ); + setZoomStack(zs, zoomRectIndex()); + rescale(); + } +} diff --git a/src/scrollzoomer.h b/src/scrollzoomer.h --- a/src/scrollzoomer.h +++ b/src/scrollzoomer.h @@ -52,6 +52,9 @@ public: virtual void rescale(); +public Q_SLOTS: + virtual void moveTo( const QPointF & ); + protected: virtual ScrollBar *scrollBar( Qt::Orientation ); virtual void updateScrollBars(); @@ -61,6 +64,8 @@ private Q_SLOTS: void scrollBarMoved( Qt::Orientation o, double min, double max ); private: + QRectF d_limits; + bool needScrollBar( Qt::Orientation ) const; int oppositeAxis( int ) const;