Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <qpalette.h>
00011 #include <qpainter.h>
00012 #include "qwt_plot.h"
00013 #include "qwt_plot_canvas.h"
00014 #include "qwt_scale_map.h"
00015 #include "qwt_plot_scaleitem.h"
00016 #include "qwt_double_interval.h"
00017
00018 class QwtPlotScaleItem::PrivateData
00019 {
00020 public:
00021 PrivateData():
00022 position(0.0),
00023 borderDistance(-1),
00024 scaleDivFromAxis(true),
00025 scaleDraw(new QwtScaleDraw())
00026 {
00027 }
00028
00029 ~PrivateData()
00030 {
00031 delete scaleDraw;
00032 }
00033
00034 #if QT_VERSION < 0x040000
00035 QColorGroup colorGroup;
00036 #else
00037 QPalette palette;
00038 #endif
00039 QFont font;
00040 double position;
00041 int borderDistance;
00042 bool scaleDivFromAxis;
00043 QwtScaleDraw *scaleDraw;
00044 QRect canvasRectCache;
00045 };
00046
00058 QwtPlotScaleItem::QwtPlotScaleItem(
00059 QwtScaleDraw::Alignment alignment, const double pos):
00060 QwtPlotItem(QwtText("Scale"))
00061 {
00062 d_data = new PrivateData;
00063 d_data->position = pos;
00064 d_data->scaleDraw->setAlignment(alignment);
00065
00066 setZ(11.0);
00067 }
00068
00070 QwtPlotScaleItem::~QwtPlotScaleItem()
00071 {
00072 delete d_data;
00073 }
00074
00076 int QwtPlotScaleItem::rtti() const
00077 {
00078 return QwtPlotItem::Rtti_PlotScale;
00079 }
00080
00090 void QwtPlotScaleItem::setScaleDiv(const QwtScaleDiv& scaleDiv)
00091 {
00092 d_data->scaleDivFromAxis = false;
00093 d_data->scaleDraw->setScaleDiv(scaleDiv);
00094 }
00095
00097 const QwtScaleDiv& QwtPlotScaleItem::scaleDiv() const
00098 {
00099 return d_data->scaleDraw->scaleDiv();
00100 }
00101
00109 void QwtPlotScaleItem::setScaleDivFromAxis(bool on)
00110 {
00111 if ( on != d_data->scaleDivFromAxis )
00112 {
00113 d_data->scaleDivFromAxis = on;
00114 if ( on )
00115 {
00116 const QwtPlot *plt = plot();
00117 if ( plt )
00118 {
00119 updateScaleDiv( *plt->axisScaleDiv(xAxis()),
00120 *plt->axisScaleDiv(yAxis()) );
00121 itemChanged();
00122 }
00123 }
00124 }
00125 }
00126
00132 bool QwtPlotScaleItem::isScaleDivFromAxis() const
00133 {
00134 return d_data->scaleDivFromAxis;
00135 }
00136
00137 #if QT_VERSION < 0x040000
00138
00143 void QwtPlotScaleItem::setColorGroup(const QColorGroup &colorGroup)
00144 {
00145 if ( colorGroup != d_data->colorGroup )
00146 {
00147 d_data->colorGroup = colorGroup;
00148 itemChanged();
00149 }
00150 }
00151
00156 QColorGroup QwtPlotScaleItem::colorGroup() const
00157 {
00158 return d_data->colorGroup;
00159 }
00160
00161 #else
00162
00167 void QwtPlotScaleItem::setPalette(const QPalette &palette)
00168 {
00169 if ( palette != d_data->palette )
00170 {
00171 d_data->palette = palette;
00172 itemChanged();
00173 }
00174 }
00175
00180 QPalette QwtPlotScaleItem::palette() const
00181 {
00182 return d_data->palette;
00183 }
00184
00185 #endif
00186
00191 void QwtPlotScaleItem::setFont(const QFont &font)
00192 {
00193 if ( font != d_data->font )
00194 {
00195 d_data->font = font;
00196 itemChanged();
00197 }
00198 }
00199
00204 QFont QwtPlotScaleItem::font() const
00205 {
00206 return d_data->font;
00207 }
00208
00220 void QwtPlotScaleItem::setScaleDraw(QwtScaleDraw *scaleDraw)
00221 {
00222 if ( scaleDraw == NULL )
00223 return;
00224
00225 if ( scaleDraw != d_data->scaleDraw )
00226 delete d_data->scaleDraw;
00227
00228 d_data->scaleDraw = scaleDraw;
00229
00230 const QwtPlot *plt = plot();
00231 if ( plt )
00232 {
00233 updateScaleDiv( *plt->axisScaleDiv(xAxis()),
00234 *plt->axisScaleDiv(yAxis()) );
00235 }
00236
00237 itemChanged();
00238 }
00239
00244 const QwtScaleDraw *QwtPlotScaleItem::scaleDraw() const
00245 {
00246 return d_data->scaleDraw;
00247 }
00248
00253 QwtScaleDraw *QwtPlotScaleItem::scaleDraw()
00254 {
00255 return d_data->scaleDraw;
00256 }
00257
00269 void QwtPlotScaleItem::setPosition(double pos)
00270 {
00271 if ( d_data->position != pos )
00272 {
00273 d_data->position = pos;
00274 d_data->borderDistance = -1;
00275 itemChanged();
00276 }
00277 }
00278
00283 double QwtPlotScaleItem::position() const
00284 {
00285 return d_data->position;
00286 }
00287
00304 void QwtPlotScaleItem::setBorderDistance(int distance)
00305 {
00306 if ( distance < 0 )
00307 distance = -1;
00308
00309 if ( distance != d_data->borderDistance )
00310 {
00311 d_data->borderDistance = distance;
00312 itemChanged();
00313 }
00314 }
00315
00320 int QwtPlotScaleItem::borderDistance() const
00321 {
00322 return d_data->borderDistance;
00323 }
00324
00341 void QwtPlotScaleItem::setAlignment(QwtScaleDraw::Alignment alignment)
00342 {
00343 QwtScaleDraw *sd = d_data->scaleDraw;
00344 if ( sd->alignment() != alignment )
00345 {
00346 sd->setAlignment(alignment);
00347 itemChanged();
00348 }
00349 }
00350
00354 void QwtPlotScaleItem::draw(QPainter *painter,
00355 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00356 const QRect &canvasRect) const
00357 {
00358 if ( canvasRect != d_data->canvasRectCache )
00359 {
00360 QwtPlotScaleItem* that = (QwtPlotScaleItem*)this;
00361 that->updateBorders();
00362 }
00363
00364 QPen pen = painter->pen();
00365 pen.setStyle(Qt::SolidLine);
00366 painter->setPen(pen);
00367
00368 int pw = painter->pen().width();
00369 if ( pw == 0 )
00370 pw = 1;
00371
00372 QwtScaleDraw *sd = d_data->scaleDraw;
00373 if ( sd->orientation() == Qt::Horizontal )
00374 {
00375 int y;
00376 if ( d_data->borderDistance >= 0 )
00377 {
00378 if ( sd->alignment() == QwtScaleDraw::BottomScale )
00379 y = canvasRect.top() + d_data->borderDistance;
00380 else
00381 {
00382 y = canvasRect.bottom() - d_data->borderDistance - pw + 1;
00383 }
00384
00385 }
00386 else
00387 {
00388 y = yMap.transform(d_data->position);
00389 }
00390
00391 if ( y < canvasRect.top() || y > canvasRect.bottom() )
00392 return;
00393
00394 sd->move(canvasRect.left(), y);
00395 sd->setLength(canvasRect.width() - 1);
00396 sd->setTransformation(xMap.transformation()->copy());
00397 }
00398 else
00399 {
00400 int x;
00401 if ( d_data->borderDistance >= 0 )
00402 {
00403 if ( sd->alignment() == QwtScaleDraw::RightScale )
00404 x = canvasRect.left() + d_data->borderDistance;
00405 else
00406 {
00407 x = canvasRect.right() - d_data->borderDistance - pw + 1;
00408 }
00409 }
00410 else
00411 {
00412 x = xMap.transform(d_data->position);
00413 }
00414 if ( x < canvasRect.left() || x > canvasRect.right() )
00415 return;
00416
00417 sd->move(x, canvasRect.top());
00418 sd->setLength(canvasRect.height() - 1);
00419 sd->setTransformation(yMap.transformation()->copy());
00420 }
00421
00422 painter->setFont(d_data->font);
00423
00424 #if QT_VERSION < 0x040000
00425 sd->draw(painter, d_data->colorGroup);
00426 #else
00427 sd->draw(painter, d_data->palette);
00428 #endif
00429
00430 }
00431
00444 void QwtPlotScaleItem::updateScaleDiv(const QwtScaleDiv& xScaleDiv,
00445 const QwtScaleDiv& yScaleDiv)
00446 {
00447 QwtScaleDraw *sd = d_data->scaleDraw;
00448 if ( d_data->scaleDivFromAxis && sd )
00449 {
00450 sd->setScaleDiv(
00451 sd->orientation() == Qt::Horizontal ? xScaleDiv : yScaleDiv);
00452 updateBorders();
00453 }
00454 }
00455
00456 void QwtPlotScaleItem::updateBorders()
00457 {
00458 const QwtPlot *plt = plot();
00459 if ( plt == NULL || !d_data->scaleDivFromAxis )
00460 return;
00461
00462 const QRect r = plt->canvas()->contentsRect();
00463 d_data->canvasRectCache = r;
00464
00465 QwtDoubleInterval interval;
00466 if ( d_data->scaleDraw->orientation() == Qt::Horizontal )
00467 {
00468 const QwtScaleMap map = plt->canvasMap(xAxis());
00469 interval.setMinValue(map.invTransform(r.left()));
00470 interval.setMaxValue(map.invTransform(r.right()));
00471 }
00472 else
00473 {
00474 const QwtScaleMap map = plt->canvasMap(yAxis());
00475 interval.setMinValue(map.invTransform(r.bottom()));
00476 interval.setMaxValue(map.invTransform(r.top()));
00477 }
00478
00479 QwtScaleDiv scaleDiv = d_data->scaleDraw->scaleDiv();
00480 scaleDiv.setInterval(interval);
00481 d_data->scaleDraw->setScaleDiv(scaleDiv);
00482 }