Engauge Digitizer  2
CmdAddPointAxis.cpp
Go to the documentation of this file.
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 "CmdAddPointAxis.h"
8 #include "Document.h"
9 #include "DocumentSerialize.h"
10 #include "EngaugeAssert.h"
11 #include "Logger.h"
12 #include "MainWindow.h"
13 #include "QtToString.h"
14 #include <QXmlStreamReader>
15 #include "Xml.h"
16 
17 const QString CMD_DESCRIPTION ("Add axis point");
18 
20  Document &document,
21  const QPointF &posScreen,
22  const QPointF &posGraph,
23  double ordinal,
24  bool isXOnly) :
25  CmdPointChangeBase (mainWindow,
26  document,
28  m_posScreen (posScreen),
29  m_posGraph (posGraph),
30  m_ordinal (ordinal),
31  m_isXOnly (isXOnly)
32 {
33  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointAxis::CmdAddPointAxis"
34  << " posScreen=" << QPointFToString (posScreen).toLatin1 ().data ()
35  << " posGraph=" << QPointFToString (posGraph).toLatin1 ().data ()
36  << " ordinal=" << ordinal;
37 }
38 
40  Document &document,
41  const QString &cmdDescription,
42  QXmlStreamReader &reader) :
43  CmdPointChangeBase (mainWindow,
44  document,
45  cmdDescription)
46 {
47  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointAxis::CmdAddPointAxis";
48 
49  QXmlStreamAttributes attributes = reader.attributes();
50 
51  if (!attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_X) ||
52  !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_Y) ||
53  !attributes.hasAttribute(DOCUMENT_SERIALIZE_GRAPH_X) ||
54  !attributes.hasAttribute(DOCUMENT_SERIALIZE_GRAPH_Y) ||
55  !attributes.hasAttribute(DOCUMENT_SERIALIZE_IDENTIFIER) ||
56  !attributes.hasAttribute(DOCUMENT_SERIALIZE_ORDINAL) ||
57  !attributes.hasAttribute(DOCUMENT_SERIALIZE_POINT_IS_X_ONLY)) {
58  xmlExitWithError (reader,
59  QString ("Missing attribute(s) %1, %2, %3, %4, %5, %6 and/or %7")
67  }
68 
69  // Boolean values
70  QString isXOnlyValue = attributes.value(DOCUMENT_SERIALIZE_POINT_IS_X_ONLY).toString();
71 
72  m_posScreen.setX(attributes.value(DOCUMENT_SERIALIZE_SCREEN_X).toDouble());
73  m_posScreen.setY(attributes.value(DOCUMENT_SERIALIZE_SCREEN_Y).toDouble());
74  m_posGraph.setX(attributes.value(DOCUMENT_SERIALIZE_GRAPH_X).toDouble());
75  m_posGraph.setY(attributes.value(DOCUMENT_SERIALIZE_GRAPH_Y).toDouble());
76  m_identifierAdded = attributes.value(DOCUMENT_SERIALIZE_IDENTIFIER).toString();
77  m_ordinal = attributes.value(DOCUMENT_SERIALIZE_ORDINAL).toDouble();
78  m_isXOnly = (isXOnlyValue == DOCUMENT_SERIALIZE_BOOL_TRUE);
79 }
80 
82 {
83 }
84 
86 {
87  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointAxis::cmdRedo";
88 
92  m_posGraph,
93  m_identifierAdded,
94  m_ordinal,
95  m_isXOnly);
96  document().updatePointOrdinals (mainWindow().transformation());
99 }
100 
102 {
103  LOG4CPP_INFO_S ((*mainCat)) << "CmdAddPointAxis::cmdUndo";
104 
109 }
110 
111 void CmdAddPointAxis::saveXml (QXmlStreamWriter &writer) const
112 {
113  // For time coordinates, many digits of precision are needed since a typical date is 1,246,870,000 = July 6, 2009
114  // and we want seconds of precision
115  const char FORMAT = 'g';
116  const int PRECISION = 16;
117 
118  writer.writeStartElement(DOCUMENT_SERIALIZE_CMD);
120  writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_DESCRIPTION, QUndoCommand::text ());
121  writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_X, QString::number (m_posScreen.x()));
122  writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_Y, QString::number (m_posScreen.y()));
123  writer.writeAttribute(DOCUMENT_SERIALIZE_GRAPH_X, QString::number (m_posGraph.x(), FORMAT, PRECISION));
124  writer.writeAttribute(DOCUMENT_SERIALIZE_GRAPH_Y, QString::number (m_posGraph.y(), FORMAT, PRECISION));
125  writer.writeAttribute(DOCUMENT_SERIALIZE_IDENTIFIER, m_identifierAdded);
126  writer.writeAttribute(DOCUMENT_SERIALIZE_ORDINAL, QString::number (m_ordinal));
127  writer.writeAttribute(DOCUMENT_SERIALIZE_POINT_IS_X_ONLY, m_isXOnly ?
130  writer.writeEndElement();
131 }
CmdAddPointAxis(MainWindow &mainWindow, Document &document, const QPointF &posScreen, const QPointF &posGraph, double ordinal, bool isXOnly)
Constructor for normal creation.
virtual void cmdUndo()
Undo method that is called when QUndoStack is moved one command backward.
const QString CMD_DESCRIPTION("Add axis point")
#define LOG4CPP_INFO_S(logger)
Definition: convenience.h:18
void restoreDocumentState(Document &document) const
Restore the document previously saved by saveDocumentState.
const QString DOCUMENT_SERIALIZE_SCREEN_Y
const QString DOCUMENT_SERIALIZE_BOOL_TRUE
const QString DOCUMENT_SERIALIZE_GRAPH_X
void saveOrCheckPostCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
const QString DOCUMENT_SERIALIZE_CMD_ADD_POINT_AXIS
QString QPointFToString(const QPointF &pos)
Definition: QtToString.cpp:17
const QString DOCUMENT_SERIALIZE_ORDINAL
const QString DOCUMENT_SERIALIZE_CMD_TYPE
const QString DOCUMENT_SERIALIZE_BOOL_FALSE
void saveOrCheckPreCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
virtual void cmdRedo()
Redo method that is called when QUndoStack is moved one command forward.
const QString DOCUMENT_SERIALIZE_CMD_DESCRIPTION
Base class for CmdBase leaf subclasses that involve point additions, deletions and/or modifications.
MainWindow & mainWindow()
Return the MainWindow so it can be updated by this command as a last step.
Definition: CmdAbstract.cpp:45
const QString DOCUMENT_SERIALIZE_POINT_IS_X_ONLY
void updateAfterCommand()
See GraphicsScene::updateAfterCommand.
Storage of one imported image and the data attached to that image.
Definition: Document.h:41
const QString DOCUMENT_SERIALIZE_GRAPH_Y
const QString DOCUMENT_SERIALIZE_IDENTIFIER
const QString DOCUMENT_SERIALIZE_SCREEN_X
log4cpp::Category * mainCat
Definition: Logger.cpp:14
void addPointAxisWithGeneratedIdentifier(const QPointF &posScreen, const QPointF &posGraph, QString &identifier, double ordinal, bool isXOnly)
Add a single axis point with a generated point identifier.
Definition: Document.cpp:165
virtual ~CmdAddPointAxis()
virtual void saveXml(QXmlStreamWriter &writer) const
Save commands as xml for later uploading.
void xmlExitWithError(QXmlStreamReader &reader, const QString &message)
Show specified message for an error while reading xml, then quit.
Definition: Xml.cpp:25
Document & document()
Return the Document that this command will modify during redo and undo.
Definition: CmdAbstract.cpp:35
const QString DOCUMENT_SERIALIZE_CMD
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:91
void updatePointOrdinals(const Transformation &transformation)
Update point ordinals after point addition/removal or dragging.
Definition: Document.cpp:1066
void saveDocumentState(const Document &document)
Save the document state for restoration by restoreDocumentState.