source: ntrip/trunk/BNC/qwt/qwt_plot_picker.cpp@ 8888

Last change on this file since 8888 was 8127, checked in by stoecker, 8 years ago

update qwt and qwtpolar, many QT5 fixes (unfinished)

File size: 8.9 KB
RevLine 
[4271]1/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2 * Qwt Widget Library
3 * Copyright (C) 1997 Josef Wilgen
4 * Copyright (C) 2002 Uwe Rathmann
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the Qwt License, Version 1.0
8 *****************************************************************************/
9
10#include "qwt_plot_picker.h"
11#include "qwt_plot.h"
12#include "qwt_scale_div.h"
13#include "qwt_painter.h"
14#include "qwt_scale_map.h"
15#include "qwt_picker_machine.h"
16
17/*!
18 \brief Create a plot picker
19
20 The picker is set to those x- and y-axis of the plot
21 that are enabled. If both or no x-axis are enabled, the picker
22 is set to QwtPlot::xBottom. If both or no y-axis are
23 enabled, it is set to QwtPlot::yLeft.
24
25 \param canvas Plot canvas to observe, also the parent object
26
27 \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
28*/
29
[8127]30QwtPlotPicker::QwtPlotPicker( QWidget *canvas ):
[4271]31 QwtPicker( canvas ),
32 d_xAxis( -1 ),
33 d_yAxis( -1 )
34{
35 if ( !canvas )
36 return;
37
38 // attach axes
39
40 int xAxis = QwtPlot::xBottom;
41
42 const QwtPlot *plot = QwtPlotPicker::plot();
43 if ( !plot->axisEnabled( QwtPlot::xBottom ) &&
44 plot->axisEnabled( QwtPlot::xTop ) )
45 {
46 xAxis = QwtPlot::xTop;
47 }
48
49 int yAxis = QwtPlot::yLeft;
50 if ( !plot->axisEnabled( QwtPlot::yLeft ) &&
51 plot->axisEnabled( QwtPlot::yRight ) )
52 {
53 yAxis = QwtPlot::yRight;
54 }
55
56 setAxis( xAxis, yAxis );
57}
58
59/*!
60 Create a plot picker
61
62 \param xAxis Set the x axis of the picker
63 \param yAxis Set the y axis of the picker
64 \param canvas Plot canvas to observe, also the parent object
65
66 \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
67*/
[8127]68QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis, QWidget *canvas ):
[4271]69 QwtPicker( canvas ),
70 d_xAxis( xAxis ),
71 d_yAxis( yAxis )
72{
73}
74
75/*!
76 Create a plot picker
77
78 \param xAxis X axis of the picker
79 \param yAxis Y axis of the picker
[8127]80 \param rubberBand Rubber band style
[4271]81 \param trackerMode Tracker mode
82 \param canvas Plot canvas to observe, also the parent object
83
84 \sa QwtPicker, QwtPicker::setSelectionFlags(), QwtPicker::setRubberBand(),
85 QwtPicker::setTrackerMode
86
87 \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
88*/
89QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis,
90 RubberBand rubberBand, DisplayMode trackerMode,
[8127]91 QWidget *canvas ):
[4271]92 QwtPicker( rubberBand, trackerMode, canvas ),
93 d_xAxis( xAxis ),
94 d_yAxis( yAxis )
95{
96}
97
98//! Destructor
99QwtPlotPicker::~QwtPlotPicker()
100{
101}
102
[8127]103//! \return Observed plot canvas
104QWidget *QwtPlotPicker::canvas()
[4271]105{
[8127]106 return parentWidget();
[4271]107}
108
[8127]109//! \return Observed plot canvas
110const QWidget *QwtPlotPicker::canvas() const
[4271]111{
[8127]112 return parentWidget();
[4271]113}
114
[8127]115//! \return Plot widget, containing the observed plot canvas
[4271]116QwtPlot *QwtPlotPicker::plot()
117{
[8127]118 QWidget *w = canvas();
[4271]119 if ( w )
[8127]120 w = w->parentWidget();
[4271]121
[8127]122 return qobject_cast<QwtPlot *>( w );
[4271]123}
124
[8127]125//! \return Plot widget, containing the observed plot canvas
[4271]126const QwtPlot *QwtPlotPicker::plot() const
127{
[8127]128 const QWidget *w = canvas();
[4271]129 if ( w )
[8127]130 w = w->parentWidget();
[4271]131
[8127]132 return qobject_cast<const QwtPlot *>( w );
[4271]133}
134
135/*!
[8127]136 \return Normalized bounding rectangle of the axes
[4271]137 \sa QwtPlot::autoReplot(), QwtPlot::replot().
138*/
139QRectF QwtPlotPicker::scaleRect() const
140{
141 QRectF rect;
142
143 if ( plot() )
144 {
[8127]145 const QwtScaleDiv &xs = plot()->axisScaleDiv( xAxis() );
146 const QwtScaleDiv &ys = plot()->axisScaleDiv( yAxis() );
[4271]147
[8127]148 rect = QRectF( xs.lowerBound(), ys.lowerBound(),
149 xs.range(), ys.range() );
150 rect = rect.normalized();
[4271]151 }
152
153 return rect;
154}
155
156/*!
157 Set the x and y axes of the picker
158
159 \param xAxis X axis
160 \param yAxis Y axis
161*/
162void QwtPlotPicker::setAxis( int xAxis, int yAxis )
163{
164 const QwtPlot *plt = plot();
165 if ( !plt )
166 return;
167
168 if ( xAxis != d_xAxis || yAxis != d_yAxis )
169 {
170 d_xAxis = xAxis;
171 d_yAxis = yAxis;
172 }
173}
174
175//! Return x axis
176int QwtPlotPicker::xAxis() const
177{
178 return d_xAxis;
179}
180
181//! Return y axis
182int QwtPlotPicker::yAxis() const
183{
184 return d_yAxis;
185}
186
187/*!
188 Translate a pixel position into a position string
189
190 \param pos Position in pixel coordinates
191 \return Position string
192*/
193QwtText QwtPlotPicker::trackerText( const QPoint &pos ) const
194{
195 return trackerTextF( invTransform( pos ) );
196}
197
198/*!
199 \brief Translate a position into a position string
200
201 In case of HLineRubberBand the label is the value of the
202 y position, in case of VLineRubberBand the value of the x position.
203 Otherwise the label contains x and y position separated by a ',' .
204
205 The format for the double to string conversion is "%.4f".
206
207 \param pos Position
208 \return Position string
209*/
210QwtText QwtPlotPicker::trackerTextF( const QPointF &pos ) const
211{
212 QString text;
213
214 switch ( rubberBand() )
215 {
216 case HLineRubberBand:
217 text.sprintf( "%.4f", pos.y() );
218 break;
219 case VLineRubberBand:
220 text.sprintf( "%.4f", pos.x() );
221 break;
222 default:
223 text.sprintf( "%.4f, %.4f", pos.x(), pos.y() );
224 }
225 return QwtText( text );
226}
227
228/*!
[8127]229 Append a point to the selection and update rubber band and tracker.
[4271]230
231 \param pos Additional point
232 \sa isActive, begin(), end(), move(), appended()
233
234 \note The appended(const QPoint &), appended(const QDoublePoint &)
235 signals are emitted.
236*/
237void QwtPlotPicker::append( const QPoint &pos )
238{
239 QwtPicker::append( pos );
240 Q_EMIT appended( invTransform( pos ) );
241}
242
243/*!
244 Move the last point of the selection
245
246 \param pos New position
247 \sa isActive, begin(), end(), append()
248
249 \note The moved(const QPoint &), moved(const QDoublePoint &)
250 signals are emitted.
251*/
252void QwtPlotPicker::move( const QPoint &pos )
253{
254 QwtPicker::move( pos );
255 Q_EMIT moved( invTransform( pos ) );
256}
257
258/*!
259 Close a selection setting the state to inactive.
260
261 \param ok If true, complete the selection and emit selected signals
262 otherwise discard the selection.
[8127]263 \return True if the selection has been accepted, false otherwise
[4271]264*/
265
266bool QwtPlotPicker::end( bool ok )
267{
268 ok = QwtPicker::end( ok );
269 if ( !ok )
270 return false;
271
272 QwtPlot *plot = QwtPlotPicker::plot();
273 if ( !plot )
274 return false;
275
[8127]276 const QPolygon points = selection();
277 if ( points.count() == 0 )
[4271]278 return false;
279
280 QwtPickerMachine::SelectionType selectionType =
281 QwtPickerMachine::NoSelection;
282
283 if ( stateMachine() )
284 selectionType = stateMachine()->selectionType();
285
286 switch ( selectionType )
287 {
288 case QwtPickerMachine::PointSelection:
289 {
[8127]290 const QPointF pos = invTransform( points.first() );
[4271]291 Q_EMIT selected( pos );
292 break;
293 }
294 case QwtPickerMachine::RectSelection:
295 {
[8127]296 if ( points.count() >= 2 )
[4271]297 {
[8127]298 const QPoint p1 = points.first();
299 const QPoint p2 = points.last();
[4271]300
301 const QRect rect = QRect( p1, p2 ).normalized();
302 Q_EMIT selected( invTransform( rect ) );
303 }
304 break;
305 }
306 case QwtPickerMachine::PolygonSelection:
307 {
[8127]308 QVector<QPointF> dpa( points.count() );
309 for ( int i = 0; i < points.count(); i++ )
310 dpa[i] = invTransform( points[i] );
[4271]311
312 Q_EMIT selected( dpa );
313 }
314 default:
315 break;
316 }
317
318 return true;
319}
320
321/*!
322 Translate a rectangle from pixel into plot coordinates
323
324 \return Rectangle in plot coordinates
325 \sa transform()
326*/
327QRectF QwtPlotPicker::invTransform( const QRect &rect ) const
328{
329 const QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
330 const QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
331
332 return QwtScaleMap::invTransform( xMap, yMap, rect );
333}
334
335/*!
336 Translate a rectangle from plot into pixel coordinates
337 \return Rectangle in pixel coordinates
338 \sa invTransform()
339*/
340QRect QwtPlotPicker::transform( const QRectF &rect ) const
341{
342 const QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
343 const QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
344
345 return QwtScaleMap::transform( xMap, yMap, rect ).toRect();
346}
347
348/*!
349 Translate a point from pixel into plot coordinates
350 \return Point in plot coordinates
351 \sa transform()
352*/
353QPointF QwtPlotPicker::invTransform( const QPoint &pos ) const
354{
355 QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
356 QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
357
358 return QPointF(
359 xMap.invTransform( pos.x() ),
360 yMap.invTransform( pos.y() )
361 );
362}
363
364/*!
365 Translate a point from plot into pixel coordinates
366 \return Point in pixel coordinates
367 \sa invTransform()
368*/
369QPoint QwtPlotPicker::transform( const QPointF &pos ) const
370{
371 QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
372 QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
373
374 const QPointF p( xMap.transform( pos.x() ),
375 yMap.transform( pos.y() ) );
376
377 return p.toPoint();
378}
Note: See TracBrowser for help on using the repository browser.