Qwt User's Guide: qwt_polar_marker.cpp Source File

Qwt User's Guide 6.2.0

qwt_polar_marker.cpp
1 /******************************************************************************
2 * QwtPolar Widget Library
3 * Copyright (C) 2008 Uwe Rathmann
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the Qwt License, Version 1.0
7 *****************************************************************************/
8
9 #include "qwt_polar_marker.h"
10 #include "qwt_polar.h"
11 #include "qwt_scale_map.h"
12 #include "qwt_symbol.h"
13 #include "qwt_text.h"
14
15 #include <qpainter.h>
16
17 static const int LabelDist = 2;
18
19 class QwtPolarMarker::PrivateData
20 {
21 public:
22 PrivateData()
23 : align( Qt::AlignCenter )
24 {
25 symbol = new QwtSymbol();
26 }
27
28 ~PrivateData()
29 {
30 delete symbol;
31 }
32
33 QwtText label;
34 Qt::Alignment align;
35 QPen pen;
36 const QwtSymbol* symbol;
37
38 QwtPointPolar pos;
39 };
40
42 QwtPolarMarker::QwtPolarMarker()
43 : QwtPolarItem( QwtText( "Marker" ) )
44 {
45 m_data = new PrivateData;
46
47 setItemAttribute( QwtPolarItem::AutoScale );
48 setZ( 30.0 );
49 }
50
52 QwtPolarMarker::~QwtPolarMarker()
53 {
54 delete m_data;
55 }
56
58 int QwtPolarMarker::rtti() const
59 {
60 return QwtPolarItem::Rtti_PolarMarker;
61 }
62
64 QwtPointPolar QwtPolarMarker::position() const
65 {
66 return m_data->pos;
67 }
68
70 void QwtPolarMarker::setPosition( const QwtPointPolar& pos )
71 {
72 if ( m_data->pos != pos )
73 {
74 m_data->pos = pos;
75 itemChanged();
76 }
77 }
78
89 void QwtPolarMarker::draw( QPainter* painter,
90 const QwtScaleMap& azimuthMap, const QwtScaleMap& radialMap,
91 const QPointF& pole, double radius,
92 const QRectF& canvasRect ) const
93 {
94 Q_UNUSED( radius );
95 Q_UNUSED( canvasRect );
96
97 const double r = radialMap.transform( m_data->pos.radius() );
98 const double a = azimuthMap.transform( m_data->pos.azimuth() );
99
100 const QPointF pos = qwtPolar2Pos( pole, r, a );
101
102
103 // draw symbol
104 QSize sSym( 0, 0 );
105 if ( m_data->symbol->style() != QwtSymbol::NoSymbol )
106 {
107 sSym = m_data->symbol->size();
108 m_data->symbol->drawSymbol( painter, pos );
109 }
110
111 // draw label
112 if ( !m_data->label.isEmpty() )
113 {
114 int xlw = qMax( int( m_data->pen.width() ), 1 );
115 int ylw = xlw;
116
117 int xlw1 = qMax( ( xlw + 1 ) / 2, ( sSym.width() + 1 ) / 2 ) + LabelDist;
118 xlw = qMax( xlw / 2, ( sSym.width() + 1 ) / 2 ) + LabelDist;
119 int ylw1 = qMax( ( ylw + 1 ) / 2, ( sSym.height() + 1 ) / 2 ) + LabelDist;
120 ylw = qMax( ylw / 2, ( sSym.height() + 1 ) / 2 ) + LabelDist;
121
122 QRect tr( QPoint( 0, 0 ), m_data->label.textSize( painter->font() ).toSize() );
123 tr.moveCenter( QPoint( 0, 0 ) );
124
125 int dx = pos.x();
126 int dy = pos.y();
127
128 if ( m_data->align & Qt::AlignTop )
129 dy += tr.y() - ylw1;
130 else if ( m_data->align & Qt::AlignBottom )
131 dy -= tr.y() - ylw1;
132
133 if ( m_data->align & Qt::AlignLeft )
134 dx += tr.x() - xlw1;
135 else if ( m_data->align & Qt::AlignRight )
136 dx -= tr.x() - xlw1;
137
138 tr.translate( dx, dy );
139 m_data->label.draw( painter, tr );
140 }
141 }
142
148 void QwtPolarMarker::setSymbol( const QwtSymbol* symbol )
149 {
150 if ( m_data->symbol != symbol )
151 {
152 delete m_data->symbol;
153 m_data->symbol = symbol;
154 itemChanged();
155 }
156 }
157
162 const QwtSymbol* QwtPolarMarker::symbol() const
163 {
164 return m_data->symbol;
165 }
166
172 void QwtPolarMarker::setLabel( const QwtText& label )
173 {
174 if ( label != m_data->label )
175 {
176 m_data->label = label;
177 itemChanged();
178 }
179 }
180
185 QwtText QwtPolarMarker::label() const
186 {
187 return m_data->label;
188 }
189
201 void QwtPolarMarker::setLabelAlignment( Qt::Alignment align )
202 {
203 if ( align == m_data->align )
204 return;
205
206 m_data->align = align;
207 itemChanged();
208 }
209
214 Qt::Alignment QwtPolarMarker::labelAlignment() const
215 {
216 return m_data->align;
217 }
218
228 QwtInterval QwtPolarMarker::boundingInterval( int scaleId ) const
229 {
230 const double v = ( scaleId == QwtPolar::ScaleRadius )
231 ? m_data->pos.radius() : m_data->pos.azimuth();
232
233 return QwtInterval( v, v );
234 }
QwtInterval
A class representing an interval.
Definition: qwt_interval.h:23
QwtPointPolar
A point in polar coordinates.
Definition: qwt_point_polar.h:29
QwtPolarItem
Base class for items on a polar plot.
Definition: qwt_polar_item.h:38
QwtPolarItem::itemChanged
virtual void itemChanged()
Definition: qwt_polar_item.cpp:355
QwtPolarItem::AutoScale
@ AutoScale
Definition: qwt_polar_item.h:83
QwtPolarItem::Rtti_PolarMarker
@ Rtti_PolarMarker
For QwtPolarMarker.
Definition: qwt_polar_item.h:55
QwtPolarItem::setItemAttribute
void setItemAttribute(ItemAttribute, bool on=true)
Definition: qwt_polar_item.cpp:201
QwtPolarItem::setZ
void setZ(double z)
Set the z value.
Definition: qwt_polar_item.cpp:142
QwtPolarMarker::~QwtPolarMarker
virtual ~QwtPolarMarker()
Destructor.
Definition: qwt_polar_marker.cpp:52
QwtPolarMarker::rtti
virtual int rtti() const override
Definition: qwt_polar_marker.cpp:58
QwtPolarMarker::setLabelAlignment
void setLabelAlignment(Qt::Alignment)
Set the alignment of the label.
Definition: qwt_polar_marker.cpp:201
QwtPolarMarker::setSymbol
void setSymbol(const QwtSymbol *s)
Assign a symbol.
Definition: qwt_polar_marker.cpp:148
QwtPolarMarker::setLabel
void setLabel(const QwtText &)
Set the label.
Definition: qwt_polar_marker.cpp:172
QwtPolarMarker::boundingInterval
virtual QwtInterval boundingInterval(int scaleId) const override
Definition: qwt_polar_marker.cpp:228
QwtPolarMarker::position
QwtPointPolar position() const
Definition: qwt_polar_marker.cpp:64
QwtPolarMarker::labelAlignment
Qt::Alignment labelAlignment() const
Definition: qwt_polar_marker.cpp:214
QwtPolarMarker::setPosition
void setPosition(const QwtPointPolar &)
Change the position of the marker.
Definition: qwt_polar_marker.cpp:70
QwtPolarMarker::QwtPolarMarker
QwtPolarMarker()
Sets alignment to Qt::AlignCenter, and style to NoLine.
Definition: qwt_polar_marker.cpp:42
QwtPolarMarker::draw
virtual void draw(QPainter *painter, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double radius, const QRectF &canvasRect) const override
Definition: qwt_polar_marker.cpp:89
QwtPolarMarker::symbol
const QwtSymbol * symbol() const
Definition: qwt_polar_marker.cpp:162
QwtPolarMarker::label
QwtText label() const
Definition: qwt_polar_marker.cpp:185
QwtScaleMap
A scale map.
Definition: qwt_scale_map.h:27
QwtScaleMap::transform
double transform(double s) const
Definition: qwt_scale_map.h:137
QwtSymbol
A class for drawing symbols.
Definition: qwt_symbol.h:32
QwtSymbol::NoSymbol
@ NoSymbol
No Style. The symbol cannot be drawn.
Definition: qwt_symbol.h:41
QwtText
A class representing a text.
Definition: qwt_text.h:52