summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gspreemann@gmail.com>2019-01-25 11:37:59 +0100
committerGard Spreemann <gspreemann@gmail.com>2019-01-25 11:37:59 +0100
commit3a5e53720d7c648f98fdfb8bbb8091cb7f17d869 (patch)
tree98a2d97075861094f4c9fcea244222ce2649198c
parent8c5a101a2009a9f5f1e3976f51f23e0f7da109aa (diff)
parent539bc84f39ffaff04c99b7d10aac60275588dc79 (diff)
Merge tag 'v2.1.3' into debian/sid
-rw-r--r--.gitignore1
-rwxr-xr-x[-rw-r--r--]scripts/gh-get.py0
-rwxr-xr-x[-rw-r--r--]scripts/gh-list.py0
-rwxr-xr-x[-rw-r--r--]scripts/gh-push.py0
-rw-r--r--src/data/edge.cpp10
-rw-r--r--src/gui/mainmenu.cpp6
-rw-r--r--src/gui/mainmenu.h1
-rw-r--r--src/gui/mainmenu.ui9
-rw-r--r--src/gui/mainwindow.cpp11
-rw-r--r--src/gui/nodeitem.cpp43
-rw-r--r--src/gui/nodeitem.h1
-rw-r--r--src/gui/preferencedialog.cpp4
-rw-r--r--src/gui/preferencedialog.ui16
-rw-r--r--src/gui/previewwindow.cpp4
-rw-r--r--src/gui/stylepalette.cpp15
-rw-r--r--src/gui/stylepalette.h1
-rw-r--r--src/gui/tikzscene.cpp105
-rw-r--r--src/gui/tikzscene.h8
-rw-r--r--src/gui/undocommands.cpp41
-rw-r--r--src/gui/undocommands.h11
-rw-r--r--src/tikzit.h2
-rw-r--r--tikzit.pro2
22 files changed, 226 insertions, 65 deletions
diff --git a/.gitignore b/.gitignore
index 2c5a2d5..2f1a07c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+scripts/*.pyc
tex/sample/Output
tex/sample/sample.pdf
*.synctex.gz
diff --git a/scripts/gh-get.py b/scripts/gh-get.py
index bf95d97..bf95d97 100644..100755
--- a/scripts/gh-get.py
+++ b/scripts/gh-get.py
diff --git a/scripts/gh-list.py b/scripts/gh-list.py
index a2e7955..a2e7955 100644..100755
--- a/scripts/gh-list.py
+++ b/scripts/gh-list.py
diff --git a/scripts/gh-push.py b/scripts/gh-push.py
index dd3b940..dd3b940 100644..100755
--- a/scripts/gh-push.py
+++ b/scripts/gh-push.py
diff --git a/src/data/edge.cpp b/src/data/edge.cpp
index 4803547..0bd49e8 100644
--- a/src/data/edge.cpp
+++ b/src/data/edge.cpp
@@ -57,8 +57,14 @@ Edge::Edge(Node *s, Node *t, QObject *parent) :
Edge *Edge::copy(QMap<Node*,Node*> *nodeTable)
{
Edge *e;
- if (nodeTable == nullptr) e = new Edge(_source, _target);
- else e = new Edge(nodeTable->value(_source), nodeTable->value(_target));
+ if (nodeTable == nullptr) {
+ e = new Edge(_source, _target);
+ } else {
+ Node *s = nodeTable->value(_source);
+ Node *t = nodeTable->value(_target);
+ e = new Edge((s != nullptr) ? s : _source,
+ (t != nullptr) ? t : _target);
+ }
e->setData(_data->copy());
e->setBasicBendMode(_basicBendMode);
e->setBend(_bend);
diff --git a/src/gui/mainmenu.cpp b/src/gui/mainmenu.cpp
index d291390..35ab736 100644
--- a/src/gui/mainmenu.cpp
+++ b/src/gui/mainmenu.cpp
@@ -233,6 +233,12 @@ void MainMenu::on_actionReverse_Edge_Direction_triggered()
tikzit->activeWindow()->tikzScene()->reverseSelectedEdges();
}
+void MainMenu::on_actionMerge_Nodes_triggered()
+{
+ if (tikzit->activeWindow() != 0)
+ tikzit->activeWindow()->tikzScene()->mergeNodes();
+}
+
// Tikz
void MainMenu::on_actionParse_triggered()
diff --git a/src/gui/mainmenu.h b/src/gui/mainmenu.h
index 287019c..51d7d3c 100644
--- a/src/gui/mainmenu.h
+++ b/src/gui/mainmenu.h
@@ -66,6 +66,7 @@ public slots:
void on_actionExtendLeft_triggered();
void on_actionExtendRight_triggered();
void on_actionReverse_Edge_Direction_triggered();
+ void on_actionMerge_Nodes_triggered();
// Tools
void on_actionParse_triggered();
diff --git a/src/gui/mainmenu.ui b/src/gui/mainmenu.ui
index ddba6f0..692f82e 100644
--- a/src/gui/mainmenu.ui
+++ b/src/gui/mainmenu.ui
@@ -73,6 +73,7 @@
<addaction name="menuReorder"/>
<addaction name="menuTransform"/>
<addaction name="actionReverse_Edge_Direction"/>
+ <addaction name="actionMerge_Nodes"/>
</widget>
<widget class="QMenu" name="menuTikz">
<property name="title">
@@ -374,6 +375,14 @@
<string>Ctrl+/</string>
</property>
</action>
+ <action name="actionMerge_Nodes">
+ <property name="text">
+ <string>Merge Nodes</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+M</string>
+ </property>
+ </action>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
<addaction name="menuView"/>
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index c450b5b..71fea63 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -46,8 +46,8 @@ MainWindow::MainWindow(QWidget *parent) :
_menu->setParent(this);
setMenuBar(_menu);
- QVariant geom = settings.value("geometry-main");
- QVariant state = settings.value("windowState-main");
+ QVariant geom = settings.value(QString("geometry-main-qt") + qVersion());
+ QVariant state = settings.value(QString("windowState-main-qt") + qVersion());
if (geom.isValid()) {
restoreGeometry(geom.toByteArray());
@@ -108,11 +108,10 @@ QSplitter *MainWindow::splitter() const {
void MainWindow::closeEvent(QCloseEvent *event)
{
- //qDebug() << "got close event";
-
+ // store qt version in window geometry keys to avoid strange behaviour w/ multiple Qt's on one system
QSettings settings("tikzit", "tikzit");
- settings.setValue("geometry-main", saveGeometry());
- settings.setValue("windowState-main", saveState(2));
+ settings.setValue(QString("geometry-main-qt") + qVersion(), saveGeometry());
+ settings.setValue(QString("windowState-main-qt") + qVersion(), saveState(2));
if (!_tikzDocument->isClean()) {
QString nm = _tikzDocument->shortName();
diff --git a/src/gui/nodeitem.cpp b/src/gui/nodeitem.cpp
index 8907573..78fe66e 100644
--- a/src/gui/nodeitem.cpp
+++ b/src/gui/nodeitem.cpp
@@ -51,15 +51,21 @@ void NodeItem::writePos()
QRectF NodeItem::labelRect() const {
QString label = _node->label();
- //QFont f("Courier", 9);
QFontMetrics fm(Tikzit::LABEL_FONT);
-
QRectF rect = fm.boundingRect(label);
- //rect.adjust(-2,-2,2,2);
rect.moveCenter(QPointF(0,0));
return rect;
}
+QRectF NodeItem::outerLabelRect() const {
+ QString label = _node->data()->property("label");
+ label.replace(QRegularExpression("^[^:]*:"), "");
+ QFontMetrics fm(Tikzit::LABEL_FONT);
+ QRectF rect = fm.boundingRect(label);
+ rect.moveCenter(QPointF(0, -0.5 * GLOBAL_SCALEF));
+ return rect;
+}
+
void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
if (_node->style()->isNone()) {
@@ -99,6 +105,24 @@ void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidge
painter->drawText(rect, Qt::AlignCenter, _node->label());
}
+ if (_node->data()->hasProperty("label")) {
+ QString label = _node->data()->property("label");
+ label.replace(QRegularExpression("^[^:]*:"), "");
+
+ QRectF rect = outerLabelRect();
+ QPen pen(QColor(0,0,200,120));
+ QVector<qreal> d;
+ d << 2.0 << 2.0;
+ pen.setDashPattern(d);
+ painter->setPen(pen);
+ painter->setBrush(QBrush(QColor(100,255,255,120)));
+ painter->drawRect(rect);
+
+ painter->setPen(QPen(Qt::black));
+ painter->setFont(Tikzit::LABEL_FONT);
+ painter->drawText(rect, Qt::AlignCenter, label);
+ }
+
if (isSelected()) {
QPainterPath sh = shape();
QPainterPathStroker stroker;
@@ -134,14 +158,11 @@ void NodeItem::updateBounds()
{
prepareGeometryChange();
QString label = _node->label();
- if (label != "") {
- //QFontMetrics fm(Tikzit::LABEL_FONT);
- //QRectF labelRect = fm.boundingRect(label);
- //labelRect.moveCenter(QPointF(0, 0));
- _boundingRect = labelRect().united(shape().boundingRect()).adjusted(-4, -4, 4, 4);
- } else {
- _boundingRect = shape().boundingRect().adjusted(-4, -4, 4, 4);
- }
+ QString outerLabel = _node->data()->property("label");
+ QRectF rect = shape().boundingRect();
+ if (label != "") rect = rect.united(labelRect());
+ if (outerLabel != "") rect = rect.united(outerLabelRect());
+ _boundingRect = rect.adjusted(-4, -4, 4, 4);
}
Node *NodeItem::node() const
diff --git a/src/gui/nodeitem.h b/src/gui/nodeitem.h
index 5be4f3e..df996f8 100644
--- a/src/gui/nodeitem.h
+++ b/src/gui/nodeitem.h
@@ -45,6 +45,7 @@ public:
private:
Node *_node;
QRectF labelRect() const;
+ QRectF outerLabelRect() const;
QRectF _boundingRect;
};
diff --git a/src/gui/preferencedialog.cpp b/src/gui/preferencedialog.cpp
index 06159af..14cacf0 100644
--- a/src/gui/preferencedialog.cpp
+++ b/src/gui/preferencedialog.cpp
@@ -26,10 +26,11 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
setColor(ui->minorColor, settings.value("grid-color-minor",
QColor(250,250,255)).value<QColor>());
-
connect(ui->axesColor, SIGNAL(clicked()), this, SLOT(colorClick()));
connect(ui->majorColor, SIGNAL(clicked()), this, SLOT(colorClick()));
connect(ui->minorColor, SIGNAL(clicked()), this, SLOT(colorClick()));
+
+ ui->selectNewEdges->setChecked(settings.value("select-new-edges", false).toBool());
}
PreferenceDialog::~PreferenceDialog()
@@ -45,6 +46,7 @@ void PreferenceDialog::accept()
settings.setValue("grid-color-axes", color(ui->axesColor));
settings.setValue("grid-color-major", color(ui->majorColor));
settings.setValue("grid-color-minor", color(ui->minorColor));
+ settings.setValue("select-new-edges", ui->selectNewEdges->isChecked());
QDialog::accept();
}
diff --git a/src/gui/preferencedialog.ui b/src/gui/preferencedialog.ui
index 9a32e7d..80bdc57 100644
--- a/src/gui/preferencedialog.ui
+++ b/src/gui/preferencedialog.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>345</width>
+ <width>400</width>
<height>176</height>
</rect>
</property>
@@ -220,6 +220,20 @@
</property>
</widget>
</item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Auto-select new edges</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QCheckBox" name="selectNewEdges">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
diff --git a/src/gui/previewwindow.cpp b/src/gui/previewwindow.cpp
index 2f47efd..acce1a1 100644
--- a/src/gui/previewwindow.cpp
+++ b/src/gui/previewwindow.cpp
@@ -44,7 +44,7 @@ PreviewWindow::PreviewWindow(QWidget *parent) :
QSettings settings("tikzit", "tikzit");
ui->setupUi(this);
- QVariant geom = settings.value("geometry-preview");
+ QVariant geom = settings.value(QString("geometry-preview-qt") + qVersion());
if (geom.isValid()) {
restoreGeometry(geom.toByteArray());
@@ -150,7 +150,7 @@ void PreviewWindow::setStatus(PreviewWindow::Status status)
void PreviewWindow::closeEvent(QCloseEvent *e) {
QSettings settings("tikzit", "tikzit");
- settings.setValue("geometry-preview", saveGeometry());
+ settings.setValue(QString("geometry-preview-qt") + qVersion(), saveGeometry());
QDialog::closeEvent(e);
}
diff --git a/src/gui/stylepalette.cpp b/src/gui/stylepalette.cpp
index af096c7..15ed4c2 100644
--- a/src/gui/stylepalette.cpp
+++ b/src/gui/stylepalette.cpp
@@ -35,15 +35,6 @@ StylePalette::StylePalette(QWidget *parent) :
{
ui->setupUi(this);
-// QSettings settings("tikzit", "tikzit");
-// QVariant geom = settings.value("style-palette-geometry");
-// if (geom != QVariant()) {
-// restoreGeometry(geom.toByteArray());
-// }
-
-// _nodeModel = new QStandardItemModel(this);
-// _edgeModel = new QStandardItemModel(this);
-
ui->styleListView->setModel(tikzit->styles()->nodeStyles());
ui->styleListView->setViewMode(QListView::IconMode);
ui->styleListView->setMovement(QListView::Static);
@@ -180,12 +171,6 @@ void StylePalette::on_currentCategory_currentTextChanged(const QString &cat)
// if (tikzit->activeWindow() != 0) tikzit->activeWindow()->tikzScene()->applyActiveStyleToNodes();
//}
-void StylePalette::closeEvent(QCloseEvent *event)
-{
- QSettings settings("tikzit", "tikzit");
- settings.setValue("style-palette-geometry", saveGeometry());
- QDockWidget::closeEvent(event);
-}
void StylePalette::resizeEvent(QResizeEvent *event)
{
diff --git a/src/gui/stylepalette.h b/src/gui/stylepalette.h
index e83f961..f27cd4b 100644
--- a/src/gui/stylepalette.h
+++ b/src/gui/stylepalette.h
@@ -56,7 +56,6 @@ private:
Ui::StylePalette *ui;
protected:
- void closeEvent(QCloseEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
};
diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp
index 9ef4c20..4577981 100644
--- a/src/gui/tikzscene.cpp
+++ b/src/gui/tikzscene.cpp
@@ -67,6 +67,9 @@ TikzScene::TikzScene(TikzDocument *tikzDocument, ToolPalette *tools,
_rubberBandItem->setVisible(false);
addItem(_rubberBandItem);
+
+ _highlightHeads = false;
+ _highlightTails = false;
}
TikzScene::~TikzScene() {
@@ -183,6 +186,66 @@ void TikzScene::extendSelectionRight()
}
}
+void TikzScene::mergeNodes()
+{
+ refreshZIndices();
+ QSet<Node*> selNodes;
+ QSet<Edge*> selEdges;
+ getSelection(selNodes, selEdges);
+
+ // build a map from locations to a chosen node at that location
+ QMap<QPair<int,int>,Node*> m;
+ foreach (Node *n, selNodes) {
+ // used fixed precision for hashing/comparing locations
+ QPair<int,int> fpPoint(
+ static_cast<int>(n->point().x() * 1000.0),
+ static_cast<int>(n->point().y() * 1000.0));
+ if (!m.contains(fpPoint) ||
+ _nodeItems[m[fpPoint]]->zValue() < _nodeItems[n]->zValue())
+ {
+ m.insert(fpPoint, n);
+ }
+ }
+
+ // build a second map from nodes to the node they will be merged with
+ QMap<Node*,Node*> m1;
+ foreach (Node *n, graph()->nodes()) {
+ QPair<int,int> fpPoint(
+ static_cast<int>(n->point().x() * 1000.0),
+ static_cast<int>(n->point().y() * 1000.0));
+ Node *n1 = m[fpPoint];
+ if (n1 != nullptr && n1 != n) m1.insert(n, n1);
+ }
+
+ _tikzDocument->undoStack()->beginMacro("Merge nodes");
+
+ // copy adjacent edges from nodes that will be deleted
+ foreach (Edge *e, graph()->edges()) {
+ if (m1.contains(e->source()) || m1.contains(e->target())) {
+ Edge *e1 = e->copy(&m1);
+ AddEdgeCommand *cmd = new AddEdgeCommand(this, e1);
+ _tikzDocument->undoStack()->push(cmd);
+ }
+ }
+
+ // delete nodes
+ QMap<int,Node*> delNodes;
+ QMap<int,Edge*> delEdges;
+ for (int i = 0; i < _tikzDocument->graph()->nodes().length(); ++i) {
+ Node *n = _tikzDocument->graph()->nodes()[i];
+ if (m1.contains(n)) delNodes.insert(i, n);
+ }
+ for (int i = 0; i < _tikzDocument->graph()->edges().length(); ++i) {
+ Edge *e = _tikzDocument->graph()->edges()[i];
+ if (m1.contains(e->source()) || m1.contains(e->target())) delEdges.insert(i, e);
+ }
+ DeleteCommand *cmd = new DeleteCommand(this, delNodes, delEdges,
+ selNodes, selEdges);
+ _tikzDocument->undoStack()->push(cmd);
+
+ _tikzDocument->undoStack()->endMacro();
+}
+
void TikzScene::reorderSelection(bool toFront)
{
QVector<Node*> nodeOrd, nodeOrd1;
@@ -509,6 +572,7 @@ void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (!_enabled) return;
+ QSettings settings("tikzit", "tikzit");
// current mouse position, in scene coordinates
QPointF mousePos = event->scenePos();
@@ -593,7 +657,13 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
if (_edgeStartNodeItem != nullptr && _edgeEndNodeItem != nullptr) {
Edge *e = new Edge(_edgeStartNodeItem->node(), _edgeEndNodeItem->node(), _tikzDocument);
e->setStyleName(_styles->activeEdgeStyleName());
- AddEdgeCommand *cmd = new AddEdgeCommand(this, e);
+
+ bool selectEdge = settings.value("select-new-edges", false).toBool();
+ QSet<Node*> selNodes;
+ QSet<Edge*> selEdges;
+ if (selectEdge) getSelection(selNodes, selEdges);
+ AddEdgeCommand *cmd = new AddEdgeCommand(this, e, selectEdge,
+ selNodes, selEdges);
_tikzDocument->undoStack()->push(cmd);
}
_edgeStartNodeItem = nullptr;
@@ -618,12 +688,17 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
void TikzScene::keyReleaseEvent(QKeyEvent *event)
{
+ //qDebug() << "keyrelease:" << QString::number(event->key(), 16);
+ //qDebug() << "modifiers:" << QString::number(QApplication::queryKeyboardModifiers(), 16);
if (!_enabled) return;
+ // slower, but seems to be more reliable than event->modifiers()
+ Qt::KeyboardModifiers mod = QApplication::queryKeyboardModifiers();
+
// clear highlighting for edge bends (if there was any)
- if (event->modifiers() & Qt::ControlModifier) {
+ if (mod & Qt::ControlModifier) {
// it could be the case the user has released shift and is still holding control
- bool head = !(event->modifiers() & Qt::ShiftModifier);
+ bool head = !(mod & Qt::ShiftModifier);
_highlightHeads = head;
_highlightTails = !head;
} else {
@@ -634,7 +709,7 @@ void TikzScene::keyReleaseEvent(QKeyEvent *event)
if (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) {
deleteSelectedItems();
- } else if (event->modifiers() == Qt::NoModifier) {
+ } else if (mod == Qt::NoModifier) {
switch(event->key()) {
case Qt::Key_S:
tikzit->activeWindow()->toolPalette()->setCurrentTool(ToolPalette::SELECT);
@@ -657,21 +732,26 @@ void TikzScene::keyReleaseEvent(QKeyEvent *event)
void TikzScene::keyPressEvent(QKeyEvent *event)
{
+ //qDebug() << "keypress:" << QString::number(event->key(), 16);
+ //qDebug() << "modifiers:" << QString::number(QApplication::queryKeyboardModifiers(), 16);
bool capture = false;
+ // slower, but seems to be more reliable than event->modifiers()
+ Qt::KeyboardModifiers mod = QApplication::queryKeyboardModifiers();
+
if (event->key() == Qt::Key_QuoteLeft) {
capture = true;
_styles->nextNodeStyle();
}
- if (event->modifiers() & Qt::ControlModifier) {
+ if (mod & Qt::ControlModifier) {
QSet<Node*> selNodes;
QSet<Edge*> selEdges;
getSelection(selNodes, selEdges);
if (!selNodes.isEmpty()) {
QPointF delta(0,0);
- qreal shift = (event->modifiers() & Qt::ShiftModifier) ? 1.0 : 10.0;
+ qreal shift = (mod & Qt::ShiftModifier) ? 1.0 : 10.0;
switch(event->key()) {
case Qt::Key_Left:
delta.setX(-0.025 * shift);
@@ -708,7 +788,7 @@ void TikzScene::keyPressEvent(QKeyEvent *event)
int deltaAngle = 0;
qreal deltaWeight = 0.0;
- bool head = !(event->modifiers() & Qt::ShiftModifier);
+ bool head = !(mod & Qt::ShiftModifier);
_highlightHeads = head;
_highlightTails = !head;
@@ -829,12 +909,12 @@ void TikzScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
bool TikzScene::highlightTails() const
{
- return _highlightTails;
+ return _highlightTails && getSelectedNodes().isEmpty();
}
bool TikzScene::highlightHeads() const
{
- return _highlightHeads;
+ return _highlightHeads && getSelectedNodes().isEmpty();
}
bool TikzScene::enabled() const
@@ -891,7 +971,8 @@ void TikzScene::deleteSelectedItems()
//qDebug() << "nodes:" << deleteNodes;
//qDebug() << "edges:" << deleteEdges;
- DeleteCommand *cmd = new DeleteCommand(this, deleteNodes, deleteEdges, selEdges);
+ DeleteCommand *cmd = new DeleteCommand(this, deleteNodes, deleteEdges,
+ selNodes, selEdges);
_tikzDocument->undoStack()->push(cmd);
}
@@ -983,7 +1064,7 @@ void TikzScene::rotateNodes(bool clockwise)
}
-void TikzScene::getSelection(QSet<Node *> &selNodes, QSet<Edge *> &selEdges)
+void TikzScene::getSelection(QSet<Node *> &selNodes, QSet<Edge *> &selEdges) const
{
foreach (QGraphicsItem *gi, selectedItems()) {
if (NodeItem *ni = dynamic_cast<NodeItem*>(gi)) selNodes << ni->node();
@@ -991,7 +1072,7 @@ void TikzScene::getSelection(QSet<Node *> &selNodes, QSet<Edge *> &selEdges)
}
}
-QSet<Node *> TikzScene::getSelectedNodes()
+QSet<Node *> TikzScene::getSelectedNodes() const
{
QSet<Node*> selNodes;
foreach (QGraphicsItem *gi, selectedItems()) {
diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h
index e2068eb..f8dc7ec 100644
--- a/src/gui/tikzscene.h
+++ b/src/gui/tikzscene.h
@@ -75,17 +75,19 @@ public:
void extendSelectionLeft();
void extendSelectionRight();
+ void mergeNodes();
+
void reorderSelection(bool toFront);
void reverseSelectedEdges();
- void getSelection(QSet<Node*> &selNodes, QSet<Edge*> &selEdges);
- QSet<Node*> getSelectedNodes();
+ void getSelection(QSet<Node*> &selNodes, QSet<Edge*> &selEdges) const;
+ QSet<Node*> getSelectedNodes() const;
+
void refreshSceneBounds();
bool highlightHeads() const;
-
bool highlightTails() const;
public slots:
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();
}
diff --git a/src/gui/undocommands.h b/src/gui/undocommands.h
index 42fed30..40f0a3b 100644
--- a/src/gui/undocommands.h
+++ b/src/gui/undocommands.h
@@ -95,6 +95,7 @@ public:
explicit DeleteCommand(TikzScene *scene,
QMap<int,Node*> deleteNodes,
QMap<int,Edge*> deleteEdges,
+ QSet<Node*> selNodes,
QSet<Edge*> selEdges,
QUndoCommand *parent = nullptr);
void undo() override;
@@ -102,6 +103,7 @@ public:
private:
QMap<int,Node*> _deleteNodes;
QMap<int,Edge*> _deleteEdges;
+ QSet<Node*> _selNodes;
QSet<Edge*> _selEdges;
};
@@ -121,11 +123,18 @@ private:
class AddEdgeCommand : public GraphUpdateCommand
{
public:
- explicit AddEdgeCommand(TikzScene *scene, Edge *edge, QUndoCommand *parent = nullptr);
+ explicit AddEdgeCommand(TikzScene *scene, Edge *edge,
+ bool selectEdge=false,
+ QSet<Node *> selNodes=QSet<Node*>(),
+ QSet<Edge *> selEdges=QSet<Edge*>(),
+ QUndoCommand *parent = nullptr);
void undo() override;
void redo() override;
private:
Edge *_edge;
+ bool _selectEdge;
+ QSet<Node*> _selNodes;
+ QSet<Edge*> _selEdges;
};
class ChangeEdgeModeCommand : public GraphUpdateCommand
diff --git a/src/tikzit.h b/src/tikzit.h
index 855efeb..4b99062 100644
--- a/src/tikzit.h
+++ b/src/tikzit.h
@@ -49,7 +49,7 @@
#ifndef TIKZIT_H
#define TIKZIT_H
-#define TIKZIT_VERSION "2.1.2"
+#define TIKZIT_VERSION "2.1.3"
#include "mainwindow.h"
#include "mainmenu.h"
diff --git a/tikzit.pro b/tikzit.pro
index db1773c..83a8820 100644
--- a/tikzit.pro
+++ b/tikzit.pro
@@ -2,7 +2,7 @@
QT += core gui widgets network
-VERSION = 2.1.2
+VERSION = 2.1.3
test {
CONFIG += testcase