summaryrefslogtreecommitdiff
path: root/src/gui/undocommands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/undocommands.cpp')
-rw-r--r--src/gui/undocommands.cpp147
1 files changed, 133 insertions, 14 deletions
diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp
index 9c6a9c3..0ebfd21 100644
--- a/src/gui/undocommands.cpp
+++ b/src/gui/undocommands.cpp
@@ -4,12 +4,28 @@
#include <QGraphicsView>
+GraphUpdateCommand::GraphUpdateCommand(TikzScene *scene, QUndoCommand *parent) : QUndoCommand(parent), _scene(scene)
+{
+}
+
+void GraphUpdateCommand::undo()
+{
+ _scene->tikzDocument()->refreshTikz();
+ _scene->invalidate();
+}
+
+void GraphUpdateCommand::redo()
+{
+ _scene->tikzDocument()->refreshTikz();
+ _scene->invalidate();
+}
+
+
MoveCommand::MoveCommand(TikzScene *scene,
QMap<Node*, QPointF> oldNodePositions,
QMap<Node*, QPointF> newNodePositions,
QUndoCommand *parent) :
- QUndoCommand(parent),
- _scene(scene),
+ GraphUpdateCommand(scene, parent),
_oldNodePositions(oldNodePositions),
_newNodePositions(newNodePositions)
{}
@@ -25,6 +41,7 @@ void MoveCommand::undo()
}
_scene->refreshAdjacentEdges(_oldNodePositions.keys());
+ GraphUpdateCommand::undo();
}
void MoveCommand::redo()
@@ -37,12 +54,14 @@ void MoveCommand::redo()
}
_scene->refreshAdjacentEdges(_newNodePositions.keys());
+ GraphUpdateCommand::redo();
}
EdgeBendCommand::EdgeBendCommand(TikzScene *scene, Edge *edge,
float oldWeight, int oldBend,
- int oldInAngle, int oldOutAngle) :
- _scene(scene), _edge(edge),
+ int oldInAngle, int oldOutAngle, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent),
+ _edge(edge),
_oldWeight(oldWeight), _oldBend(oldBend),
_oldInAngle(oldInAngle), _oldOutAngle(oldOutAngle)
{
@@ -65,6 +84,7 @@ void EdgeBendCommand::undo()
break;
}
}
+ GraphUpdateCommand::undo();
}
void EdgeBendCommand::redo()
@@ -80,20 +100,23 @@ void EdgeBendCommand::redo()
break;
}
}
+
+ GraphUpdateCommand::redo();
}
DeleteCommand::DeleteCommand(TikzScene *scene,
QMap<int, Node *> deleteNodes,
QMap<int, Edge *> deleteEdges,
- QSet<Edge *> selEdges) :
- _scene(scene), _deleteNodes(deleteNodes),
- _deleteEdges(deleteEdges), _selEdges(selEdges)
+ QSet<Edge *> selEdges, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent),
+ _deleteNodes(deleteNodes), _deleteEdges(deleteEdges), _selEdges(selEdges)
{}
void DeleteCommand::undo()
{
for (auto it = _deleteNodes.begin(); it != _deleteNodes.end(); ++it) {
Node *n = it.value();
+ n->attachStyle(); // in case styles have changed
_scene->graph()->addNode(n, it.key());
NodeItem *ni = new NodeItem(n);
_scene->nodeItems().insert(n, ni);
@@ -110,6 +133,8 @@ void DeleteCommand::undo()
if (_selEdges.contains(e)) ei->setSelected(true);
}
+
+ GraphUpdateCommand::undo();
}
void DeleteCommand::redo()
@@ -131,10 +156,12 @@ void DeleteCommand::redo()
_scene->graph()->removeNode(n);
}
+
+ GraphUpdateCommand::redo();
}
-AddNodeCommand::AddNodeCommand(TikzScene *scene, Node *node, QRectF newBounds) :
- _scene(scene), _node(node), _oldBounds(_scene->sceneRect()), _newBounds(newBounds)
+AddNodeCommand::AddNodeCommand(TikzScene *scene, Node *node, QRectF newBounds, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _node(node), _oldBounds(_scene->sceneRect()), _newBounds(newBounds)
{
}
@@ -148,21 +175,24 @@ void AddNodeCommand::undo()
_scene->graph()->removeNode(_node);
_scene->setBounds(_oldBounds);
+
+ GraphUpdateCommand::undo();
}
void AddNodeCommand::redo()
{
- // TODO: get the current style
+ _node->attachStyle(); // in case styles have changed
_scene->graph()->addNode(_node);
NodeItem *ni = new NodeItem(_node);
_scene->nodeItems().insert(_node, ni);
_scene->addItem(ni);
_scene->setBounds(_newBounds);
+ GraphUpdateCommand::redo();
}
-AddEdgeCommand::AddEdgeCommand(TikzScene *scene, Edge *edge) :
- _scene(scene), _edge(edge)
+AddEdgeCommand::AddEdgeCommand(TikzScene *scene, Edge *edge, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _edge(edge)
{
}
@@ -174,6 +204,7 @@ void AddEdgeCommand::undo()
delete ei;
_scene->graph()->removeEdge(_edge);
+ GraphUpdateCommand::undo();
}
void AddEdgeCommand::redo()
@@ -188,10 +219,12 @@ void AddEdgeCommand::redo()
if (!_scene->graph()->nodes().isEmpty()) {
ei->stackBefore(_scene->nodeItems()[_scene->graph()->nodes().first()]);
}
+
+ GraphUpdateCommand::redo();
}
-ChangeEdgeModeCommand::ChangeEdgeModeCommand(TikzScene *scene, Edge *edge) :
- _scene(scene), _edge(edge)
+ChangeEdgeModeCommand::ChangeEdgeModeCommand(TikzScene *scene, Edge *edge, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _edge(edge)
{
}
@@ -199,10 +232,96 @@ void ChangeEdgeModeCommand::undo()
{
_edge->setBasicBendMode(!_edge->basicBendMode());
_scene->edgeItems()[_edge]->readPos();
+ GraphUpdateCommand::undo();
}
void ChangeEdgeModeCommand::redo()
{
_edge->setBasicBendMode(!_edge->basicBendMode());
_scene->edgeItems()[_edge]->readPos();
+ GraphUpdateCommand::redo();
+}
+
+ApplyStyleToNodesCommand::ApplyStyleToNodesCommand(TikzScene *scene, QString style, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _style(style), _oldStyles()
+{
+ foreach (QGraphicsItem *it, scene->selectedItems()) {
+ if (NodeItem *ni = dynamic_cast<NodeItem*>(it)) {
+ _oldStyles.insert(ni->node(), ni->node()->styleName());
+ }
+ }
+}
+
+void ApplyStyleToNodesCommand::undo()
+{
+ foreach (Node *n, _oldStyles.keys()) {
+ n->setStyleName(_oldStyles[n]);
+ n->attachStyle();
+ }
+
+ GraphUpdateCommand::undo();
+}
+
+void ApplyStyleToNodesCommand::redo()
+{
+ foreach (Node *n, _oldStyles.keys()) {
+ n->setStyleName(_style);
+ n->attachStyle();
+ }
+ GraphUpdateCommand::redo();
+}
+
+PasteCommand::PasteCommand(TikzScene *scene, Graph *graph, QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _graph(graph)
+{
+ _oldSelection = scene->selectedItems();
+}
+
+void PasteCommand::undo()
+{
+ _scene->clearSelection();
+
+ foreach (Edge *e, _graph->edges()) {
+ EdgeItem *ei = _scene->edgeItems()[e];
+ _scene->edgeItems().remove(e);
+ _scene->removeItem(ei);
+ delete ei;
+
+ _scene->graph()->removeEdge(e);
+ }
+
+ foreach (Node *n, _graph->nodes()) {
+ NodeItem *ni = _scene->nodeItems()[n];
+ _scene->nodeItems().remove(n);
+ _scene->removeItem(ni);
+ delete ni;
+
+ _scene->graph()->removeNode(n);
+ }
+
+ foreach (auto it, _oldSelection) it->setSelected(true);
+
+ GraphUpdateCommand::undo();
+}
+
+void PasteCommand::redo()
+{
+ _scene->clearSelection();
+ _scene->graph()->insertGraph(_graph);
+
+ foreach (Node *n, _graph->nodes()) {
+ n->attachStyle(); // in case styles have changed
+ NodeItem *ni = new NodeItem(n);
+ _scene->nodeItems().insert(n, ni);
+ _scene->addItem(ni);
+ ni->setSelected(true);
+ }
+
+ foreach (Edge *e, _graph->edges()) {
+ EdgeItem *ei = new EdgeItem(e);
+ _scene->edgeItems().insert(e, ei);
+ _scene->addItem(ei);
+ }
+
+ GraphUpdateCommand::redo();
}