Engauge Digitizer  2
CmdSettingsCurveList.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 "CmdSettingsCurveList.h"
8 #include "CurveNameList.h"
9 #include "Document.h"
10 #include "DocumentSerialize.h"
11 #include "Logger.h"
12 #include "MainWindow.h"
13 #include <QXmlStreamReader>
14 #include "Xml.h"
15 
16 const QString CMD_DESCRIPTION ("Curve list");
17 
19  Document &document,
20  const CurveNameList &modelCurves) :
21  CmdAbstract(mainWindow,
22  document,
23  CMD_DESCRIPTION)
24 {
25  LOG4CPP_INFO_S ((*mainCat)) << "CmdSettingsCurveList::CmdSettingsCurveList";
26 
27  m_curvesGraphsBefore = document.curvesGraphs ();
28 
29  // Build the 'after' state
30  for (int row = 0; row < modelCurves.rowCount (); row++) {
31 
32  QModelIndex idxCurrent = modelCurves.index (row, CURVE_NAME_LIST_COLUMN_CURRENT);
33 
34  QString curveNameCurrent = modelCurves.data (idxCurrent).toString ();
35  QString curveNameOriginal = modelCurves.currentCurveToOriginalCurve (curveNameCurrent);
36  if (!curveNameOriginal.isEmpty ()) {
37 
38  // There was an original Curve
39  const Document &documentConst = const_cast<Document&> (document);
40  const Curve *curveOriginal = documentConst.curveForCurveName (curveNameOriginal);
41  Curve curveCurrent (*curveOriginal);
42  curveCurrent.setCurveName (curveNameCurrent);
43 
44  m_curvesGraphsAfter.addGraphCurveAtEnd (curveCurrent); // Save Curve
45 
46  } else {
47 
48  // There was no original Curve
49  Curve curveCurrent (curveNameCurrent,
51  CurveStyle (LineStyle::defaultGraphCurve(m_curvesGraphsAfter.numCurves()),
52  PointStyle::defaultGraphCurve(m_curvesGraphsAfter.numCurves())));
53 
54  m_curvesGraphsAfter.addGraphCurveAtEnd (curveCurrent); // Save Curve
55  }
56  }
57 }
58 
60  Document &document,
61  const QString &cmdDescription,
62  QXmlStreamReader &reader) :
63  CmdAbstract (mainWindow,
64  document,
65  cmdDescription)
66 {
67  LOG4CPP_INFO_S ((*mainCat)) << "CmdSettingsCurveList::CmdSettingsCurveList";
68 
69  bool success = true;
70 
71  // Read until end of this subtree
72  bool isBefore = true;
73  while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
74  (reader.name() != DOCUMENT_SERIALIZE_CMD)){
75  loadNextFromReader(reader);
76  if (reader.atEnd()) {
77  xmlExitWithError (reader,
78  QString ("%1 %2")
79  .arg (QObject::tr ("Reached end of file before finding end element for"))
80  .arg (DOCUMENT_SERIALIZE_CMD));
81  success = false;
82  break;
83  }
84 
85  if ((reader.tokenType() == QXmlStreamReader::StartElement) &&
86  (reader.name() == DOCUMENT_SERIALIZE_CURVES_GRAPHS)) {
87 
88  if (isBefore) {
89 
90  m_curvesGraphsBefore.loadXml (reader);
91  isBefore = false;
92 
93  } else {
94 
95  m_curvesGraphsAfter.loadXml (reader);
96 
97  }
98  }
99  }
100 
101  if (!success) {
102  reader.raiseError ("Cannot read curve add/remove settings");
103  }
104 }
105 
106 CmdSettingsCurveList::~CmdSettingsCurveList ()
107 {
108 }
109 
111 {
112  LOG4CPP_INFO_S ((*mainCat)) << "CmdSettingsCurveList::cmdRedo";
113 
115  mainWindow().updateSettingsCurveList(m_curvesGraphsAfter);
118 }
119 
121 {
122  LOG4CPP_INFO_S ((*mainCat)) << "CmdSettingsCurveList::cmdUndo";
123 
125  mainWindow().updateSettingsCurveList(m_curvesGraphsBefore);
128 }
129 
130 void CmdSettingsCurveList::saveXml (QXmlStreamWriter &writer) const
131 {
132  writer.writeStartElement(DOCUMENT_SERIALIZE_CMD);
133  writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_TYPE, DOCUMENT_SERIALIZE_CMD_SETTINGS_CURVE_LIST);
134  writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_DESCRIPTION, QUndoCommand::text ());
135  m_curvesGraphsBefore.saveXml(writer);
136  m_curvesGraphsAfter.saveXml(writer);
137  writer.writeEndElement();
138 }
static LineStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.
Definition: LineStyle.cpp:84
void loadXml(QXmlStreamReader &reader)
Load from serialized xml post-version 5 file.
Wrapper around QUndoCommand. This simplifies the more complicated feature set of QUndoCommand.
Definition: CmdAbstract.h:19
const Curve * curveForCurveName(const QString &curveName) const
See CurvesGraphs::curveForCurveNames, although this also works for AXIS_CURVE_NAME.
Definition: Document.cpp:335
virtual void cmdUndo()
Undo method that is called when QUndoStack is moved one command backward.
void addGraphCurveAtEnd(const Curve &curve)
Append new graph Curve to end of Curve list.
void saveOrCheckPostCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
void saveXml(QXmlStreamWriter &writer) const
Serialize curves.
QString currentCurveToOriginalCurve(const QString &currentCurve) const
Return the original curve for the specified current curve.
void saveOrCheckPreCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
MainWindow & mainWindow()
Return the MainWindow so it can be updated by this command as a last step.
Definition: CmdAbstract.cpp:45
int numCurves() const
Current number of graphs curves.
void setCurveName(const QString &curveName)
Change the curve name.
Definition: Curve.cpp:551
CmdSettingsCurveList(MainWindow &mainWindow, Document &document, const CurveNameList &modelCurves)
Constructor for normal creation.
virtual void saveXml(QXmlStreamWriter &writer) const
Save commands as xml for later uploading.
void updateAfterCommand()
See GraphicsScene::updateAfterCommand.
Container for LineStyle and PointStyle for one Curve.
Definition: CurveStyle.h:18
Storage of one imported image and the data attached to that image.
Definition: Document.h:41
Container for one set of digitized Points.
Definition: Curve.h:33
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
One row per curve name.
Document & document()
Return the Document that this command will modify during redo and undo.
Definition: CmdAbstract.cpp:35
const CurvesGraphs & curvesGraphs() const
Make all Curves available, read only, for CmdAbstract classes only.
Definition: Document.cpp:342
static PointStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.
Definition: PointStyle.cpp:88
Model for DlgSettingsCurveList and CmdSettingsCurveList.
Definition: CurveNameList.h:27
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:91
virtual void cmdRedo()
Redo method that is called when QUndoStack is moved one command forward.
void updateSettingsCurveList(const CurvesGraphs &curvesGraphs)
Update with new curves.