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

# qwt_plot_picker.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 "qwt_plot.h"
    00013 #include "qwt_double_rect.h"
    00014 #include "qwt_painter.h"
    00015 #include "qwt_array.h"
    00016 #include "qwt_plot_picker.h"
    00017
    00038 QwtPlotPicker::QwtPlotPicker(QwtPlotCanvas *canvas, const char *name):
    00039     QwtPicker(canvas, name),
    00040     d_xAxis(-1),
    00041     d_yAxis(-1)
    00042 {
    00043     if ( !canvas )
    00044         return;
    00045
    00046     // attach axes
    00047
    00048     int xAxis = QwtPlot::xBottom;
    00049
    00050     const QwtPlot *plot = QwtPlotPicker::plot();
    00051     if ( !plot->axisEnabled(QwtPlot::xBottom) &&
    00052         plot->axisEnabled(QwtPlot::xTop) )
    00053     {
    00054         xAxis = QwtPlot::xTop;
    00055     }
    00056
    00057     int yAxis = QwtPlot::yLeft;
    00058     if ( !plot->axisEnabled(QwtPlot::yLeft) &&
    00059         plot->axisEnabled(QwtPlot::yRight) )
    00060     {
    00061         yAxis = QwtPlot::yRight;
    00062     }
    00063
    00064     setAxis(xAxis, yAxis);
    00065 }
    00066
    00083 QwtPlotPicker::QwtPlotPicker(int xAxis, int yAxis,
    00084         QwtPlotCanvas *canvas, const char *name):
    00085     QwtPicker(canvas, name),
    00086     d_xAxis(xAxis),
    00087     d_yAxis(yAxis)
    00088 {
    00089 }
    00090
    00114 QwtPlotPicker::QwtPlotPicker(int xAxis, int yAxis, int selectionFlags,
    00115         RubberBand rubberBand, DisplayMode cursorLabelMode,
    00116         QwtPlotCanvas *canvas, const char *name):
    00117     QwtPicker(selectionFlags, rubberBand, cursorLabelMode, canvas, name),
    00118     d_xAxis(xAxis),
    00119     d_yAxis(yAxis)
    00120 {
    00121 }
    00122
    00124 QwtPlotCanvas *QwtPlotPicker::canvas()
    00125 {
    00126     QWidget *w = parentWidget();
    00127     if ( w && w->inherits("QwtPlotCanvas") )
    00128         return (QwtPlotCanvas *)w;
    00129
    00130     return NULL;
    00131 }
    00132
    00134 const QwtPlotCanvas *QwtPlotPicker::canvas() const
    00135 {
    00136     return ((QwtPlotPicker *)this)->canvas();
    00137 }
    00138
    00140 QwtPlot *QwtPlotPicker::plot()
    00141 {
    00142     QObject *w = canvas();
    00143     if ( w )
    00144     {
    00145         w = w->parent();
    00146         if ( w && w->inherits("QwtPlot") )
    00147             return (QwtPlot *)w;
    00148     }
    00149
    00150     return NULL;
    00151 }
    00152
    00154 const QwtPlot *QwtPlotPicker::plot() const
    00155 {
    00156     return ((QwtPlotPicker *)this)->plot();
    00157 }
    00158
    00170 QwtDoubleRect QwtPlotPicker::scaleRect() const
    00171 {
    00172     const QwtPlot *plt = plot();
    00173
    00174     const QwtDoubleRect rect(
    00175         plt->axisScale(xAxis())->lBound(),
    00176         plt->axisScale(xAxis())->hBound(),
    00177         plt->axisScale(yAxis())->lBound(),
    00178         plt->axisScale(yAxis())->hBound()
    00179     );
    00180
    00181     return rect.normalize();
    00182 }
    00183
    00190 void QwtPlotPicker::setAxis(int xAxis, int yAxis)
    00191 {
    00192     const QwtPlot *plt = plot();
    00193     if ( !plt )
    00194         return;
    00195
    00196     if ( xAxis != d_xAxis || yAxis != d_yAxis )
    00197     {
    00198         d_xAxis = xAxis;
    00199         d_yAxis = yAxis;
    00200     }
    00201 }
    00202
    00204 int QwtPlotPicker::xAxis() const
    00205 {
    00206     return d_xAxis;
    00207 }
    00208
    00210 int QwtPlotPicker::yAxis() const
    00211 {
    00212     return d_yAxis;
    00213 }
    00214
    00221 QString QwtPlotPicker::cursorLabel(const QPoint &pos) const
    00222 {
    00223     return cursorLabel(invTransform(pos));
    00224 }
    00225
    00238 QString QwtPlotPicker::cursorLabel(const QwtDoublePoint &pos) const
    00239 {
    00240     switch(rubberBand())
    00241     {
    00242         case HLineRubberBand:
    00243             return QString().sprintf("%.4f", pos.y());
    00244         case VLineRubberBand:
    00245             return QString().sprintf("%.4f", pos.x());
    00246         default:
    00247             return QString().sprintf("%.4f, %.4f", pos.x(), pos.y());
    00248     }
    00249     return QString::null; // make some dumb compilers happy
    00250 }
    00251
    00261 void QwtPlotPicker::append(const QPoint &pos)
    00262 {
    00263     QwtPicker::append(pos);
    00264     emit appended(invTransform(pos));
    00265 }
    00266
    00276 void QwtPlotPicker::move(const QPoint &pos)
    00277 {
    00278     QwtPicker::move(pos);
    00279     emit moved(invTransform(pos));
    00280 }
    00281
    00290 bool QwtPlotPicker::end(bool ok)
    00291 {
    00292     ok = QwtPicker::end(ok);
    00293     if ( !ok )
    00294         return FALSE;
    00295
    00296     QwtPlot *plot = QwtPlotPicker::plot();
    00297     if ( !plot )
    00298         return FALSE;
    00299
    00300     const QPointArray &pa = selection();
    00301     if ( pa.count() == 0 )
    00302         return FALSE;
    00303
    00304     if ( selectionFlags() & PointSelection )
    00305     {
    00306         const QwtDoublePoint pos = invTransform(pa[0]);
    00307         emit selected(pos);
    00308     }
    00309     else if ( (selectionFlags() & RectSelection) && pa.count() >= 2 )
    00310     {
    00311         QPoint p1 = pa[0];
    00312         QPoint p2 = pa[int(pa.count() - 1)];
    00313
    00314         if ( selectionFlags() & CenterToCorner )
    00315         {
    00316             p1.setX(p1.x() - (p2.x() - p1.x()));
    00317             p1.setY(p1.y() - (p2.y() - p1.y()));
    00318         }
    00319         else if ( selectionFlags() & CenterToRadius )
    00320         {
    00321             const int radius = QMAX(QABS(p2.x() - p1.x()),
    00322                 QABS(p2.y() - p1.y()));
    00323             p2.setX(p1.x() + radius);
    00324             p2.setY(p1.y() + radius);
    00325             p1.setX(p1.x() - radius);
    00326             p1.setY(p1.y() - radius);
    00327         }
    00328
    00329         emit selected(invTransform(QRect(p1, p2)).normalize());
    00330     }
    00331     else
    00332     {
    00333         QwtArray<QwtDoublePoint> dpa(pa.count());
    00334         for ( int i = 0; i < int(pa.count()); i++ )
    00335             dpa[i] = invTransform(pa[i]);
    00336
    00337         emit selected(dpa);
    00338     }
    00339
    00340     return TRUE;
    00341 }
    00342
    00349 QwtDoubleRect QwtPlotPicker::invTransform(const QRect &rect) const
    00350 {
    00351     QwtDiMap xMap = plot()->canvasMap(d_xAxis);
    00352     QwtDiMap yMap = plot()->canvasMap(d_yAxis);
    00353
    00354     return QwtDoubleRect(
    00355         xMap.invTransform(rect.left()),
    00356         xMap.invTransform(rect.right()),
    00357         yMap.invTransform(rect.top()),
    00358         yMap.invTransform(rect.bottom())
    00359     );
    00360 }
    00361
    00367 QRect QwtPlotPicker::transform(const QwtDoubleRect &rect) const
    00368 {
    00369     QwtDiMap xMap = plot()->canvasMap(d_xAxis);
    00370     QwtDiMap yMap = plot()->canvasMap(d_yAxis);
    00371
    00372     const int x1 = xMap.transform(rect.x1());
    00373     const int x2 = xMap.transform(rect.x2());
    00374     const int y1 = yMap.transform(rect.y1());
    00375     const int y2 = yMap.transform(rect.y2());
    00376
    00377     return QRect(x1, y1, x2 - x1, y2 - y1);
    00378 }
    00379
    00385 QwtDoublePoint QwtPlotPicker::invTransform(const QPoint &pos) const
    00386 {
    00387     QwtDiMap xMap = plot()->canvasMap(d_xAxis);
    00388     QwtDiMap yMap = plot()->canvasMap(d_yAxis);
    00389
    00390     return QwtDoublePoint(
    00391         xMap.invTransform(pos.x()),
    00392         yMap.invTransform(pos.y())
    00393     );
    00394 }
    00395
    00401 QPoint QwtPlotPicker::transform(const QwtDoublePoint &pos) const
    00402 {
    00403     QwtDiMap xMap = plot()->canvasMap(d_xAxis);
    00404     QwtDiMap yMap = plot()->canvasMap(d_yAxis);
    00405
    00406     return QPoint(
    00407         xMap.transform(pos.x()),
    00408         yMap.transform(pos.y())
    00409     );
    00410 }
    00411
    00412 // Local Variables:
    00413 // mode: C++
    00414 // c-file-style: "stroustrup"
    00415 // indent-tabs-mode: nil
    00416 // End: