123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /* -*- 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
- *****************************************************************************/
- #include "qwt_abstract_scale.h"
- #include "qwt_scale_engine.h"
- #include "qwt_scale_draw.h"
- #include "qwt_scale_div.h"
- #include "qwt_scale_map.h"
- #include "qwt_interval.h"
- class QwtAbstractScale::PrivateData
- {
- public:
- PrivateData():
- maxMajor( 5 ),
- maxMinor( 3 ),
- stepSize( 0.0 ),
- autoScale( true )
- {
- scaleEngine = new QwtLinearScaleEngine;
- scaleDraw = new QwtScaleDraw();
- }
- ~PrivateData()
- {
- delete scaleEngine;
- delete scaleDraw;
- }
- QwtScaleEngine *scaleEngine;
- QwtAbstractScaleDraw *scaleDraw;
- int maxMajor;
- int maxMinor;
- double stepSize;
- bool autoScale;
- };
- /*!
- Constructor
- Creates a default QwtScaleDraw and a QwtLinearScaleEngine.
- Autoscaling is enabled, and the stepSize is initialized by 0.0.
- */
- QwtAbstractScale::QwtAbstractScale()
- {
- d_data = new PrivateData;
- rescale( 0.0, 100.0 );
- }
- //! Destructor
- QwtAbstractScale::~QwtAbstractScale()
- {
- delete d_data;
- }
- /*!
- \brief Specify a scale.
- Disable autoscaling and define a scale by an interval and a step size
- \param vmin lower limit of the scale interval
- \param vmax upper limit of the scale interval
- \param stepSize major step size
- \sa setAutoScale()
- */
- void QwtAbstractScale::setScale( double vmin, double vmax, double stepSize )
- {
- d_data->autoScale = false;
- d_data->stepSize = stepSize;
- rescale( vmin, vmax, stepSize );
- }
- /*!
- \brief Specify a scale.
- Disable autoscaling and define a scale by an interval and a step size
- \param interval Interval
- \param stepSize major step size
- \sa setAutoScale()
- */
- void QwtAbstractScale::setScale( const QwtInterval &interval, double stepSize )
- {
- setScale( interval.minValue(), interval.maxValue(), stepSize );
- }
- /*!
- \brief Specify a scale.
- Disable autoscaling and define a scale by a scale division
- \param scaleDiv Scale division
- \sa setAutoScale()
- */
- void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv )
- {
- d_data->autoScale = false;
- if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
- {
- d_data->scaleDraw->setScaleDiv( scaleDiv );
- scaleChange();
- }
- }
- /*!
- Recalculate the scale division and update the scale draw.
- \param vmin Lower limit of the scale interval
- \param vmax Upper limit of the scale interval
- \param stepSize Major step size
- \sa scaleChange()
- */
- void QwtAbstractScale::rescale( double vmin, double vmax, double stepSize )
- {
- const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale(
- vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize );
- if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
- {
- d_data->scaleDraw->setTransformation(
- d_data->scaleEngine->transformation() );
- d_data->scaleDraw->setScaleDiv( scaleDiv );
- scaleChange();
- }
- }
- /*!
- \brief Advise the widget to control the scale range internally.
- Autoscaling is on by default.
- \sa setScale(), autoScale()
- */
- void QwtAbstractScale::setAutoScale()
- {
- if ( !d_data->autoScale )
- {
- d_data->autoScale = true;
- scaleChange();
- }
- }
- /*!
- \return \c true if autoscaling is enabled
- */
- bool QwtAbstractScale::autoScale() const
- {
- return d_data->autoScale;
- }
- /*!
- \brief Set the maximum number of major tick intervals.
- The scale's major ticks are calculated automatically such that
- the number of major intervals does not exceed ticks.
- The default value is 5.
- \param ticks maximal number of major ticks.
- \sa QwtAbstractScaleDraw
- */
- void QwtAbstractScale::setScaleMaxMajor( int ticks )
- {
- if ( ticks != d_data->maxMajor )
- {
- d_data->maxMajor = ticks;
- updateScaleDraw();
- }
- }
- /*!
- \brief Set the maximum number of minor tick intervals
- The scale's minor ticks are calculated automatically such that
- the number of minor intervals does not exceed ticks.
- The default value is 3.
- \param ticks
- \sa QwtAbstractScaleDraw
- */
- void QwtAbstractScale::setScaleMaxMinor( int ticks )
- {
- if ( ticks != d_data->maxMinor )
- {
- d_data->maxMinor = ticks;
- updateScaleDraw();
- }
- }
- /*!
- \return Max. number of minor tick intervals
- The default value is 3.
- */
- int QwtAbstractScale::scaleMaxMinor() const
- {
- return d_data->maxMinor;
- }
- /*!
- \return Max. number of major tick intervals
- The default value is 5.
- */
- int QwtAbstractScale::scaleMaxMajor() const
- {
- return d_data->maxMajor;
- }
- /*!
- \brief Set a scale draw
- scaleDraw has to be created with new and will be deleted in
- ~QwtAbstractScale or the next call of setAbstractScaleDraw.
- */
- void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw )
- {
- if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw )
- return;
- if ( d_data->scaleDraw != NULL )
- scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() );
- delete d_data->scaleDraw;
- d_data->scaleDraw = scaleDraw;
- }
- /*!
- \return Scale draw
- \sa setAbstractScaleDraw()
- */
- QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw()
- {
- return d_data->scaleDraw;
- }
- /*!
- \return Scale draw
- \sa setAbstractScaleDraw()
- */
- const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const
- {
- return d_data->scaleDraw;
- }
- void QwtAbstractScale::updateScaleDraw()
- {
- rescale( d_data->scaleDraw->scaleDiv().lowerBound(),
- d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize );
- }
- /*!
- \brief Set a scale engine
- The scale engine is responsible for calculating the scale division,
- and in case of auto scaling how to align the scale.
- scaleEngine has to be created with new and will be deleted in
- ~QwtAbstractScale or the next call of setScaleEngine.
- */
- void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine )
- {
- if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine )
- {
- delete d_data->scaleEngine;
- d_data->scaleEngine = scaleEngine;
- }
- }
- /*!
- \return Scale engine
- \sa setScaleEngine()
- */
- const QwtScaleEngine *QwtAbstractScale::scaleEngine() const
- {
- return d_data->scaleEngine;
- }
- /*!
- \return Scale engine
- \sa setScaleEngine()
- */
- QwtScaleEngine *QwtAbstractScale::scaleEngine()
- {
- return d_data->scaleEngine;
- }
- /*!
- \brief Notify changed scale
- Dummy empty implementation, intended to be overloaded by derived classes
- */
- void QwtAbstractScale::scaleChange()
- {
- }
- /*!
- \return abstractScaleDraw()->scaleMap()
- */
- const QwtScaleMap &QwtAbstractScale::scaleMap() const
- {
- return d_data->scaleDraw->scaleMap();
- }
|