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:

Generated on Tue Nov 16 21:12:20 2004 for Qwt User's Guide by doxygen 1.3.8