qwt_plot_scaleitem.cpp
Go to the documentation of this file.
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_plot_scaleitem.h"
00011 #include "qwt_plot.h"
00012 #include "qwt_scale_map.h"
00013 #include "qwt_interval.h"
00014 #include <qpalette.h>
00015 #include <qpainter.h>
00016 
00017 class QwtPlotScaleItem::PrivateData
00018 {
00019 public:
00020     PrivateData():
00021         position( 0.0 ),
00022         borderDistance( -1 ),
00023         scaleDivFromAxis( true ),
00024         scaleDraw( new QwtScaleDraw() )
00025     {
00026     }
00027 
00028     ~PrivateData()
00029     {
00030         delete scaleDraw;
00031     }
00032 
00033     QwtInterval scaleInterval( const QRectF &,
00034         const QwtScaleMap &, const QwtScaleMap & ) const;
00035 
00036     QPalette palette;
00037     QFont font;
00038     double position;
00039     int borderDistance;
00040     bool scaleDivFromAxis;
00041     QwtScaleDraw *scaleDraw;
00042 };
00043 
00044 QwtInterval QwtPlotScaleItem::PrivateData::scaleInterval( const QRectF &canvasRect,
00045     const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const
00046 {
00047     QwtInterval interval;
00048     if ( scaleDraw->orientation() == Qt::Horizontal )
00049     {
00050         interval.setMinValue( xMap.invTransform( canvasRect.left() ) );
00051         interval.setMaxValue( xMap.invTransform( canvasRect.right() - 1 ) );
00052     }
00053     else
00054     {
00055         interval.setMinValue( yMap.invTransform( canvasRect.bottom() - 1 ) );
00056         interval.setMaxValue( yMap.invTransform( canvasRect.top() ) );
00057     }
00058 
00059     return interval;
00060 }
00061 
00073 QwtPlotScaleItem::QwtPlotScaleItem(
00074         QwtScaleDraw::Alignment alignment, const double pos ):
00075     QwtPlotItem( QwtText( "Scale" ) )
00076 {
00077     d_data = new PrivateData;
00078     d_data->position = pos;
00079     d_data->scaleDraw->setAlignment( alignment );
00080 
00081     setItemInterest( QwtPlotItem::ScaleInterest, true );
00082     setZ( 11.0 );
00083 }
00084 
00086 QwtPlotScaleItem::~QwtPlotScaleItem()
00087 {
00088     delete d_data;
00089 }
00090 
00092 int QwtPlotScaleItem::rtti() const
00093 {
00094     return QwtPlotItem::Rtti_PlotScale;
00095 }
00096 
00106 void QwtPlotScaleItem::setScaleDiv( const QwtScaleDiv& scaleDiv )
00107 {
00108     d_data->scaleDivFromAxis = false;
00109     d_data->scaleDraw->setScaleDiv( scaleDiv );
00110 }
00111 
00113 const QwtScaleDiv& QwtPlotScaleItem::scaleDiv() const
00114 {
00115     return d_data->scaleDraw->scaleDiv();
00116 }
00117 
00125 void QwtPlotScaleItem::setScaleDivFromAxis( bool on )
00126 {
00127     if ( on != d_data->scaleDivFromAxis )
00128     {
00129         d_data->scaleDivFromAxis = on;
00130         if ( on )
00131         {
00132             const QwtPlot *plt = plot();
00133             if ( plt )
00134             {
00135                 updateScaleDiv( plt->axisScaleDiv( xAxis() ),
00136                     plt->axisScaleDiv( yAxis() ) );
00137                 itemChanged();
00138             }
00139         }
00140     }
00141 }
00142 
00148 bool QwtPlotScaleItem::isScaleDivFromAxis() const
00149 {
00150     return d_data->scaleDivFromAxis;
00151 }
00152 
00157 void QwtPlotScaleItem::setPalette( const QPalette &palette )
00158 {
00159     if ( palette != d_data->palette )
00160     {
00161         d_data->palette = palette;
00162 
00163         legendChanged();
00164         itemChanged();
00165     }
00166 }
00167 
00172 QPalette QwtPlotScaleItem::palette() const
00173 {
00174     return d_data->palette;
00175 }
00176 
00181 void QwtPlotScaleItem::setFont( const QFont &font )
00182 {
00183     if ( font != d_data->font )
00184     {
00185         d_data->font = font;
00186         itemChanged();
00187     }
00188 }
00189 
00194 QFont QwtPlotScaleItem::font() const
00195 {
00196     return d_data->font;
00197 }
00198 
00210 void QwtPlotScaleItem::setScaleDraw( QwtScaleDraw *scaleDraw )
00211 {
00212     if ( scaleDraw == NULL )
00213         return;
00214 
00215     if ( scaleDraw != d_data->scaleDraw )
00216         delete d_data->scaleDraw;
00217 
00218     d_data->scaleDraw = scaleDraw;
00219 
00220     const QwtPlot *plt = plot();
00221     if ( plt )
00222     {
00223         updateScaleDiv( plt->axisScaleDiv( xAxis() ),
00224             plt->axisScaleDiv( yAxis() ) );
00225     }
00226 
00227     itemChanged();
00228 }
00229 
00234 const QwtScaleDraw *QwtPlotScaleItem::scaleDraw() const
00235 {
00236     return d_data->scaleDraw;
00237 }
00238 
00243 QwtScaleDraw *QwtPlotScaleItem::scaleDraw()
00244 {
00245     return d_data->scaleDraw;
00246 }
00247 
00259 void QwtPlotScaleItem::setPosition( double pos )
00260 {
00261     if ( d_data->position != pos )
00262     {
00263         d_data->position = pos;
00264         d_data->borderDistance = -1;
00265         itemChanged();
00266     }
00267 }
00268 
00273 double QwtPlotScaleItem::position() const
00274 {
00275     return d_data->position;
00276 }
00277 
00294 void QwtPlotScaleItem::setBorderDistance( int distance )
00295 {
00296     if ( distance < 0 )
00297         distance = -1;
00298 
00299     if ( distance != d_data->borderDistance )
00300     {
00301         d_data->borderDistance = distance;
00302         itemChanged();
00303     }
00304 }
00305 
00310 int QwtPlotScaleItem::borderDistance() const
00311 {
00312     return d_data->borderDistance;
00313 }
00314 
00331 void QwtPlotScaleItem::setAlignment( QwtScaleDraw::Alignment alignment )
00332 {
00333     QwtScaleDraw *sd = d_data->scaleDraw;
00334     if ( sd->alignment() != alignment )
00335     {
00336         sd->setAlignment( alignment );
00337         itemChanged();
00338     }
00339 }
00340 
00344 void QwtPlotScaleItem::draw( QPainter *painter,
00345     const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00346     const QRectF &canvasRect ) const
00347 {
00348     QwtScaleDraw *sd = d_data->scaleDraw;
00349 
00350     if ( d_data->scaleDivFromAxis )
00351     {
00352         const QwtInterval interval = 
00353             d_data->scaleInterval( canvasRect, xMap, yMap );
00354 
00355         if ( interval != sd->scaleDiv().interval() )
00356         {
00357             QwtScaleDiv scaleDiv = sd->scaleDiv();
00358             scaleDiv.setInterval( interval );
00359             sd->setScaleDiv( scaleDiv );
00360         }
00361     }
00362 
00363     QPen pen = painter->pen();
00364     pen.setStyle( Qt::SolidLine );
00365     painter->setPen( pen );
00366 
00367     if ( sd->orientation() == Qt::Horizontal )
00368     {
00369         double y;
00370         if ( d_data->borderDistance >= 0 )
00371         {
00372             if ( sd->alignment() == QwtScaleDraw::BottomScale )
00373                 y = canvasRect.top() + d_data->borderDistance;
00374             else
00375             {
00376                 y = canvasRect.bottom() - d_data->borderDistance;
00377             }
00378 
00379         }
00380         else
00381         {
00382             y = yMap.transform( d_data->position );
00383         }
00384 
00385         if ( y < canvasRect.top() || y > canvasRect.bottom() )
00386             return;
00387 
00388         sd->move( canvasRect.left(), y );
00389         sd->setLength( canvasRect.width() - 1 );
00390 
00391         QwtTransform *transform = NULL;
00392         if ( xMap.transformation() )
00393             transform = xMap.transformation()->copy();
00394 
00395         sd->setTransformation( transform );
00396     }
00397     else // == Qt::Vertical
00398     {
00399         double x;
00400         if ( d_data->borderDistance >= 0 )
00401         {
00402             if ( sd->alignment() == QwtScaleDraw::RightScale )
00403                 x = canvasRect.left() + d_data->borderDistance;
00404             else
00405             {
00406                 x = canvasRect.right() - d_data->borderDistance;
00407             }
00408         }
00409         else
00410         {
00411             x = xMap.transform( d_data->position );
00412         }
00413         if ( x < canvasRect.left() || x > canvasRect.right() )
00414             return;
00415 
00416         sd->move( x, canvasRect.top() );
00417         sd->setLength( canvasRect.height() - 1 );
00418 
00419         QwtTransform *transform = NULL;
00420         if ( yMap.transformation() )
00421             transform = yMap.transformation()->copy();
00422 
00423         sd->setTransformation( transform );
00424     }
00425 
00426     painter->setFont( d_data->font );
00427 
00428     sd->draw( painter, d_data->palette );
00429 }
00430 
00443 void QwtPlotScaleItem::updateScaleDiv( const QwtScaleDiv& xScaleDiv,
00444     const QwtScaleDiv& yScaleDiv )
00445 {
00446     QwtScaleDraw *scaleDraw = d_data->scaleDraw;
00447 
00448     if ( d_data->scaleDivFromAxis && scaleDraw )
00449     {
00450         const QwtScaleDiv &scaleDiv = 
00451             scaleDraw->orientation() == Qt::Horizontal ? xScaleDiv : yScaleDiv;
00452 
00453         const QwtPlot *plt = plot();
00454         if ( plt != NULL )
00455         {
00456             const QRectF canvasRect = plt->canvas()->contentsRect();
00457 
00458             const QwtInterval interval = d_data->scaleInterval( 
00459                 canvasRect, plt->canvasMap( xAxis() ), plt->canvasMap( yAxis() ) );
00460 
00461             QwtScaleDiv sd = scaleDiv;
00462             sd.setInterval( interval );
00463 
00464             if ( sd != scaleDraw->scaleDiv() )
00465             {
00466                 // the internal label cache of QwtScaleDraw
00467                 // is cleared here, so better avoid pointless
00468                 // assignments.
00469 
00470                 scaleDraw->setScaleDiv( sd );
00471             }
00472         }
00473         else
00474         {
00475             scaleDraw->setScaleDiv( scaleDiv );
00476         }
00477     }
00478 }


plotjuggler
Author(s): Davide Faconti
autogenerated on Fri Sep 1 2017 02:41:56