diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/mainmenu.cpp | 6 | ||||
-rw-r--r-- | src/gui/mainmenu.h | 1 | ||||
-rw-r--r-- | src/gui/mainmenu.ui | 9 | ||||
-rw-r--r-- | src/gui/mainwindow.cpp | 11 | ||||
-rw-r--r-- | src/gui/nodeitem.cpp | 43 | ||||
-rw-r--r-- | src/gui/nodeitem.h | 1 | ||||
-rw-r--r-- | src/gui/preferencedialog.cpp | 4 | ||||
-rw-r--r-- | src/gui/preferencedialog.ui | 16 | ||||
-rw-r--r-- | src/gui/previewwindow.cpp | 4 | ||||
-rw-r--r-- | src/gui/stylepalette.cpp | 15 | ||||
-rw-r--r-- | src/gui/stylepalette.h | 1 | ||||
-rw-r--r-- | src/gui/tikzscene.cpp | 105 | ||||
-rw-r--r-- | src/gui/tikzscene.h | 8 | ||||
-rw-r--r-- | src/gui/undocommands.cpp | 41 | ||||
-rw-r--r-- | src/gui/undocommands.h | 11 |
15 files changed, 215 insertions, 61 deletions
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 |