00001
00002
00003
00004
00005
00006
00007
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 delete d_data->scaleDraw;
00230 d_data->scaleDraw = scaleDraw;
00231 }
00232
00237 QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw()
00238 {
00239 return d_data->scaleDraw;
00240 }
00241
00246 const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const
00247 {
00248 return d_data->scaleDraw;
00249 }
00250
00251 void QwtAbstractScale::updateScaleDraw()
00252 {
00253 rescale( d_data->scaleDraw->scaleDiv().lBound(),
00254 d_data->scaleDraw->scaleDiv().hBound(), d_data->stepSize);
00255 }
00256
00266 void QwtAbstractScale::setScaleEngine(QwtScaleEngine *scaleEngine)
00267 {
00268 if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine )
00269 {
00270 delete d_data->scaleEngine;
00271 d_data->scaleEngine = scaleEngine;
00272 }
00273 }
00274
00279 const QwtScaleEngine *QwtAbstractScale::scaleEngine() const
00280 {
00281 return d_data->scaleEngine;
00282 }
00283
00288 QwtScaleEngine *QwtAbstractScale::scaleEngine()
00289 {
00290 return d_data->scaleEngine;
00291 }
00292
00298 void QwtAbstractScale::scaleChange()
00299 {
00300 }
00301
00305 const QwtScaleMap &QwtAbstractScale::scaleMap() const
00306 {
00307 return d_data->scaleDraw->scaleMap();
00308 }