Engauge Digitizer  2
CmdAddPointsGraph.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 "CmdAddPointsGraph.h"
8 #include "Document.h"
9 #include "DocumentSerialize.h"
10 #include "EngaugeAssert.h"
11 #include "Logger.h"
12 #include "MainWindow.h"
13 #include <qdebug.h>
14 #include "QtToString.h"
15 #include <QXmlStreamReader>
16 #include <QXmlStreamWriter>
17 #include "Xml.h"
18 
19 const QString CMD_DESCRIPTION ("Add graph points");
20 
22  Document &document,
23  const QString &curveName,
24  const QList<QPoint> &points,
25  const QList<double> &ordinals) :
26  CmdAbstract (mainWindow,
27  document,
28  CMD_DESCRIPTION),
29  m_curveName (curveName),
30  m_points (points),
31  m_ordinals (ordinals)
32 {
33  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointsGraph::CmdAddPointsGraph";
34 }
35 
38  const QString &cmdDescription,
39  QXmlStreamReader &reader) :
40  CmdAbstract (mainWindow,
41  document,
42  cmdDescription)
43 {
44  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointsGraph::CmdAddPointsGraph";
45 
46  QXmlStreamAttributes attributes = reader.attributes();
47 
48  if (!attributes.hasAttribute(DOCUMENT_SERIALIZE_CURVE_NAME)) {
49  xmlExitWithError (reader,
50  QString ("%1 %2")
51  .arg (QObject::tr ("Missing attribute"))
52  .arg (DOCUMENT_SERIALIZE_CURVE_NAME));
53  }
54 
55  m_curveName = attributes.value(DOCUMENT_SERIALIZE_CURVE_NAME).toString();
56 
57  bool success = true;
58  while (loadNextFromReader (reader)) {
59 
60  if (reader.atEnd() || reader.hasError ()) {
61  success = false;
62  break;
63  }
64 
65  if ((reader.tokenType() == QXmlStreamReader::EndElement) &
66  (reader.name() == DOCUMENT_SERIALIZE_CMD)) {
67  break;
68  }
69 
70  // Not done yet
71  if ((reader.tokenType() == QXmlStreamReader::StartElement) &&
72  (reader.name() == DOCUMENT_SERIALIZE_POINT)) {
73 
74  // This is an entry that we need to add
75  QXmlStreamAttributes attributes = reader.attributes ();
76 
77  if (attributes.hasAttribute(DOCUMENT_SERIALIZE_IDENTIFIER) &&
78  attributes.hasAttribute(DOCUMENT_SERIALIZE_ORDINAL) &&
79  attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_X) &&
80  attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_Y)) {
81 
82  m_identifiersAdded << attributes.value(DOCUMENT_SERIALIZE_IDENTIFIER).toString();
83  m_ordinals << attributes.value(DOCUMENT_SERIALIZE_ORDINAL).toDouble();
84 
85  QPoint point (attributes.value(DOCUMENT_SERIALIZE_SCREEN_X).toInt(),
86  attributes.value(DOCUMENT_SERIALIZE_SCREEN_Y).toInt());
87  m_points << point;
88  }
89  }
90  }
91 
92  if (!success) {
93  reader.raiseError (QObject::tr ("Cannot read graph points"));
94  }
95 }
96 
97 CmdAddPointsGraph::~CmdAddPointsGraph ()
98 {
99 }
100 
102 {
103  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointsGraph::cmdRedo";
104 
105  for (int index = 0; index < m_points.count(); index++) {
106 
107  QString identifierAdded;
109  m_points.at (index),
110  identifierAdded,
111  m_ordinals.at (index));
112  m_identifiersAdded.push_back (identifierAdded);
113  }
114 
115  document().updatePointOrdinals (mainWindow().transformation());
117 }
118 
120 {
121  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointsGraph::cmdUndo";
122 
123  for (int index = 0; index < m_points.count(); index++) {
124  document().removePointGraph (m_identifiersAdded [index]);
125  }
126  document().updatePointOrdinals (mainWindow().transformation());
128 }
129 
130 void CmdAddPointsGraph::saveXml (QXmlStreamWriter &writer) const
131 {
132  writer.writeStartElement(DOCUMENT_SERIALIZE_CMD);
133  writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_TYPE, DOCUMENT_SERIALIZE_CMD_ADD_POINTS_GRAPH);
134  writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_DESCRIPTION, QUndoCommand::text ());
135  writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, m_curveName);
136 
137  for (int index = 0; index < m_points.count(); index++) {
138 
139  writer.writeStartElement (DOCUMENT_SERIALIZE_POINT);
140  writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_X, QString::number (m_points.at (index).x()));
141  writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_Y, QString::number (m_points.at (index).y()));
142 
143  QString identifier;
144  if (index < m_identifiersAdded.count()) {
145  identifier = m_identifiersAdded.at (index);
146  }
147 
148  writer.writeAttribute(DOCUMENT_SERIALIZE_IDENTIFIER, identifier);
149  writer.writeAttribute(DOCUMENT_SERIALIZE_ORDINAL, QString::number (m_ordinals.at (index)));
150  writer.writeEndElement();
151  }
152  writer.writeEndElement();
153 }
void addPointGraphWithGeneratedIdentifier(const QString &curveName, const QPointF &posScreen, QString &generatedIentifier, double ordinal)
Add a single graph point with a generated point identifier.
Definition: Document.cpp:184
Wrapper around QUndoCommand. This simplifies the more complicated feature set of QUndoCommand.
Definition: CmdAbstract.h:18
void removePointGraph(const QString &identifier)
Perform the opposite of addPointGraph.
Definition: Document.cpp:734
CmdAddPointsGraph(MainWindow &mainWindow, Document &document, const QString &curveName, const QList< QPoint > &points, const QList< double > &ordinals)
Constructor for normal creation.
MainWindow & mainWindow()
Return the MainWindow so it can be updated by this command as a last step.
Definition: CmdAbstract.cpp:43
void updateAfterCommand()
See GraphicsScene::updateAfterCommand.
Storage of one imported image and the data attached to that image.
Definition: Document.h:40
virtual void cmdUndo()
Undo method that is called when QUndoStack is moved one command backward.
Document & document()
Return the Document that this command will modify during redo and undo.
Definition: CmdAbstract.cpp:33
virtual void saveXml(QXmlStreamWriter &writer) const
Save commands as xml for later uploading.
virtual void cmdRedo()
Redo method that is called when QUndoStack is moved one command forward.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:77
void updatePointOrdinals(const Transformation &transformation)
Update point ordinals after point addition/removal or dragging.
Definition: Document.cpp:903