From 15d97051f0b5105a2765fc068ae980e36195434c Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Fri, 18 Jan 2019 15:30:10 +0100 Subject: fixed CTRL key bug and added option to auto-select new edges --- src/gui/preferencedialog.cpp | 4 +++- src/gui/preferencedialog.ui | 16 +++++++++++++++- src/gui/tikzscene.cpp | 42 +++++++++++++++++++++++++++++++----------- src/gui/tikzscene.h | 5 +++-- src/gui/undocommands.cpp | 31 ++++++++++++++++++++++++++----- src/gui/undocommands.h | 5 ++++- 6 files changed, 82 insertions(+), 21 deletions(-) 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()); - 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 @@ 0 0 - 345 + 400 176 @@ -220,6 +220,20 @@ + + + + Auto-select new edges + + + + + + + + + + diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index 9ef4c20..983cf18 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() { @@ -509,6 +512,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 +597,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 selNodes; + QSet selEdges; + if (selectEdge) getSelection(selNodes, selEdges); + AddEdgeCommand *cmd = new AddEdgeCommand(this, e, selectEdge, + selNodes, selEdges); _tikzDocument->undoStack()->push(cmd); } _edgeStartNodeItem = nullptr; @@ -618,12 +628,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 +649,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 +672,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 selNodes; QSet 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 +728,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 +849,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 @@ -983,7 +1003,7 @@ void TikzScene::rotateNodes(bool clockwise) } -void TikzScene::getSelection(QSet &selNodes, QSet &selEdges) +void TikzScene::getSelection(QSet &selNodes, QSet &selEdges) const { foreach (QGraphicsItem *gi, selectedItems()) { if (NodeItem *ni = dynamic_cast(gi)) selNodes << ni->node(); @@ -991,7 +1011,7 @@ void TikzScene::getSelection(QSet &selNodes, QSet &selEdges) } } -QSet TikzScene::getSelectedNodes() +QSet TikzScene::getSelectedNodes() const { QSet selNodes; foreach (QGraphicsItem *gi, selectedItems()) { diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index e2068eb..0d3aadf 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -80,8 +80,9 @@ public: void reverseSelectedEdges(); - void getSelection(QSet &selNodes, QSet &selEdges); - QSet getSelectedNodes(); + void getSelection(QSet &selNodes, QSet &selEdges) const; + QSet getSelectedNodes() const; + void refreshSceneBounds(); bool highlightHeads() const; diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp index 91509ed..8ad15d0 100644 --- a/src/gui/undocommands.cpp +++ b/src/gui/undocommands.cpp @@ -20,6 +20,7 @@ #include "nodeitem.h" #include "edgeitem.h" +#include #include GraphUpdateCommand::GraphUpdateCommand(TikzScene *scene, QUndoCommand *parent) : QUndoCommand(parent), _scene(scene) @@ -217,8 +218,14 @@ 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 selNodes, + QSet selEdges, + QUndoCommand *parent) : + GraphUpdateCommand(scene, parent), _edge(edge), + _selectEdge(selectEdge), _selNodes(selNodes), _selEdges(selEdges) { } @@ -231,24 +238,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..94b98be 100644 --- a/src/gui/undocommands.h +++ b/src/gui/undocommands.h @@ -121,11 +121,14 @@ private: class AddEdgeCommand : public GraphUpdateCommand { public: - explicit AddEdgeCommand(TikzScene *scene, Edge *edge, QUndoCommand *parent = nullptr); + explicit AddEdgeCommand(TikzScene *scene, Edge *edge, bool selectEdge, QSet selNodes, QSet selEdges, QUndoCommand *parent = nullptr); void undo() override; void redo() override; private: + bool _selectEdge; Edge *_edge; + QSet _selNodes; + QSet _selEdges; }; class ChangeEdgeModeCommand : public GraphUpdateCommand -- cgit v1.2.3