qwt_polar_marker.cpp
Go to the documentation of this file.
1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
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 
20 {
21 public:
23  align( Qt::AlignCenter )
24  {
25  symbol = new QwtSymbol();
26  }
27 
29  {
30  delete symbol;
31  }
32 
34  Qt::Alignment align;
35  QPen pen;
36  const QwtSymbol *symbol;
37 
39 };
40 
43  QwtPolarItem( QwtText( "Marker" ) )
44 {
45  d_data = new PrivateData;
46 
48  setZ( 30.0 );
49 }
50 
53 {
54  delete d_data;
55 }
56 
59 {
61 }
62 
65 {
66  return d_data->pos;
67 }
68 
71 {
72  if ( d_data->pos != pos )
73  {
74  d_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( d_data->pos.radius() );
98  const double a = azimuthMap.transform( d_data->pos.azimuth() );
99 
100  const QPointF pos = qwtPolar2Pos( pole, r, a );
101 
102 
103  // draw symbol
104  QSize sSym( 0, 0 );
105  if ( d_data->symbol->style() != QwtSymbol::NoSymbol )
106  {
107  sSym = d_data->symbol->size();
108  d_data->symbol->drawSymbol( painter, pos );
109  }
110 
111  // draw label
112  if ( !d_data->label.isEmpty() )
113  {
114  int xlw = qMax( int( d_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 ), d_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 ( d_data->align & Qt::AlignTop )
129  dy += tr.y() - ylw1;
130  else if ( d_data->align & Qt::AlignBottom )
131  dy -= tr.y() - ylw1;
132 
133  if ( d_data->align & Qt::AlignLeft )
134  dx += tr.x() - xlw1;
135  else if ( d_data->align & Qt::AlignRight )
136  dx -= tr.x() - xlw1;
137 
138  tr.translate( dx, dy );
139  d_data->label.draw( painter, tr );
140  }
141 }
142 
149 {
150  if ( d_data->symbol != symbol )
151  {
152  delete d_data->symbol;
153  d_data->symbol = symbol;
154  itemChanged();
155  }
156 }
157 
163 {
164  return d_data->symbol;
165 }
166 
173 {
174  if ( label != d_data->label )
175  {
176  d_data->label = label;
177  itemChanged();
178  }
179 }
180 
186 {
187  return d_data->label;
188 }
189 
202 {
203  if ( align == d_data->align )
204  return;
205 
206  d_data->align = align;
207  itemChanged();
208 }
209 
214 Qt::Alignment QwtPolarMarker::labelAlignment() const
215 {
216  return d_data->align;
217 }
218 
229 {
230  const double v = ( scaleId == QwtPolar::ScaleRadius )
231  ? d_data->pos.radius() : d_data->pos.azimuth();
232 
233  return QwtInterval( v, v );
234 }
void setPosition(const QwtPointPolar &)
Change the position of the marker.
Style style() const
Definition: format.h:1173
A point in polar coordinates.
QwtPointPolar position() const
QSizeF textSize() const
Definition: qwt_text.cpp:547
A class representing an interval.
Definition: qwt_interval.h:22
QPoint qwtPolar2Pos(const QPoint &pole, double radius, double angle)
double radius() const
Returns the radius.
virtual ~QwtPolarMarker()
Destructor.
void draw(QPainter *painter, const QRectF &rect) const
Definition: qwt_text.cpp:592
Qt::Alignment labelAlignment() const
A class for drawing symbols.
Definition: qwt_symbol.h:31
double azimuth() const
Returns the azimuth.
Base class for items on a polar plot.
void setLabelAlignment(Qt::Alignment)
Set the alignment of the label.
const QSize & size() const
void * align(std::size_t alignment, std::size_t size, void *&ptr, std::size_t &space, std::size_t &required_space)
Definition: sol.hpp:9768
static const int LabelDist
virtual void draw(QPainter *painter, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double radius, const QRectF &canvasRect) const QWT_OVERRIDE
void setItemAttribute(ItemAttribute, bool on=true)
void setZ(double z)
Set the z value.
bool isEmpty() const
Definition: qwt_text.cpp:716
A class representing a text.
Definition: qwt_text.h:51
void setLabel(const QwtText &)
Set the label.
A scale map.
Definition: qwt_scale_map.h:26
void setSymbol(const QwtSymbol *s)
Assign a symbol.
PrivateData * d_data
QwtText label() const
Radial scale.
Definition: qwt_polar.h:77
virtual int rtti() const QWT_OVERRIDE
const QwtSymbol * symbol() const
double transform(double s) const
virtual void itemChanged()
void drawSymbol(QPainter *, const QRectF &) const
Draw the symbol into a rectangle.
QwtPolarMarker()
Sets alignment to Qt::AlignCenter, and style to NoLine.
virtual QwtInterval boundingInterval(int scaleId) const QWT_OVERRIDE
No Style. The symbol cannot be drawn.
Definition: qwt_symbol.h:41


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:48:10