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