From 3cea1514203a451c0a8806d276807863b463a78f Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Sat, 17 Mar 2018 19:01:02 -0400 Subject: added saving, style application, and copy and paste --- src/gui/undocommands.cpp | 147 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 133 insertions(+), 14 deletions(-) (limited to 'src/gui/undocommands.cpp') 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 +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 oldNodePositions, QMap 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 deleteNodes, QMap deleteEdges, - QSet selEdges) : - _scene(scene), _deleteNodes(deleteNodes), - _deleteEdges(deleteEdges), _selEdges(selEdges) + QSet 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(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(); } -- cgit v1.2.3