qwt_abstract_scale.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  * 
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 #include "qwt_scale_engine.h"
00011 #include "qwt_scale_draw.h"
00012 #include "qwt_scale_div.h"
00013 #include "qwt_scale_map.h"
00014 #include "qwt_double_interval.h"
00015 #include "qwt_abstract_scale.h"
00016 
00017 class QwtAbstractScale::PrivateData
00018 {
00019 public:
00020     PrivateData():
00021         maxMajor(5),
00022         maxMinor(3),
00023         stepSize(0.0),
00024         autoScale(true)
00025     {
00026         scaleEngine = new QwtLinearScaleEngine;
00027         scaleDraw = new QwtScaleDraw();
00028     }
00029 
00030     ~PrivateData()
00031     {
00032         delete scaleEngine;
00033         delete scaleDraw;
00034     }
00035 
00036     QwtScaleEngine *scaleEngine;
00037     QwtAbstractScaleDraw *scaleDraw;
00038 
00039     int maxMajor;
00040     int maxMinor;
00041     double stepSize;
00042 
00043     bool autoScale;
00044 };
00045 
00053 QwtAbstractScale::QwtAbstractScale()
00054 {
00055     d_data = new PrivateData;
00056     rescale(0.0, 100.0);
00057 }
00058 
00060 QwtAbstractScale::~QwtAbstractScale()
00061 {
00062     delete d_data;
00063 }
00064 
00075 void QwtAbstractScale::setScale(double vmin, double vmax, double stepSize)
00076 {
00077     d_data->autoScale = false;
00078     d_data->stepSize = stepSize;
00079 
00080     rescale(vmin, vmax, stepSize);
00081 }
00082 
00092 void QwtAbstractScale::setScale(const QwtDoubleInterval &interval, 
00093     double stepSize)
00094 {
00095     setScale(interval.minValue(), interval.maxValue(), stepSize);
00096 }
00097 
00098 
00107 void QwtAbstractScale::setScale(const QwtScaleDiv &scaleDiv)
00108 {
00109     d_data->autoScale = false;
00110 
00111     if (scaleDiv != d_data->scaleDraw->scaleDiv())
00112     {
00113         d_data->scaleDraw->setScaleDiv(scaleDiv);
00114         scaleChange();
00115     }
00116 }
00117 
00127 void QwtAbstractScale::rescale(double vmin, double vmax, double stepSize) 
00128 {
00129     const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale(
00130         vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize);
00131 
00132     if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
00133     {
00134         d_data->scaleDraw->setTransformation(
00135             d_data->scaleEngine->transformation());
00136         d_data->scaleDraw->setScaleDiv(scaleDiv);
00137         scaleChange();
00138     }
00139 }
00140 
00147 void QwtAbstractScale::setAutoScale()
00148 {
00149     if (!d_data->autoScale) 
00150     {
00151         d_data->autoScale = true;
00152         scaleChange();
00153     }
00154 }
00155 
00159 bool QwtAbstractScale::autoScale() const
00160 {
00161     return d_data->autoScale;
00162 }
00163 
00173 void QwtAbstractScale::setScaleMaxMajor(int ticks)
00174 {
00175     if (ticks != d_data->maxMajor)
00176     {
00177         d_data->maxMajor = ticks;
00178         updateScaleDraw();
00179     }
00180 }
00181 
00191 void QwtAbstractScale::setScaleMaxMinor(int ticks)
00192 {
00193     if ( ticks != d_data->maxMinor)
00194     {
00195         d_data->maxMinor = ticks;
00196         updateScaleDraw();
00197     }
00198 }
00199 
00204 int QwtAbstractScale::scaleMaxMinor() const 
00205 {
00206     return d_data->maxMinor;
00207 }
00208 
00213 int QwtAbstractScale::scaleMaxMajor() const 
00214 {
00215     return d_data->maxMajor;
00216 }
00217 
00224 void QwtAbstractScale::setAbstractScaleDraw(QwtAbstractScaleDraw *scaleDraw)
00225 {
00226     if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw )
00227         return;
00228 
00229     if ( d_data->scaleDraw != NULL )
00230         scaleDraw->setScaleDiv(d_data->scaleDraw->scaleDiv());
00231 
00232     delete d_data->scaleDraw;
00233     d_data->scaleDraw = scaleDraw;
00234 } 
00235 
00240 QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() 
00241 {
00242     return d_data->scaleDraw;
00243 }
00244 
00249 const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const
00250 {
00251     return d_data->scaleDraw;
00252 }
00253 
00254 void QwtAbstractScale::updateScaleDraw()
00255 {
00256     rescale( d_data->scaleDraw->scaleDiv().lBound(), 
00257         d_data->scaleDraw->scaleDiv().hBound(), d_data->stepSize);
00258 }
00259 
00269 void QwtAbstractScale::setScaleEngine(QwtScaleEngine *scaleEngine)
00270 {
00271     if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine )
00272     {
00273         delete d_data->scaleEngine;
00274         d_data->scaleEngine = scaleEngine;
00275     }
00276 }
00277 
00282 const QwtScaleEngine *QwtAbstractScale::scaleEngine() const
00283 {
00284     return d_data->scaleEngine;
00285 }
00286 
00291 QwtScaleEngine *QwtAbstractScale::scaleEngine()
00292 {
00293     return d_data->scaleEngine;
00294 }
00295 
00301 void QwtAbstractScale::scaleChange()
00302 {
00303 }
00304 
00308 const QwtScaleMap &QwtAbstractScale::scaleMap() const
00309 {
00310     return d_data->scaleDraw->scaleMap();
00311 }

Generated on Sun Mar 22 16:54:06 2009 for Qwt User's Guide by  doxygen 1.5.0