diff options
-rw-r--r-- | src/data/graph.cpp | 10 | ||||
-rw-r--r-- | src/data/graph.h | 3 | ||||
-rw-r--r-- | src/gui/mainmenu.cpp | 12 | ||||
-rw-r--r-- | src/gui/mainmenu.h | 2 | ||||
-rw-r--r-- | src/gui/tikzscene.cpp | 29 | ||||
-rw-r--r-- | src/gui/tikzscene.h | 11 | ||||
-rw-r--r-- | src/gui/undocommands.cpp | 28 | ||||
-rw-r--r-- | src/gui/undocommands.h | 18 |
8 files changed, 109 insertions, 4 deletions
diff --git a/src/data/graph.cpp b/src/data/graph.cpp index 2c9a84e..b63289b 100644 --- a/src/data/graph.cpp +++ b/src/data/graph.cpp @@ -85,6 +85,16 @@ int Graph::maxIntName() return max;
}
+void Graph::reorderNodes(const QVector<Node *> &newOrder)
+{
+ _nodes = newOrder;
+}
+
+void Graph::reorderEdges(const QVector<Edge *> &newOrder)
+{
+ _edges = newOrder;
+}
+
QRectF Graph::realBbox()
{
//float maxX = 0.0f;
diff --git a/src/data/graph.h b/src/data/graph.h index 404fd8c..286ccdc 100644 --- a/src/data/graph.h +++ b/src/data/graph.h @@ -32,6 +32,7 @@ #include <QMultiHash>
#include <QRectF>
#include <QString>
+#include <QMap>
class Graph : public QObject
{
@@ -46,6 +47,8 @@ public: void addEdge(Edge *e, int index);
void removeEdge(Edge *e);
int maxIntName();
+ void reorderNodes(const QVector<Node*> &newOrder);
+ void reorderEdges(const QVector<Edge*> &newOrder);
QRectF boundsForNodes(QSet<Node*> ns);
QString freshNodeName();
diff --git a/src/gui/mainmenu.cpp b/src/gui/mainmenu.cpp index ca837fa..c159981 100644 --- a/src/gui/mainmenu.cpp +++ b/src/gui/mainmenu.cpp @@ -132,6 +132,18 @@ void MainMenu::on_actionRotateCCW_triggered() { tikzit->activeWindow()->tikzScene()->rotateNodes(false); } +void MainMenu::on_actionBring_to_Front_triggered() +{ + if (tikzit->activeWindow() != 0) + tikzit->activeWindow()->tikzScene()->reorderSelection(true); +} + +void MainMenu::on_actionSend_to_Back_triggered() +{ + if (tikzit->activeWindow() != 0) + tikzit->activeWindow()->tikzScene()->reorderSelection(false); +} + void MainMenu::on_actionExtendUp_triggered() { if (tikzit->activeWindow() != 0) diff --git a/src/gui/mainmenu.h b/src/gui/mainmenu.h index 7132dde..c4079bf 100644 --- a/src/gui/mainmenu.h +++ b/src/gui/mainmenu.h @@ -54,6 +54,8 @@ public slots: void on_actionReflectVertical_triggered(); void on_actionRotateCW_triggered(); void on_actionRotateCCW_triggered(); + void on_actionBring_to_Front_triggered(); + void on_actionSend_to_Back_triggered(); void on_actionExtendUp_triggered(); void on_actionExtendDown_triggered(); void on_actionExtendLeft_triggered(); diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index 39f8b76..b9afe4a 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -179,6 +179,35 @@ void TikzScene::extendSelectionRight() } } +void TikzScene::reorderSelection(bool toFront) +{ + QVector<Node*> nodeOrd, nodeOrd1; + QVector<Edge*> edgeOrd, edgeOrd1; + QSet<Node*> selNodes; + QSet<Edge*> selEdges; + getSelection(selNodes, selEdges); + foreach (Node *n, graph()->nodes()) { + if (selNodes.contains(n)) nodeOrd1 << n; + else nodeOrd << n; + } + + foreach (Edge *e, graph()->edges()) { + if (selEdges.contains(e)) edgeOrd1 << e; + else edgeOrd << e; + } + + if (toFront) { + nodeOrd += nodeOrd1; + edgeOrd += edgeOrd1; + } else { + nodeOrd = nodeOrd1 + nodeOrd; + edgeOrd = edgeOrd1 + edgeOrd; + } + + ReorderCommand *cmd = new ReorderCommand(this, graph()->nodes(), nodeOrd, graph()->edges(), edgeOrd); + _tikzDocument->undoStack()->push(cmd); +} + void TikzScene::refreshZIndices() { qreal z = 0.0; diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index b7beca9..2a3e988 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -70,16 +70,19 @@ public: void setEnabled(bool enabled); int lineNumberForSelection(); + void extendSelectionUp(); + void extendSelectionDown(); + void extendSelectionLeft(); + void extendSelectionRight(); + + void reorderSelection(bool toFront); + void getSelection(QSet<Node*> &selNodes, QSet<Edge*> &selEdges); QSet<Node*> getSelectedNodes(); public slots: void graphReplaced(); - void extendSelectionUp(); - void extendSelectionDown(); - void extendSelectionLeft(); - void extendSelectionRight(); void refreshZIndices(); protected: diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp index 7b254d1..50b81a4 100644 --- a/src/gui/undocommands.cpp +++ b/src/gui/undocommands.cpp @@ -513,3 +513,31 @@ void RotateNodesCommand::redo() _scene->refreshAdjacentEdges(_nodes.toList()); GraphUpdateCommand::redo(); } + +ReorderCommand::ReorderCommand(TikzScene *scene, + const QVector<Node *> &oldNodeOrder, + const QVector<Node *> &newNodeOrder, + const QVector<Edge *> &oldEdgeOrder, + const QVector<Edge *> &newEdgeOrder, + QUndoCommand *parent) : + GraphUpdateCommand(scene, parent), + _oldNodeOrder(oldNodeOrder), _newNodeOrder(newNodeOrder), + _oldEdgeOrder(oldEdgeOrder), _newEdgeOrder(newEdgeOrder) +{ +} + +void ReorderCommand::undo() +{ + _scene->graph()->reorderNodes(_oldNodeOrder); + _scene->graph()->reorderEdges(_oldEdgeOrder); + _scene->refreshZIndices(); + GraphUpdateCommand::undo(); +} + +void ReorderCommand::redo() +{ + _scene->graph()->reorderNodes(_newNodeOrder); + _scene->graph()->reorderEdges(_newEdgeOrder); + _scene->refreshZIndices(); + GraphUpdateCommand::redo(); +} diff --git a/src/gui/undocommands.h b/src/gui/undocommands.h index 688c2ba..1836892 100644 --- a/src/gui/undocommands.h +++ b/src/gui/undocommands.h @@ -219,4 +219,22 @@ private: bool _clockwise; }; +class ReorderCommand : public GraphUpdateCommand +{ +public: + explicit ReorderCommand(TikzScene *scene, + const QVector<Node*> &oldNodeOrder, + const QVector<Node*> &newNodeOrder, + const QVector<Edge*> &oldEdgeOrder, + const QVector<Edge*> &newEdgeOrder, + QUndoCommand *parent = 0); + void undo() override; + void redo() override; +private: + QVector<Node*> _oldNodeOrder; + QVector<Node*> _newNodeOrder; + QVector<Edge*> _oldEdgeOrder; + QVector<Edge*> _newEdgeOrder; +}; + #endif // UNDOCOMMANDS_H |