Engauge Digitizer  2
PointStyle.cpp
Go to the documentation of this file.
1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5  ******************************************************************************************************/
6 
7 #include "DocumentSerialize.h"
8 #include "EngaugeAssert.h"
9 #include "Logger.h"
10 #include "PointStyle.h"
11 #include <qmath.h>
12 #include <QObject>
13 #include <QSettings>
14 #include <QTextStream>
15 #include <QtToString.h>
16 #include <QXmlStreamWriter>
17 #include "Settings.h"
18 #include "SettingsForGraph.h"
19 #include "Xml.h"
20 
24 const int DEFAULT_POINT_RADIUS = 10;
26 const double PI = 3.1415926535;
27 const double TWO_PI = 2.0 * PI;
28 
30  // Defaults that prevent address sanitizer warnings. Overwritten immediately
31  m_shape (DEFAULT_POINT_SHAPE_AXIS),
32  m_radius (DEFAULT_POINT_RADIUS),
33  m_lineWidth (DEFAULT_POINT_LINE_WIDTH),
34  m_paletteColor (DEFAULT_POINT_COLOR_GRAPH)
35 {
36 }
37 
39  unsigned int radius,
40  int lineWidth,
41  ColorPalette paletteColor) :
42  m_shape (shape),
43  m_radius (radius),
44  m_lineWidth (lineWidth),
45  m_paletteColor (paletteColor)
46 {
47 }
48 
50  m_shape (other.shape()),
51  m_radius (other.radius ()),
52  m_lineWidth (other.lineWidth ()),
53  m_paletteColor (other.paletteColor ())
54 {
55 }
56 
58 {
59  m_shape = other.shape ();
60  m_radius = other.radius ();
61  m_lineWidth = other.lineWidth ();
62  m_paletteColor = other.paletteColor ();
63 
64  return *this;
65 }
66 
68 {
69  // Get settings if available, otherwise use defaults
70  QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
71  settings.beginGroup (SETTINGS_GROUP_CURVE_AXES);
72  PointShape shape = static_cast<PointShape> (settings.value (SETTINGS_CURVE_POINT_SHAPE,
73  DEFAULT_POINT_SHAPE_AXIS).toInt());
74  unsigned int radius = settings.value (SETTINGS_CURVE_POINT_RADIUS,
75  DEFAULT_POINT_RADIUS).toUInt();
76  int pointLineWidth = settings.value (SETTINGS_CURVE_POINT_LINE_WIDTH,
77  DEFAULT_POINT_LINE_WIDTH).toInt();
78  ColorPalette pointColor = static_cast<ColorPalette> (settings.value (SETTINGS_CURVE_POINT_COLOR,
79  DEFAULT_POINT_COLOR_AXES).toInt());
80  settings.endGroup ();
81 
82  return PointStyle (shape,
83  radius,
84  pointLineWidth,
85  pointColor);
86 }
87 
89 {
90  // Shape is always computed on the fly
92  static PointShape pointShapes [] = {POINT_SHAPE_CROSS,
96  shape = pointShapes [index % 4];
97 
98  SettingsForGraph settingsForGraph;
99  int indexOneBased = index + 1;
100  QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
101 
102  // Get settings if available, otherwise use defaults
103  QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
104  settings.beginGroup (groupName);
105  unsigned int radius = settings.value (SETTINGS_CURVE_POINT_RADIUS,
106  DEFAULT_POINT_RADIUS).toUInt();
107  int pointLineWidth = settings.value (SETTINGS_CURVE_POINT_LINE_WIDTH,
108  DEFAULT_POINT_LINE_WIDTH).toInt();
109  ColorPalette pointColor = static_cast<ColorPalette> (settings.value (SETTINGS_CURVE_POINT_COLOR,
110  DEFAULT_POINT_COLOR_GRAPH).toInt());
111  settings.endGroup ();
112 
113  return PointStyle (shape,
114  radius,
115  pointLineWidth,
116  pointColor);
117 }
118 
119 bool PointStyle::isCircle () const
120 {
121  return m_shape == POINT_SHAPE_CIRCLE;
122 }
123 
125 {
126  return m_lineWidth;
127 }
128 
129 void PointStyle::loadXml(QXmlStreamReader &reader)
130 {
131  LOG4CPP_INFO_S ((*mainCat)) << "PointStyle::loadXml";
132 
133  QXmlStreamAttributes attributes = reader.attributes();
134 
135  if (attributes.hasAttribute(DOCUMENT_SERIALIZE_POINT_STYLE_RADIUS) &&
136  attributes.hasAttribute(DOCUMENT_SERIALIZE_POINT_STYLE_LINE_WIDTH) &&
137  attributes.hasAttribute(DOCUMENT_SERIALIZE_POINT_STYLE_COLOR) &&
138  attributes.hasAttribute(DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE)) {
139 
140  setRadius (attributes.value(DOCUMENT_SERIALIZE_POINT_STYLE_RADIUS).toUInt());
141  setLineWidth (attributes.value(DOCUMENT_SERIALIZE_POINT_STYLE_LINE_WIDTH).toInt());
142  setPaletteColor (static_cast<ColorPalette> (attributes.value(DOCUMENT_SERIALIZE_POINT_STYLE_COLOR).toInt()));
143  setShape (static_cast<PointShape> (attributes.value(DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE).toInt()));
144 
145  // Read until end of this subtree
146  while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
147  (reader.name() != DOCUMENT_SERIALIZE_POINT_STYLE)){
148  loadNextFromReader(reader);
149  }
150  } else {
151  reader.raiseError (QObject::tr ("Cannot read point style data"));
152  }
153 }
154 
156 {
157  return m_paletteColor;
158 }
159 
160 QPolygonF PointStyle::polygon () const
161 {
162  const int NUM_XY = 60;
163  QVector<QPointF> points;
164 
165  switch (m_shape) {
166 
167  case POINT_SHAPE_CIRCLE:
168  {
169  int xyWidth = signed (m_radius);
170  for (int i = 0; i <= NUM_XY; i++) {
171  double angle = TWO_PI * double (i) / double (NUM_XY);
172  double x = xyWidth * cos (angle);
173  double y = xyWidth * sin (angle);
174  points.append (QPointF (x, y));
175  }
176  }
177  break;
178 
179  case POINT_SHAPE_CROSS:
180  {
181  int xyWidth = signed (m_radius);
182 
183  points.append (QPointF (-1 * xyWidth, 0));
184  points.append (QPointF (xyWidth, 0));
185  points.append (QPointF (0, 0));
186  points.append (QPointF (0, xyWidth));
187  points.append (QPointF (0, -1 * xyWidth));
188  points.append (QPointF (0, 0));
189  }
190  break;
191 
192  case POINT_SHAPE_DIAMOND:
193  {
194  int xyWidth = signed (m_radius);
195 
196  points.append (QPointF (0, -1 * xyWidth));
197  points.append (QPointF (-1 * xyWidth, 0));
198  points.append (QPointF (0, xyWidth));
199  points.append (QPointF (xyWidth, 0));
200  }
201  break;
202 
204  {
205  int xyWidth = signed (m_radius);
206 
207  points.append (QPointF (-1 * xyWidth, -1 * xyWidth));
208  points.append (QPointF (xyWidth, -1 * xyWidth));
209  points.append (QPointF (-1 * xyWidth, xyWidth));
210  points.append (QPointF (xyWidth, xyWidth));
211  }
212  break;
213 
214  case POINT_SHAPE_SQUARE:
215  {
216  int xyWidth = signed (m_radius);
217 
218  points.append (QPointF (-1 * xyWidth, -1 * xyWidth));
219  points.append (QPointF (-1 * xyWidth, xyWidth));
220  points.append (QPointF (xyWidth, xyWidth));
221  points.append (QPointF (xyWidth, -1 * xyWidth));
222  }
223  break;
224 
226  {
227  int xyWidth = signed (m_radius);
228 
229  points.append (QPointF (-1 * xyWidth, -1 * xyWidth));
230  points.append (QPointF (0, xyWidth));
231  points.append (QPointF (xyWidth, -1 * xyWidth));
232  }
233  break;
234 
236  {
237  int xyWidth = signed (m_radius);
238 
239  points.append (QPointF (-1 * xyWidth, xyWidth));
240  points.append (QPointF (0, -1 * xyWidth));
241  points.append (QPointF (xyWidth, xyWidth));
242  }
243  break;
244 
245  case POINT_SHAPE_X:
246  {
247  int xyWidth = qFloor (m_radius * qSqrt (0.5));
248 
249  points.append (QPointF (-1 * xyWidth, -1 * xyWidth));
250  points.append (QPointF (xyWidth, xyWidth));
251  points.append (QPointF (0, 0));
252  points.append (QPointF (-1 * xyWidth, xyWidth));
253  points.append (QPointF (xyWidth, -1 * xyWidth));
254  points.append (QPointF (0, 0));
255  }
256  break;
257  }
258 
259  QPolygonF polygon (points);
260  return polygon;
261 }
262 
263 void PointStyle::printStream(QString indentation,
264  QTextStream &str) const
265 {
266  str << indentation << "PointStyle\n";
267 
268  indentation += INDENTATION_DELTA;
269 
270  str << indentation << pointShapeToString (m_shape) << "\n";
271  str << indentation << "radius=" << m_radius << "\n";
272  str << indentation << "lineWidth=" << m_lineWidth << "\n";
273  str << indentation << "color=" << colorPaletteToString (m_paletteColor) << "\n";
274 }
275 
276 unsigned int PointStyle::radius () const
277 {
278  return m_radius;
279 }
280 
281 void PointStyle::saveXml(QXmlStreamWriter &writer) const
282 {
283  LOG4CPP_INFO_S ((*mainCat)) << "PointStyle::saveXml";
284 
285  writer.writeStartElement(DOCUMENT_SERIALIZE_POINT_STYLE);
286  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_RADIUS, QString::number (m_radius));
287  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_LINE_WIDTH, QString::number (m_lineWidth));
288  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_COLOR, QString::number (m_paletteColor));
289  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_COLOR_STRING, colorPaletteToString (m_paletteColor));
290  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE, QString::number (m_shape));
291  writer.writeAttribute (DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE_STRING, pointShapeToString (m_shape));
292  writer.writeEndElement();
293 }
294 
296 {
297  m_lineWidth = width;
298 }
299 
301 {
302  m_paletteColor = paletteColor;
303 }
304 
305 void PointStyle::setRadius (unsigned int radius)
306 {
307  m_radius = radius;
308 }
309 
311 {
312  m_shape = shape;
313 }
314 
316 {
317  return m_shape;
318 }
Manage storage and retrieval of the settings for the curves.
const QString SETTINGS_GROUP_CURVE_AXES
QXmlStreamReader::TokenType loadNextFromReader(QXmlStreamReader &reader)
Load next token from xml reader.
Definition: Xml.cpp:14
static PointStyle defaultAxesCurve()
Initial default for axes curve.
Definition: PointStyle.cpp:67
QString colorPaletteToString(ColorPalette colorPalette)
Definition: ColorPalette.cpp:9
const QString SETTINGS_CURVE_POINT_SHAPE
const QString INDENTATION_DELTA
PointStyle()
Default constructor only for use when this class is being stored by a container that requires the def...
Definition: PointStyle.cpp:29
const QString SETTINGS_CURVE_POINT_RADIUS
void loadXml(QXmlStreamReader &reader)
Load model from serialized xml. Returns the curve name.
Definition: PointStyle.cpp:129
const QString SETTINGS_DIGITIZER
#define LOG4CPP_INFO_S(logger)
Definition: convenience.h:18
const QString DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE
const PointShape DEFAULT_POINT_SHAPE_AXIS
Definition: PointStyle.cpp:25
QPolygonF polygon() const
Return the polygon for creating a QGraphicsPolygonItem. The size is determined by the radius.
Definition: PointStyle.cpp:160
const ColorPalette DEFAULT_POINT_COLOR_GRAPH
Definition: PointStyle.cpp:22
const QString SETTINGS_CURVE_POINT_COLOR
void saveXml(QXmlStreamWriter &writer) const
Serialize to stream.
Definition: PointStyle.cpp:281
void setShape(PointShape shape)
Set method for point shape.
Definition: PointStyle.cpp:310
PointShape
Definition: PointShape.h:12
Details for a specific Point.
Definition: PointStyle.h:20
const QString DOCUMENT_SERIALIZE_POINT_STYLE
const ColorPalette DEFAULT_POINT_COLOR_AXES
Definition: PointStyle.cpp:21
const QString SETTINGS_ENGAUGE
const QString DOCUMENT_SERIALIZE_POINT_STYLE_RADIUS
const QString DOCUMENT_SERIALIZE_POINT_STYLE_LINE_WIDTH
QString pointShapeToString(PointShape pointShape)
Definition: PointShape.cpp:10
void setPaletteColor(ColorPalette paletteColor)
Set method for point color.
Definition: PointStyle.cpp:300
PointShape shape() const
Get method for point shape.
Definition: PointStyle.cpp:315
const double TWO_PI
Definition: PointStyle.cpp:27
PointStyle & operator=(const PointStyle &other)
Assignment constructor.
Definition: PointStyle.cpp:57
log4cpp::Category * mainCat
Definition: Logger.cpp:14
ColorPalette paletteColor() const
Get method for point color.
Definition: PointStyle.cpp:155
const QString DOCUMENT_SERIALIZE_POINT_STYLE_COLOR_STRING
QString groupNameForNthCurve(int indexOneBased) const
Return the group name, that appears in the settings file/registry, for the specified curve index.
const double PI
Definition: PointStyle.cpp:26
const QString SETTINGS_CURVE_POINT_LINE_WIDTH
const int DEFAULT_POINT_RADIUS
Definition: PointStyle.cpp:24
void setRadius(unsigned int radius)
Set method for point radius.
Definition: PointStyle.cpp:305
bool isCircle() const
Return true if point is a circle, otherwise it is a polygon. For a circle, the radius is important an...
Definition: PointStyle.cpp:119
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Definition: PointStyle.cpp:263
const int DEFAULT_POINT_LINE_WIDTH
Definition: PointStyle.cpp:23
int lineWidth() const
Get method for line width.
Definition: PointStyle.cpp:124
unsigned int radius() const
Radius of point. For a circle this is all that is needed to draw a circle. For a polygon,...
Definition: PointStyle.cpp:276
static PointStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.
Definition: PointStyle.cpp:88
const QString DOCUMENT_SERIALIZE_POINT_STYLE_SHAPE_STRING
void setLineWidth(int width)
Set method for line width.
Definition: PointStyle.cpp:295
const QString DOCUMENT_SERIALIZE_POINT_STYLE_COLOR
ColorPalette
Definition: ColorPalette.h:12