00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qpainter.h>
00013 #include <qpalette.h>
00014 #include <qmap.h>
00015 #include "qwt_math.h"
00016 #include "qwt_text.h"
00017 #include "qwt_painter.h"
00018 #include "qwt_scale_map.h"
00019 #include "qwt_scale_draw.h"
00020
00021 class QwtAbstractScaleDraw::PrivateData
00022 {
00023 public:
00024 PrivateData():
00025 components(Backbone | Ticks | Labels),
00026 spacing(4),
00027 minExtent(0)
00028 {
00029 tickLength[QwtScaleDiv::MinorTick] = 4;
00030 tickLength[QwtScaleDiv::MediumTick] = 6;
00031 tickLength[QwtScaleDiv::MajorTick] = 8;
00032 }
00033
00034 int components;
00035
00036 QwtScaleMap map;
00037 QwtScaleDiv scldiv;
00038
00039 int spacing;
00040 int tickLength[QwtScaleDiv::NTickTypes];
00041
00042 int minExtent;
00043
00044 QMap<double, QwtText> labelCache;
00045 };
00046
00054 QwtAbstractScaleDraw::QwtAbstractScaleDraw()
00055 {
00056 d_data = new QwtAbstractScaleDraw::PrivateData;
00057 }
00058
00060 QwtAbstractScaleDraw::QwtAbstractScaleDraw(const QwtAbstractScaleDraw &other)
00061 {
00062 d_data = new QwtAbstractScaleDraw::PrivateData(*other.d_data);
00063 }
00064
00066 QwtAbstractScaleDraw::~QwtAbstractScaleDraw()
00067 {
00068 delete d_data;
00069 }
00071 QwtAbstractScaleDraw &QwtAbstractScaleDraw::operator=(const QwtAbstractScaleDraw &other)
00072 {
00073 *d_data = *other.d_data;
00074 return *this;
00075 }
00076
00081 void QwtAbstractScaleDraw::enableComponent(
00082 ScaleComponent component, bool enable)
00083 {
00084 if ( enable )
00085 d_data->components |= component;
00086 else
00087 d_data->components &= ~component;
00088 }
00089
00094 bool QwtAbstractScaleDraw::hasComponent(ScaleComponent component) const
00095 {
00096 return (d_data->components & component);
00097 }
00098
00103 void QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &sd)
00104 {
00105 d_data->scldiv = sd;
00106 d_data->map.setScaleInterval(sd.lBound(), sd.hBound());
00107 d_data->labelCache.clear();
00108 }
00109
00114 void QwtAbstractScaleDraw::setTransformation(
00115 const QwtScaleTransformation &transformation)
00116 {
00117 d_data->map.setTransformation(transformation);
00118 }
00119
00121 const QwtScaleMap &QwtAbstractScaleDraw::map() const
00122 {
00123 return d_data->map;
00124 }
00125
00127 QwtScaleMap &QwtAbstractScaleDraw::scaleMap()
00128 {
00129 return d_data->map;
00130 }
00131
00133 const QwtScaleDiv& QwtAbstractScaleDraw::scaleDiv() const
00134 {
00135 return d_data->scldiv;
00136 }
00137
00138 #if QT_VERSION < 0x040000
00139
00147 void QwtAbstractScaleDraw::draw(QPainter *painter,
00148 const QColorGroup& colorGroup) const
00149
00150 #else
00151
00160 void QwtAbstractScaleDraw::draw(QPainter *painter,
00161 const QPalette& palette) const
00162 #endif
00163 {
00164 if ( hasComponent(QwtAbstractScaleDraw::Labels) )
00165 {
00166 painter->save();
00167
00168 #if QT_VERSION < 0x040000
00169 painter->setPen(colorGroup.text());
00170 #else
00171 painter->setPen(palette.color(QPalette::Text));
00172 #endif
00173
00174 const QwtTickList &majorTicks =
00175 d_data->scldiv.ticks(QwtScaleDiv::MajorTick);
00176
00177 for (int i = 0; i < (int)majorTicks.count(); i++)
00178 {
00179 const double v = majorTicks[i];
00180 if ( d_data->scldiv.contains(v) )
00181 drawLabel(painter, majorTicks[i]);
00182 }
00183
00184 painter->restore();
00185 }
00186
00187 if ( hasComponent(QwtAbstractScaleDraw::Ticks) )
00188 {
00189 painter->save();
00190
00191 QPen pen = painter->pen();
00192 #if QT_VERSION < 0x040000
00193 pen.setColor(colorGroup.foreground());
00194 #else
00195 pen.setColor(palette.color(QPalette::Foreground));
00196 #endif
00197 painter->setPen(pen);
00198
00199 for ( int tickType = QwtScaleDiv::MinorTick;
00200 tickType < QwtScaleDiv::NTickTypes; tickType++ )
00201 {
00202 const QwtTickList &ticks = d_data->scldiv.ticks(tickType);
00203 for (int i = 0; i < (int)ticks.count(); i++)
00204 {
00205 const double v = ticks[i];
00206 if ( d_data->scldiv.contains(v) )
00207 drawTick(painter, v, d_data->tickLength[tickType]);
00208 }
00209 }
00210
00211 painter->restore();
00212 }
00213
00214 if ( hasComponent(QwtAbstractScaleDraw::Backbone) )
00215 {
00216 painter->save();
00217
00218 QPen pen = painter->pen();
00219 #if QT_VERSION < 0x040000
00220 pen.setColor(colorGroup.foreground());
00221 #else
00222 pen.setColor(palette.color(QPalette::Foreground));
00223 #endif
00224 painter->setPen(pen);
00225
00226 drawBackbone(painter);
00227
00228 painter->restore();
00229 }
00230 }
00231
00242 void QwtAbstractScaleDraw::setSpacing(int spacing)
00243 {
00244 if ( spacing < 0 )
00245 spacing = 0;
00246
00247 d_data->spacing = spacing;
00248 }
00249
00258 int QwtAbstractScaleDraw::spacing() const
00259 {
00260 return d_data->spacing;
00261 }
00262
00276 void QwtAbstractScaleDraw::setMinimumExtent(int minExtent)
00277 {
00278 if ( minExtent < 0 )
00279 minExtent = 0;
00280
00281 d_data->minExtent = minExtent;
00282 }
00283
00288 int QwtAbstractScaleDraw::minimumExtent() const
00289 {
00290 return d_data->minExtent;
00291 }
00292
00301 void QwtAbstractScaleDraw::setTickLength(
00302 QwtScaleDiv::TickType tickType, int length)
00303 {
00304 if ( tickType < QwtScaleDiv::MinorTick ||
00305 tickType > QwtScaleDiv::MajorTick )
00306 {
00307 return;
00308 }
00309
00310 if ( length < 0 )
00311 length = 0;
00312
00313 const int maxTickLen = 1000;
00314 if ( length > maxTickLen )
00315 length = 1000;
00316
00317 d_data->tickLength[tickType] = length;
00318 }
00319
00326 int QwtAbstractScaleDraw::tickLength(QwtScaleDiv::TickType tickType) const
00327 {
00328 if ( tickType < QwtScaleDiv::MinorTick ||
00329 tickType > QwtScaleDiv::MajorTick )
00330 {
00331 return 0;
00332 }
00333
00334 return d_data->tickLength[tickType];
00335 }
00336
00340 int QwtAbstractScaleDraw::majTickLength() const
00341 {
00342 return d_data->tickLength[QwtScaleDiv::MajorTick];
00343 }
00344
00355 QwtText QwtAbstractScaleDraw::label(double value) const
00356 {
00357 return QString::number(value);
00358 }
00359
00369 const QwtText &QwtAbstractScaleDraw::tickLabel(
00370 const QFont &font, double value) const
00371 {
00372 QMap<double, QwtText>::const_iterator it = d_data->labelCache.find(value);
00373 if ( it == d_data->labelCache.end() )
00374 {
00375 QwtText lbl = label(value);
00376 lbl.setFlags(0);
00377 lbl.setLayoutAttributes(QwtText::MinimumLayout);
00378
00379 (void)lbl.textSize(font);
00380
00381 it = d_data->labelCache.insert(value, lbl);
00382 }
00383
00384 return (*it);
00385 }
00386
00394 void QwtAbstractScaleDraw::invalidateCache()
00395 {
00396 d_data->labelCache.clear();
00397 }