Changeset - 39b23673b4d1
[Not reviewed]
Hasan Yavuz Ă–ZDERYA - 8 years ago 2017-04-26 14:43:52
hy@ozderya.net
simplify scrollzoomer, only the x axis needs extra limits

Note: at this point auto-scale is broken, when X scroll is used it disables the
auto-scale on Y axis as well
3 files changed with 25 insertions and 28 deletions:
0 comments (0 inline, 0 general)
src/plot.cpp
Show inline comments
 
@@ -39,13 +39,13 @@ Plot::Plot(QWidget* parent) :
 
    isAutoScaled = true;
 
    symbolSize = 0;
 
    numOfSamples = 1;
 

	
 
    QObject::connect(&zoomer, &Zoomer::unzoomed, this, &Plot::unzoomed);
 

	
 
    zoomer.setZoomBase(QRectF(0,-1,2,500));
 
    zoomer.setZoomBase();
 
    grid.attach(this);
 
    legend.attach(this);
 

	
 
    showGrid(false);
 
    darkBackground(false);
 

	
 
@@ -98,20 +98,20 @@ void Plot::setXAxis(double xMin, double 
 
    _xMin = xMin;
 
    _xMax = xMax;
 

	
 
    zoomer.zoom(0); // unzoom
 

	
 
    // set axis
 
    setAxisScale(QwtPlot::xBottom, xMin, xMax);
 
    // setAxisScale(QwtPlot::xBottom, xMin, xMax);
 
    replot(); // Note: if we don't replot here scale at startup isn't set correctly
 

	
 
    // reset zoom base
 
    auto base = zoomer.zoomBase();
 
    base.setLeft(xMin);
 
    base.setRight(xMax);
 
    zoomer.setZoomBase(base);
 
    // auto base = zoomer.zoomBase();
 
    // base.setLeft(xMin);
 
    // base.setRight(xMax);
 
    // zoomer.setZoomBase(base);
 

	
 
    onXScaleChanged();
 
}
 

	
 
void Plot::resetAxes()
 
{
src/scrollzoomer.cpp
Show inline comments
 
@@ -40,12 +40,14 @@ ScrollZoomer::ScrollZoomer( QWidget *can
 
    d_cornerWidget( NULL ),
 
    d_hScrollData( NULL ),
 
    d_vScrollData( NULL ),
 
    d_inZoom( false )
 
{
 
    d_limits = QRectF(0, -10, 10000, 20);
 
    xMin = 0.;
 
    xMax = 10000.;
 

	
 
    for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
 
        d_alignCanvasToScales[ axis ] = false;
 

	
 
    if ( !canvas )
 
        return;
 
@@ -271,26 +273,22 @@ bool ScrollZoomer::needScrollBar( Qt::Or
 
    Qt::ScrollBarPolicy mode;
 
    double zoomMin, zoomMax, baseMin, baseMax;
 

	
 
    if ( orientation == Qt::Horizontal )
 
    {
 
        mode = d_hScrollData->mode;
 
        // baseMin = zoomBase().left();
 
        // baseMax = zoomBase().right();
 
        baseMin = d_limits.left();
 
        baseMax = d_limits.right();
 
        baseMin = xMin;
 
        baseMax = xMax;
 
        zoomMin = zoomRect().left();
 
        zoomMax = zoomRect().right();
 
    }
 
    else
 
    {
 
        mode = d_vScrollData->mode;
 
        // baseMin = zoomBase().top();
 
        // baseMax = zoomBase().bottom();
 
        baseMin = d_limits.top();
 
        baseMax = d_limits.bottom();
 
        baseMin = zoomBase().top();
 
        baseMax = zoomBase().bottom();
 
        zoomMin = zoomRect().top();
 
        zoomMax = zoomRect().bottom();
 
    }
 

	
 
    bool needed = false;
 
    switch( mode )
 
@@ -335,14 +333,13 @@ void ScrollZoomer::updateScrollBars()
 
    bool showHScrollBar = needScrollBar( Qt::Horizontal );
 
    if ( showHScrollBar )
 
    {
 
        ScrollBar *sb = scrollBar( Qt::Horizontal );
 
        sb->setPalette( plot()->palette() );
 
        sb->setInverted( !plot()->axisScaleDiv( xAxis ).isIncreasing() );
 
        // sb->setBase( zoomBase().left(), zoomBase().right() );
 
        sb->setBase( d_limits.left(), d_limits.right() );
 
        sb->setBase( xMin, xMax );
 
        sb->moveSlider( zoomRect().left(), zoomRect().right() );
 
        qDebug() << "moveSlider" << zoomRect().left() << zoomRect().right();
 

	
 
        if ( !sb->isVisibleTo( canvas() ) )
 
        {
 
            sb->show();
 
@@ -363,13 +360,13 @@ void ScrollZoomer::updateScrollBars()
 
    bool showVScrollBar = needScrollBar( Qt::Vertical );
 
    if ( showVScrollBar )
 
    {
 
        ScrollBar *sb = scrollBar( Qt::Vertical );
 
        sb->setPalette( plot()->palette() );
 
        sb->setInverted( plot()->axisScaleDiv( yAxis ).isIncreasing() );
 
        sb->setBase( d_limits.top(), d_limits.bottom() );
 
        sb->setBase( zoomRect().top(), zoomRect().bottom() );
 
        sb->moveSlider( zoomRect().top(), zoomRect().bottom() );
 

	
 
        if ( !sb->isVisibleTo( canvas() ) )
 
        {
 
            sb->show();
 
            layout->setCanvasMargin( layout->canvasMargin( yScrollBarAxis )
 
@@ -512,27 +509,24 @@ void ScrollZoomer::moveTo( const QPointF
 
    // 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 ( x < xMin )
 
        x = xMin;
 
    if ( x > xMax - zoomRect().width() )
 
        x = xMax - 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: "<<x<<y;
 
    if ( y < zoomBase().top() )
 
        y = zoomBase().top();
 
    if ( y > zoomBase().bottom() - zoomRect().height() )
 
        y = zoomBase().bottom() - zoomRect().height();
 

	
 
    if ( x != zoomRect().left() || y != zoomRect().top() )
 
    {
 
        auto zs = zoomStack();
 
        zs[zoomRectIndex()].moveTo( x, y );
 
        // d_data->zoomStack[d_data->zoomRectIndex].moveTo( x, y );
 
        setZoomStack(zs, zoomRectIndex());
 
        rescale();
 
    }
 
}
src/scrollzoomer.h
Show inline comments
 
@@ -42,12 +42,14 @@ public:
 
    void setHScrollBarPosition( ScrollBarPosition );
 
    void setVScrollBarPosition( ScrollBarPosition );
 

	
 
    ScrollBarPosition hScrollBarPosition() const;
 
    ScrollBarPosition vScrollBarPosition() const;
 

	
 
    void setXLimits(double min, double max);
 

	
 
    QWidget* cornerWidget() const;
 
    virtual void setCornerWidget( QWidget * );
 

	
 
    virtual bool eventFilter( QObject *, QEvent * );
 

	
 
    virtual void rescale();
 
@@ -62,12 +64,13 @@ protected:
 

	
 
private Q_SLOTS:
 
    void scrollBarMoved( Qt::Orientation o, double min, double max );
 

	
 
private:
 
    QRectF d_limits;
 
    double xMin, xMax;
 

	
 
    bool needScrollBar( Qt::Orientation ) const;
 
    int oppositeAxis( int ) const;
 

	
 
    QWidget *d_cornerWidget;
 

	
0 comments (0 inline, 0 general)