summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2018-09-23 12:30:08 +0200
committerAleks Kissinger <aleks0@gmail.com>2018-09-23 12:30:08 +0200
commitfa3d7da179b25d2ece40b56f5f9adddb3831906e (patch)
treed72e9857113920d6aeda060ec43b4dc83c4ea26f
parent1ca36f064da2a3619f0f8058f48e9f9dc6d07436 (diff)
added reordering of nodes and edges
-rw-r--r--src/data/graph.cpp10
-rw-r--r--src/data/graph.h3
-rw-r--r--src/gui/mainmenu.cpp12
-rw-r--r--src/gui/mainmenu.h2
-rw-r--r--src/gui/tikzscene.cpp29
-rw-r--r--src/gui/tikzscene.h11
-rw-r--r--src/gui/undocommands.cpp28
-rw-r--r--src/gui/undocommands.h18
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