/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ // vim: expandtab #include #include #include "qwt_plot.h" #include "qwt_plot_canvas.h" #include "qwt_scale_div.h" #include "qwt_plot_magnifier.h" class QwtPlotMagnifier::PrivateData { public: PrivateData() { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) isAxisEnabled[axis] = true; } bool isAxisEnabled[QwtPlot::axisCnt]; }; /*! Constructor \param canvas Plot canvas to be magnified */ QwtPlotMagnifier::QwtPlotMagnifier(QwtPlotCanvas *canvas): QwtMagnifier(canvas) { d_data = new PrivateData(); } //! Destructor QwtPlotMagnifier::~QwtPlotMagnifier() { delete d_data; } /*! \brief En/Disable an axis Axes that are enabled will be synchronized to the result of panning. All other axes will remain unchanged. \param axis Axis, see QwtPlot::Axis \param on On/Off \sa isAxisEnabled */ void QwtPlotMagnifier::setAxisEnabled(int axis, bool on) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->isAxisEnabled[axis] = on; } /*! Test if an axis is enabled \param axis Axis, see QwtPlot::Axis \return True, if the axis is enabled \sa setAxisEnabled */ bool QwtPlotMagnifier::isAxisEnabled(int axis) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->isAxisEnabled[axis]; return true; } //! Return observed plot canvas QwtPlotCanvas *QwtPlotMagnifier::canvas() { QObject *w = parent(); if ( w && w->inherits("QwtPlotCanvas") ) return (QwtPlotCanvas *)w; return NULL; } //! Return Observed plot canvas const QwtPlotCanvas *QwtPlotMagnifier::canvas() const { return ((QwtPlotMagnifier *)this)->canvas(); } //! Return plot widget, containing the observed plot canvas QwtPlot *QwtPlotMagnifier::plot() { QObject *w = canvas(); if ( w ) { w = w->parent(); if ( w && w->inherits("QwtPlot") ) return (QwtPlot *)w; } return NULL; } //! Return plot widget, containing the observed plot canvas const QwtPlot *QwtPlotMagnifier::plot() const { return ((QwtPlotMagnifier *)this)->plot(); } /*! Zoom in/out the axes scales \param factor A value < 1.0 zooms in, a value > 1.0 zooms out. */ void QwtPlotMagnifier::rescale(double factor) { factor = qwtAbs(factor); if ( factor == 1.0 || factor == 0.0 ) return; bool doReplot = false; QwtPlot* plt = plot(); const bool autoReplot = plt->autoReplot(); plt->setAutoReplot(false); for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { const QwtScaleDiv *scaleDiv = plt->axisScaleDiv(axisId); if ( isAxisEnabled(axisId) && scaleDiv->isValid() ) { const double center = scaleDiv->lBound() + scaleDiv->range() / 2; const double width_2 = scaleDiv->range() / 2 * factor; plt->setAxisScale(axisId, center - width_2, center + width_2); doReplot = true; } } plt->setAutoReplot(autoReplot); if ( doReplot ) plt->replot(); }