Qwt User's Guide 6.3.0
Loading...
Searching...
No Matches
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
17static const int LabelDist = 2;
18
19class 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
43 : QwtPolarItem( QwtText( "Marker" ) )
44{
45 m_data = new PrivateData;
46
48 setZ( 30.0 );
49}
50
53{
54 delete m_data;
55}
56
62
65{
66 return m_data->pos;
67}
68
71{
72 if ( m_data->pos != pos )
73 {
74 m_data->pos = pos;
76 }
77}
78
89void 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
149{
150 if ( m_data->symbol != symbol )
151 {
152 delete m_data->symbol;
153 m_data->symbol = symbol;
154 itemChanged();
155 }
156}
157
163{
164 return m_data->symbol;
165}
166
173{
174 if ( label != m_data->label )
175 {
176 m_data->label = label;
177 itemChanged();
178 }
179}
180
186{
187 return m_data->label;
188}
189
201void QwtPolarMarker::setLabelAlignment( Qt::Alignment align )
202{
203 if ( align == m_data->align )
204 return;
205
206 m_data->align = align;
207 itemChanged();
208}
209
215{
216 return m_data->align;
217}
218
229{
230 const double v = ( scaleId == QwtPolar::ScaleRadius )
231 ? m_data->pos.radius() : m_data->pos.azimuth();
232
233 return QwtInterval( v, v );
234}
A class representing an interval.
A point in polar coordinates.
double radius() const
Returns the radius.
double azimuth() const
Returns the azimuth.
Base class for items on a polar plot.
virtual void itemChanged()
@ Rtti_PolarMarker
For QwtPolarMarker.
void setItemAttribute(ItemAttribute, bool on=true)
void setZ(double z)
Set the z value.
virtual ~QwtPolarMarker()
Destructor.
virtual int rtti() const override
void setLabelAlignment(Qt::Alignment)
Set the alignment of the label.
void setSymbol(const QwtSymbol *s)
Assign a symbol.
void setLabel(const QwtText &)
Set the label.
virtual QwtInterval boundingInterval(int scaleId) const override
QwtPointPolar position() const
Qt::Alignment labelAlignment() const
void setPosition(const QwtPointPolar &)
Change the position of the marker.
QwtPolarMarker()
Sets alignment to Qt::AlignCenter, and style to NoLine.
virtual void draw(QPainter *painter, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double radius, const QRectF &canvasRect) const override
const QwtSymbol * symbol() const
QwtText label() const
A scale map.
double transform(double s) const
A class for drawing symbols.
Definition qwt_symbol.h:32
Style style() const
void drawSymbol(QPainter *, const QRectF &) const
Draw the symbol into a rectangle.
@ NoSymbol
No Style. The symbol cannot be drawn.
Definition qwt_symbol.h:41
const QSize & size() const
A class representing a text.
Definition qwt_text.h:52
QSizeF textSize() const
Definition qwt_text.cpp:570
bool isEmpty() const
Definition qwt_text.cpp:739
void draw(QPainter *painter, const QRectF &rect) const
Definition qwt_text.cpp:615