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
DocumentModelColorFilter()18 DocumentModelColorFilter::DocumentModelColorFilter()
19 {
20 LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelColorFilter::DocumentModelColorFilter";
21 }
22
DocumentModelColorFilter(const CoordSystem & coordSystem)23 DocumentModelColorFilter::DocumentModelColorFilter(const CoordSystem &coordSystem)
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
DocumentModelColorFilter(const DocumentModelColorFilter & other)42 DocumentModelColorFilter::DocumentModelColorFilter(const DocumentModelColorFilter &other)
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();
48 ColorFilterSettings colorFilterSettings = itr.value();
49 m_colorFilterSettingsList [curveName] = colorFilterSettings;
50 }
51 }
52
operator =(const DocumentModelColorFilter & other)53 DocumentModelColorFilter &DocumentModelColorFilter::operator=(const DocumentModelColorFilter &other)
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();
59 ColorFilterSettings colorFilterSettings = itr.value();
60 m_colorFilterSettingsList [curveName] = colorFilterSettings;
61 }
62
63 return *this;
64 }
65
colorFilterMode(const QString & curveName) const66 ColorFilterMode DocumentModelColorFilter::colorFilterMode(const QString &curveName) const
67 {
68 ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
69 return m_colorFilterSettingsList [curveName].colorFilterMode();
70 }
71
colorFilterSettings(const QString & curveName) const72 const ColorFilterSettings DocumentModelColorFilter::colorFilterSettings (const QString &curveName) const
73 {
74 ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
75 return m_colorFilterSettingsList [curveName];
76 }
77
colorFilterSettingsList() const78 const ColorFilterSettingsList &DocumentModelColorFilter::colorFilterSettingsList () const
79 {
80 return m_colorFilterSettingsList;
81 }
82
foregroundHigh(const QString & curveName) const83 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
foregroundLow(const QString & curveName) const94 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
high(const QString & curveName) const105 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
hueHigh(const QString & curveName) const116 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
hueLow(const QString & curveName) const127 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
intensityHigh(const QString & curveName) const138 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
intensityLow(const QString & curveName) const149 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
loadXml(QXmlStreamReader & reader)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
194 ColorFilterSettings colorFilterSettings (reader);
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
low(const QString & curveName) const212 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
saturationHigh(const QString & curveName) const223 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
saturationLow(const QString & curveName) const234 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
saveXml(QXmlStreamWriter & writer) const245 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
setColorFilterMode(const QString & curveName,ColorFilterMode colorFilterMode)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
setForegroundHigh(const QString & curveName,int foregroundHigh)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
setForegroundLow(const QString & curveName,int foregroundLow)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
setHigh(const QString & curveName,double s0To1)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
setHueHigh(const QString & curveName,int hueHigh)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
setHueLow(const QString & curveName,int hueLow)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
setIntensityHigh(const QString & curveName,int intensityHigh)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
setIntensityLow(const QString & curveName,int intensityLow)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
setLow(const QString & curveName,double s0To1)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
setSaturationHigh(const QString & curveName,int saturationHigh)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
setSaturationLow(const QString & curveName,int saturationLow)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
setValueHigh(const QString & curveName,int valueHigh)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
setValueLow(const QString & curveName,int valueLow)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
valueHigh(const QString & curveName) const356 int DocumentModelColorFilter::valueHigh (const QString &curveName) const
357 {
358 ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
359 return m_colorFilterSettingsList [curveName].valueHigh();
360 }
361
valueLow(const QString & curveName) const362 int DocumentModelColorFilter::valueLow (const QString &curveName) const
363 {
364 ENGAUGE_ASSERT (m_colorFilterSettingsList.contains (curveName));
365 return m_colorFilterSettingsList [curveName].valueLow();
366 }
367