Engauge Digitizer 2
Loading...
Searching...
No Matches
CmdMoveBy.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 "CmdMoveBy.h"
8#include "DataKey.h"
9#include "Document.h"
10#include "DocumentSerialize.h"
11#include "EngaugeAssert.h"
12#include "GraphicsItemType.h"
13#include "GraphicsView.h"
14#include "Logger.h"
15#include "MainWindow.h"
16#include <QGraphicsItem>
17#include <QtToString.h>
18#include <QXmlStreamReader>
19#include "Xml.h"
20
22 Document &document,
23 const QPointF &deltaScreen,
24 const QString &moveText,
25 const QStringList &selectedPointIdentifiers) :
26 CmdAbstract(mainWindow,
27 document,
28 moveText),
29 m_deltaScreen (deltaScreen)
30{
31 QStringList selected; // For debug
32 QStringList::const_iterator itr;
33 for (itr = selectedPointIdentifiers.begin (); itr != selectedPointIdentifiers.end (); itr++) {
34
35 QString selectedPointIdentifier = *itr;
36
37 selected << selectedPointIdentifier;
38 m_movedPoints.setKeyValue (selectedPointIdentifier, true);
39 }
40
41 LOG4CPP_INFO_S ((*mainCat)) << "CmdMoveBy::CmdMoveBy"
42 << " deltaScreen=" << QPointFToString (deltaScreen).toLatin1 ().data ()
43 << " selected=" << selected.join (", ").toLatin1 ().data () << ")";
44}
45
47 Document &document,
48 const QString &cmdDescription,
49 QXmlStreamReader &reader) :
50 CmdAbstract (mainWindow,
51 document,
52 cmdDescription)
53{
54 LOG4CPP_INFO_S ((*mainCat)) << "CmdMoveBy::CmdMoveBy";
55
56 QXmlStreamAttributes attributes = reader.attributes();
57
58 if (!attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_X_DELTA) ||
59 !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_Y_DELTA) ) {
60 xmlExitWithError (reader,
61 QString ("%1 %2 %3 %4")
62 .arg (QObject::tr ("Missing attribute(s)"))
63 .arg (DOCUMENT_SERIALIZE_SCREEN_X_DELTA)
64 .arg (QObject::tr ("and/or"))
65 .arg (DOCUMENT_SERIALIZE_SCREEN_Y_DELTA));
66 }
67
68 m_deltaScreen.setX(attributes.value(DOCUMENT_SERIALIZE_SCREEN_X_DELTA).toDouble());
69 m_deltaScreen.setY(attributes.value(DOCUMENT_SERIALIZE_SCREEN_Y_DELTA).toDouble());
70 m_movedPoints.loadXml (reader);
71}
72
73CmdMoveBy::~CmdMoveBy ()
74{
75}
76
78{
79 LOG4CPP_INFO_S ((*mainCat)) << "CmdMoveBy::cmdRedo"
80 << " deltaScreen=" << QPointFToString (m_deltaScreen).toLatin1().data()
81 << " moving=" << m_movedPoints.count ();
82
83 moveBy (m_deltaScreen);
85 resetSelection(m_movedPoints);
86}
87
89{
90 LOG4CPP_INFO_S ((*mainCat)) << "CmdMoveBy::cmdUndo"
91 << " deltaScreen=" << QPointFToString (-1.0 * m_deltaScreen).toLatin1().data()
92 << " moving=" << m_movedPoints.count ();
93
94 moveBy (-1.0 * m_deltaScreen);
96 resetSelection(m_movedPoints);
97}
98
99void CmdMoveBy::moveBy (const QPointF &deltaScreen)
100{
101 LOG4CPP_INFO_S ((*mainCat)) << "CmdMoveBy::moveBy";
102
103 // Move Points in the Document
104 for (int i = 0; i < m_movedPoints.count(); i++) {
105
106 QString pointIdentifier = m_movedPoints.getKey (i);
107 document().movePoint (pointIdentifier, deltaScreen);
108
109 }
110
111 // Move Points in GraphicsScene, using the new positions in Document
112 QList<QGraphicsItem *> items = mainWindow().view().items();
113 QList<QGraphicsItem *>::iterator itrS;
114 for (itrS = items.begin (); itrS != items.end (); itrS++) {
115
116 QGraphicsItem *item = *itrS;
117 if (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt () == GRAPHICS_ITEM_TYPE_POINT) {
118
119 QString pointIdentifier = item->data (DATA_KEY_IDENTIFIER).toString ();
120
121 if (m_movedPoints.contains (pointIdentifier)) {
122
123 // Get the new position
124 QPointF posScreen = document().positionScreen (pointIdentifier);
125
126 if (item->pos () != posScreen) {
127
128 // Save the new position
129 item->setPos (posScreen);
130 }
131 }
132 }
133 }
134
135 document().updatePointOrdinals (mainWindow().transformation());
136
137 // Update the lines attached to the points
139}
140
141void CmdMoveBy::saveXml (QXmlStreamWriter &writer) const
142{
143 writer.writeStartElement(DOCUMENT_SERIALIZE_CMD);
144 writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_TYPE, DOCUMENT_SERIALIZE_CMD_MOVE_BY);
145 writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_DESCRIPTION, QUndoCommand::text ());
146 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_X_DELTA, QString::number (m_deltaScreen.x()));
147 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_Y_DELTA, QString::number (m_deltaScreen.y()));
148 m_movedPoints.saveXml (writer);
149 writer.writeEndElement();
150}
Wrapper around QUndoCommand. This simplifies the more complicated feature set of QUndoCommand.
Definition CmdAbstract.h:19
Document & document()
Return the Document that this command will modify during redo and undo.
MainWindow & mainWindow()
Return the MainWindow so it can be updated by this command as a last step.
void resetSelection(const PointIdentifiers &pointIdentifiersToSelect)
Since the set of selected points has probably changed, changed that set back to the specified set.
virtual void cmdUndo()
Undo method that is called when QUndoStack is moved one command backward.
Definition CmdMoveBy.cpp:88
virtual void cmdRedo()
Redo method that is called when QUndoStack is moved one command forward.
Definition CmdMoveBy.cpp:77
virtual void saveXml(QXmlStreamWriter &writer) const
Save commands as xml for later uploading.
CmdMoveBy(MainWindow &mainWindow, Document &document, const QPointF &deltaScreen, const QString &moveText, const QStringList &selectedPointIdentifiers)
Constructor for normal creation.
Definition CmdMoveBy.cpp:21
Storage of one imported image and the data attached to that image.
Definition Document.h:41
QPointF positionScreen(const QString &pointIdentifier) const
See Curve::positionScreen.
Definition Document.cpp:691
void updatePointOrdinals(const Transformation &transformation)
Update point ordinals after point addition/removal or dragging.
Definition Document.cpp:903
void movePoint(const QString &pointIdentifier, const QPointF &deltaScreen)
See Curve::movePoint.
Definition Document.cpp:667
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition MainWindow.h:78
void updateAfterCommand()
See GraphicsScene::updateAfterCommand.
void updateGraphicsLinesToMatchGraphicsPoints()
Update the graphics lines so they follow the graphics points, after a drag, addition,...
GraphicsView & view()
View for the QImage and QGraphicsItems, without const.
bool contains(const QString &pointIdentifier) const
True if specified entry exists in the table.
QString getKey(int i) const
Get key for index.
void loadXml(QXmlStreamReader &reader)
Load from serialized xml.
int count() const
Number of entries.
void setKeyValue(const QString &pointIdentifier, bool value)
Set key/value pair.
void saveXml(QXmlStreamWriter &writer) const
Serialize table to xml.