Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

qwt_abstract_scale_draw.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 // vim: expandtab
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()); // ignore pen style
00170 #else
00171         painter->setPen(palette.color(QPalette::Text)); // ignore pen style
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); // initialize the internal cache
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 }

Generated on Mon Jan 30 22:16:25 2006 for Qwt User's Guide by  doxygen 1.4.4