Engauge Digitizer  2
DocumentModelColorFilter.cpp
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 "CmdMediator.h"
8 #include "CoordSystem.h"
9 #include "DocumentModelColorFilter.h"
10 #include "DocumentSerialize.h"
11 #include "EngaugeAssert.h"
12 #include "Logger.h"
13 #include <QStringList>
14 #include <QTextStream>
15 #include <QXmlStreamWriter>
16 #include "Xml.h"
17 
19 {
20  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::DocumentModelColorFilter";
21 }
22 
24 {
25  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::DocumentModelColorFilter";
26 
27  // Axis curve
28  const Curve &curveAxes = coordSystem.curveAxes();
29  m_colorFilterSettingsList [AXIS_CURVE_NAME] = curveAxes.colorFilterSettings ();
30 
31  // Graph curves
32  QStringList graphCurveNames = coordSystem.curvesGraphsNames();
33  QStringList::const_iterator itr;
34  for (itr = graphCurveNames.begin (); itr != graphCurveNames.end (); itr++) {
35 
36  const QString &graphCurveName = *itr;
37  const Curve *graphCurve = coordSystem.curveForCurveName(graphCurveName);
38  m_colorFilterSettingsList [graphCurveName] = graphCurve->colorFilterSettings();
39  }
40 }
41 
43 {
44  // Curve filters
45  ColorFilterSettingsList::const_iterator itr;
46  for (itr = other.colorFilterSettingsList ().constBegin (); itr != other.colorFilterSettingsList().constEnd(); itr++) {
47  QString curveName = itr.key();
49  m_colorFilterSettingsList [curveName] = colorFilterSettings;
50  }
51 }
52 
54 {
55  // Curve filters
56  ColorFilterSettingsList::const_iterator itr;
57  for (itr = other.colorFilterSettingsList ().constBegin (); itr != other.colorFilterSettingsList ().constEnd(); itr++) {
58  QString curveName = itr.key();
60  m_colorFilterSettingsList [curveName] = colorFilterSettings;
61  }
62 
63  return *this;
64 }
65 
66 ColorFilterMode DocumentModelColorFilter::colorFilterMode(const QString &curveName) const
67 {
68  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
69  return m_colorFilterSettingsList [curveName].colorFilterMode();
70 }
71 
73 {
74  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
75  return m_colorFilterSettingsList [curveName];
76 }
77 
78 const ColorFilterSettingsList &DocumentModelColorFilter::colorFilterSettingsList () const
79 {
80  return m_colorFilterSettingsList;
81 }
82 
83 int DocumentModelColorFilter::foregroundHigh (const QString &curveName) const
84 {
85  QStringList curveNames (m_colorFilterSettingsList.keys());
86  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::foregroundHigh"
87  << " curve=" << curveName.toLatin1().data()
88  << " curves=" << curveNames.join(",").toLatin1().data();
89 
90  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
91  return m_colorFilterSettingsList [curveName].foregroundHigh();
92 }
93 
94 int DocumentModelColorFilter::foregroundLow (const QString &curveName) const
95 {
96  QStringList curveNames (m_colorFilterSettingsList.keys());
97  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::foregroundLow"
98  << " curve=" << curveName.toLatin1().data()
99  << " curves=" << curveNames.join(",").toLatin1().data();
100 
101  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
102  return m_colorFilterSettingsList [curveName].foregroundLow();
103 }
104 
105 double DocumentModelColorFilter::high (const QString &curveName) const
106 {
107  QStringList curveNames (m_colorFilterSettingsList.keys());
108  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::high"
109  << " curve=" << curveName.toLatin1().data()
110  << " curves=" << curveNames.join(",").toLatin1().data();
111 
112  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
113  return m_colorFilterSettingsList [curveName].high();
114 }
115 
116 int DocumentModelColorFilter::hueHigh (const QString &curveName) const
117 {
118  QStringList curveNames (m_colorFilterSettingsList.keys());
119  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::hueHigh"
120  << " curve=" << curveName.toLatin1().data()
121  << " curves=" << curveNames.join(",").toLatin1().data();
122 
123  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
124  return m_colorFilterSettingsList [curveName].hueHigh();
125 }
126 
127 int DocumentModelColorFilter::hueLow (const QString &curveName) const
128 {
129  QStringList curveNames (m_colorFilterSettingsList.keys());
130  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::hueLow"
131  << " curve=" << curveName.toLatin1().data()
132  << " curves=" << curveNames.join(",").toLatin1().data();
133 
134  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
135  return m_colorFilterSettingsList [curveName].hueLow();
136 }
137 
138 int DocumentModelColorFilter::intensityHigh (const QString &curveName) const
139 {
140  QStringList curveNames (m_colorFilterSettingsList.keys());
141  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::intensityHigh"
142  << " curve=" << curveName.toLatin1().data()
143  << " curves=" << curveNames.join(",").toLatin1().data();
144 
145  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
146  return m_colorFilterSettingsList [curveName].intensityHigh();
147 }
148 
149 int DocumentModelColorFilter::intensityLow (const QString &curveName) const
150 {
151  QStringList curveNames (m_colorFilterSettingsList.keys());
152  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::intensityLow"
153  << " curve=" << curveName.toLatin1().data()
154  << " curves=" << curveNames.join(",").toLatin1().data();
155 
156  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
157  return m_colorFilterSettingsList [curveName].intensityLow();
158 }
159 
160 void DocumentModelColorFilter::loadXml(QXmlStreamReader &reader)
161 {
162  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::loadXml";
163 
164  bool success = true;
165 
166  m_colorFilterSettingsList.clear();
167 
168  // A mistake was made, and the DOCUMENT_SERIALIZE_FILTER tag was used for DocumentModelColorFilter,
169  // and DOCUMENT_SERIALIZE_COLOR_FILTER is used for ColorFilterSettings. Too late to change now.
170  bool inFilter = false;
171  while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
172  (reader.name() != DOCUMENT_SERIALIZE_FILTER)) {
173  loadNextFromReader(reader);
174  if (reader.atEnd()) {
175  success = false;
176  break;
177  }
178 
179  if ((reader.tokenType() == QXmlStreamReader::StartElement) &&
180  (reader.name() == DOCUMENT_SERIALIZE_COLOR_FILTER)) {
181 
182  inFilter = true;
183  }
184 
185  if (inFilter && ((reader.tokenType() == QXmlStreamReader::StartElement) &&
186  (reader.name() == DOCUMENT_SERIALIZE_COLOR_FILTER))) {
187 
188  QXmlStreamAttributes attributes = reader.attributes();
189 
190  if (attributes.hasAttribute(DOCUMENT_SERIALIZE_CURVE_NAME)) {
191 
192  QString curveName = attributes.value(DOCUMENT_SERIALIZE_CURVE_NAME).toString();
193 
195  m_colorFilterSettingsList [curveName] = colorFilterSettings;
196 
197  } else {
198  success = false;
199  break;
200  }
201  }
202  }
203 
204  if (!success) {
205  reader.raiseError(QObject::tr ("Cannot read filter data"));
206  }
207 
208  // Read past the end token from the first settings so that is not confused with the end token from the after settings
209  loadNextFromReader(reader);
210 }
211 
212 double DocumentModelColorFilter::low (const QString &curveName) const
213 {
214  QStringList curveNames (m_colorFilterSettingsList.keys());
215  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::low"
216  << " curve=" << curveName.toLatin1().data()
217  << " curves=" << curveNames.join(",").toLatin1().data();
218 
219  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
220  return m_colorFilterSettingsList [curveName].low();
221 }
222 
223 int DocumentModelColorFilter::saturationHigh (const QString &curveName) const
224 {
225  QStringList curveNames (m_colorFilterSettingsList.keys());
226  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::saturationHigh"
227  << " curve=" << curveName.toLatin1().data()
228  << " curves=" << curveNames.join(",").toLatin1().data();
229 
230  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
231  return m_colorFilterSettingsList [curveName].saturationHigh();
232 }
233 
234 int DocumentModelColorFilter::saturationLow (const QString &curveName) const
235 {
236  QStringList curveNames (m_colorFilterSettingsList.keys());
237  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::saturationLow"
238  << " curve=" << curveName.toLatin1().data()
239  << " curves=" << curveNames.join(",").toLatin1().data();
240 
241  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
242  return m_colorFilterSettingsList [curveName].saturationLow();
243 }
244 
245 void DocumentModelColorFilter::saveXml(QXmlStreamWriter &writer) const
246 {
247  LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::saveXml";
248 
249  writer.writeStartElement(DOCUMENT_SERIALIZE_FILTER);
250 
251  // Loop through filters
252  ColorFilterSettingsList::const_iterator itr;
253  for (itr = m_colorFilterSettingsList.begin (); itr != m_colorFilterSettingsList.end (); itr++) {
254 
255  QString curveName = itr.key();
256  const ColorFilterSettings &colorFilterSettings = itr.value();
257 
258  colorFilterSettings.saveXml(writer,
259  curveName);
260  }
261 
262  writer.writeEndElement();
263 }
264 
265 void DocumentModelColorFilter::setColorFilterMode(const QString &curveName,
266  ColorFilterMode colorFilterMode)
267 {
268  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
269  m_colorFilterSettingsList [curveName].setColorFilterMode(colorFilterMode);
270 }
271 
272 void DocumentModelColorFilter::setForegroundHigh (const QString &curveName,
273  int foregroundHigh)
274 {
275  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
276  m_colorFilterSettingsList [curveName].setForegroundHigh(foregroundHigh);
277 }
278 
279 void DocumentModelColorFilter::setForegroundLow (const QString &curveName,
280  int foregroundLow)
281 {
282  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
283  m_colorFilterSettingsList [curveName].setForegroundLow(foregroundLow);
284 }
285 
286 void DocumentModelColorFilter::setHigh (const QString &curveName,
287  double s0To1)
288 {
289  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
290  m_colorFilterSettingsList [curveName].setHigh(s0To1);
291 }
292 
293 void DocumentModelColorFilter::setHueHigh (const QString &curveName,
294  int hueHigh)
295 {
296  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
297  m_colorFilterSettingsList [curveName].setHueHigh(hueHigh);
298 }
299 
300 void DocumentModelColorFilter::setHueLow (const QString &curveName,
301  int hueLow)
302 {
303  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
304  m_colorFilterSettingsList [curveName].setHueLow(hueLow);
305 }
306 
307 void DocumentModelColorFilter::setIntensityHigh (const QString &curveName,
308  int intensityHigh)
309 {
310  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
311  m_colorFilterSettingsList [curveName].setIntensityHigh(intensityHigh);
312 }
313 
314 void DocumentModelColorFilter::setIntensityLow (const QString &curveName,
315  int intensityLow)
316 {
317  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
318  m_colorFilterSettingsList [curveName].setIntensityLow(intensityLow);
319 }
320 
321 void DocumentModelColorFilter::setLow (const QString &curveName,
322  double s0To1)
323 {
324  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
325  m_colorFilterSettingsList [curveName].setLow(s0To1);
326 }
327 
328 void DocumentModelColorFilter::setSaturationHigh (const QString &curveName,
329  int saturationHigh)
330 {
331  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
332  m_colorFilterSettingsList [curveName].setSaturationHigh(saturationHigh);
333 }
334 
335 void DocumentModelColorFilter::setSaturationLow (const QString &curveName,
336  int saturationLow)
337 {
338  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
339  m_colorFilterSettingsList [curveName].setSaturationLow(saturationLow);
340 }
341 
342 void DocumentModelColorFilter::setValueHigh (const QString &curveName,
343  int valueHigh)
344 {
345  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
346  m_colorFilterSettingsList [curveName].setValueHigh(valueHigh);
347 }
348 
349 void DocumentModelColorFilter::setValueLow (const QString &curveName,
350  int valueLow)
351 {
352  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
353  m_colorFilterSettingsList [curveName].setValueLow(valueLow);
354 }
355 
356 int DocumentModelColorFilter::valueHigh (const QString &curveName) const
357 {
358  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
359  return m_colorFilterSettingsList [curveName].valueHigh();
360 }
361 
362 int DocumentModelColorFilter::valueLow (const QString &curveName) const
363 {
364  ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
365  return m_colorFilterSettingsList [curveName].valueLow();
366 }
int intensityHigh(const QString &curveName) const
Get method for intensity higher bound.
const ColorFilterSettingsList & colorFilterSettingsList() const
Get method for copying all color filters in one step.
int valueHigh(const QString &curveName) const
Get method for value high.
DocumentModelColorFilter()
Default constructor.
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
int valueLow(const QString &curveName) const
Get method for value low.
void setColorFilterMode(const QString &curveName, ColorFilterMode colorFilterMode)
Set method for filter mode.
int hueHigh(const QString &curveName) const
Get method for hue higher bound.
ColorFilterSettings colorFilterSettings() const
Return the color filter.
Definition: Curve.cpp:138
int saturationLow(const QString &curveName) const
Get method for saturation lower bound.
int foregroundHigh(const QString &curveName) const
Get method for foreground higher bound.
Storage of data belonging to one coordinate system.
Definition: CoordSystem.h:42
virtual QStringList curvesGraphsNames() const
See CurvesGraphs::curvesGraphsNames.
const ColorFilterSettings colorFilterSettings(const QString &curveName) const
Get method for copying one color filter. Cannot return just a reference or else there is a warning ab...
ColorFilterMode colorFilterMode(const QString &curveName) const
Get method for filter mode.
void setValueLow(const QString &curveName, int valueLow)
Set method for value low.
int hueLow(const QString &curveName) const
Get method for hue lower bound.
int saturationHigh(const QString &curveName) const
Get method for saturation higher bound.
DocumentModelColorFilter & operator=(const DocumentModelColorFilter &other)
Assignment constructor.
void setForegroundLow(const QString &curveName, int foregroundLow)
Set method for foreground lower bound.
void setHueLow(const QString &curveName, int hueLow)
Set method for hue lower bound.
double high(const QString &curveName) const
High value of foreground, hue, intensity, saturation or value according to current filter mode...
virtual void loadXml(QXmlStreamReader &reader)
Load model from serialized xml.
int intensityLow(const QString &curveName) const
Get method for intensity lower bound.
void setIntensityLow(const QString &curveName, int intensityLow)
Set method for intensity lower bound.
void setHigh(const QString &curveName, double s0To1)
Set the high value for the current filter mode.
void setForegroundHigh(const QString &curveName, int foregroundHigh)
Set method for foreground higher bound.
Model for DlgSettingsColorFilter and CmdSettingsColorFilter.
virtual void saveXml(QXmlStreamWriter &writer) const
Save entire model as xml into stream.
void setIntensityHigh(const QString &curveName, int intensityHigh)
Set method for intensity higher bound.
int foregroundLow(const QString &curveName) const
Get method for foreground lower bound.
Container for one set of digitized Points.
Definition: Curve.h:33
void setLow(const QString &curveName, double s0To1)
Set the low value for the current filter mode.
void setSaturationLow(const QString &curveName, int saturationLow)
Set method for saturation low.
virtual Curve * curveForCurveName(const QString &curveName)
See CurvesGraphs::curveForCurveName, although this also works for AXIS_CURVE_NAME.
void setSaturationHigh(const QString &curveName, int saturationHigh)
Set method for saturation high.
void setHueHigh(const QString &curveName, int hueHigh)
Set method for hue higher bound.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
void setValueHigh(const QString &curveName, int valueHigh)
Set method for value high.
double low(const QString &curveName) const
Low value of foreground, hue, intensity, saturation or value according to current filter mode normali...
virtual const Curve & curveAxes() const
Get method for axis curve.