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.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp
index 91509ed..c5c26af 100644
--- a/src/gui/undocommands.cpp
+++ b/src/gui/undocommands.cpp
@@ -20,6 +20,7 @@
#include "nodeitem.h"
#include "edgeitem.h"
+#include <QApplication>
#include <QGraphicsView>
GraphUpdateCommand::GraphUpdateCommand(TikzScene *scene, QUndoCommand *parent) : QUndoCommand(parent), _scene(scene)
@@ -127,9 +128,12 @@ void EdgeBendCommand::redo()
DeleteCommand::DeleteCommand(TikzScene *scene,
QMap<int, Node *> deleteNodes,
QMap<int, Edge *> deleteEdges,
- QSet<Edge *> selEdges, QUndoCommand *parent) :
+ QSet<Node *> selNodes,
+ QSet<Edge *> selEdges,
+ QUndoCommand *parent) :
GraphUpdateCommand(scene, parent),
- _deleteNodes(deleteNodes), _deleteEdges(deleteEdges), _selEdges(selEdges)
+ _deleteNodes(deleteNodes), _deleteEdges(deleteEdges),
+ _selNodes(selNodes), _selEdges(selEdges)
{}
void DeleteCommand::undo()
@@ -141,7 +145,7 @@ void DeleteCommand::undo()
NodeItem *ni = new NodeItem(n);
_scene->nodeItems().insert(n, ni);
_scene->addItem(ni);
- ni->setSelected(true);
+ if (_selNodes.contains(n)) ni->setSelected(true);
}
for (auto it = _deleteEdges.begin(); it != _deleteEdges.end(); ++it) {
@@ -217,11 +221,18 @@ void AddNodeCommand::redo()
GraphUpdateCommand::redo();
}
-AddEdgeCommand::AddEdgeCommand(TikzScene *scene, Edge *edge, QUndoCommand *parent) :
- GraphUpdateCommand(scene, parent), _edge(edge)
+AddEdgeCommand::AddEdgeCommand(TikzScene *scene,
+ Edge *edge,
+ bool selectEdge,
+ QSet<Node*> selNodes,
+ QSet<Edge*> selEdges,
+ QUndoCommand *parent) :
+ GraphUpdateCommand(scene, parent), _edge(edge),
+ _selectEdge(selectEdge), _selNodes(selNodes), _selEdges(selEdges)
{
}
+
void AddEdgeCommand::undo()
{
EdgeItem *ei = _scene->edgeItems()[_edge];
@@ -231,24 +242,38 @@ void AddEdgeCommand::undo()
_scene->graph()->removeEdge(_edge);
_scene->refreshZIndices();
+
+ if (_selectEdge) {
+ foreach (NodeItem *ni, _scene->nodeItems()) {
+ ni->setSelected(_selNodes.contains(ni->node()));
+ }
+
+ foreach (EdgeItem *ei, _scene->edgeItems()) {
+ ei->setSelected(_selEdges.contains(ei->edge()));
+ }
+ }
+
GraphUpdateCommand::undo();
}
void AddEdgeCommand::redo()
{
- _edge->attachStyle(); // do for every redo, in case styles have changed
+ _edge->attachStyle(); // do for every redo, in case styles have changed
_scene->graph()->addEdge(_edge);
EdgeItem *ei = new EdgeItem(_edge);
_scene->edgeItems().insert(_edge, ei);
_scene->addItem(ei);
- // TODO: deal consistently with stacking order
- // edges should always be stacked below nodes
if (!_scene->graph()->nodes().isEmpty()) {
ei->stackBefore(_scene->nodeItems()[_scene->graph()->nodes().first()]);
}
_scene->refreshZIndices();
+
+ if (_selectEdge) {
+ _scene->clearSelection();
+ ei->setSelected(true);
+ }
GraphUpdateCommand::redo();
}