From e840508c39b8e85328875477bfdbe0417c4e0eb0 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Fri, 6 Apr 2018 08:36:18 +0200 Subject: parse tikz feature --- src/gui/mainmenu.cpp | 14 +++++++++++++- src/gui/mainmenu.h | 1 + src/gui/mainmenu.ui | 8 +++++++- src/gui/mainwindow.cpp | 17 +++++++++++++++++ src/gui/mainwindow.h | 3 +++ src/gui/tikzscene.cpp | 33 +++++++++++++++++++++++++++++++++ src/gui/tikzscene.h | 5 +++++ src/gui/tikzview.cpp | 4 ++++ src/gui/tikzview.h | 1 + src/gui/undocommands.cpp | 17 +++++++++++++++++ src/gui/undocommands.h | 14 ++++++++++++++ 11 files changed, 115 insertions(+), 2 deletions(-) (limited to 'src/gui') diff --git a/src/gui/mainmenu.cpp b/src/gui/mainmenu.cpp index 0166caf..7ebb6af 100644 --- a/src/gui/mainmenu.cpp +++ b/src/gui/mainmenu.cpp @@ -94,7 +94,19 @@ void MainMenu::on_actionDeselect_All_triggered() // Tikz void MainMenu::on_actionParse_triggered() { - // TODO + MainWindow *win = tikzit->activeWindow(); + if (win != 0) { + win->tikzScene()->parseTikz(win->tikzSource()); + } +} + +void MainMenu::on_actionRevert_triggered() +{ + MainWindow *win = tikzit->activeWindow(); + if (win != 0) { + win->tikzDocument()->refreshTikz(); + win->tikzScene()->setEnabled(true); + } } diff --git a/src/gui/mainmenu.h b/src/gui/mainmenu.h index ee167e6..103a74a 100644 --- a/src/gui/mainmenu.h +++ b/src/gui/mainmenu.h @@ -35,6 +35,7 @@ public slots: // Tikz void on_actionParse_triggered(); + void on_actionRevert_triggered(); // View void on_actionZoom_In_triggered(); diff --git a/src/gui/mainmenu.ui b/src/gui/mainmenu.ui index 2f15d5a..ccd6c38 100644 --- a/src/gui/mainmenu.ui +++ b/src/gui/mainmenu.ui @@ -43,6 +43,7 @@ Tikz + @@ -157,7 +158,7 @@ - Parse + Parse Tikz Ctrl+T @@ -184,6 +185,11 @@ Exit + + + Revert Tikz + + diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 9ce340a..9436eb3 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -12,6 +12,7 @@ #include #include #include +#include int MainWindow::_numWindows = 0; @@ -32,8 +33,11 @@ MainWindow::MainWindow(QWidget *parent) : addDockWidget(Qt::RightDockWidgetArea, _stylePalette); + _tikzScene = new TikzScene(_tikzDocument, _toolPalette, _stylePalette, this); ui->tikzView->setScene(_tikzScene); + + _pristine = true; @@ -93,6 +97,11 @@ StylePalette *MainWindow::stylePalette() const return _stylePalette; } +QString MainWindow::tikzSource() +{ + return ui->tikzSource->toPlainText(); +} + void MainWindow::updateFileName() { setWindowTitle("TiKZiT - " + _tikzDocument->shortName()); @@ -100,7 +109,10 @@ void MainWindow::updateFileName() void MainWindow::refreshTikz() { + // don't emit textChanged() when we update the tikz + ui->tikzSource->blockSignals(true); ui->tikzSource->setText(_tikzDocument->tikz()); + ui->tikzSource->blockSignals(false); } ToolPalette *MainWindow::toolPalette() const @@ -133,4 +145,9 @@ bool MainWindow::pristine() const return _pristine; } +void MainWindow::on_tikzSource_textChanged() +{ + if (_tikzScene->enabled()) _tikzScene->setEnabled(false); +} + diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index facce2b..dc69fbc 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -36,10 +36,13 @@ public: TikzDocument *tikzDocument() const; ToolPalette *toolPalette() const; StylePalette *stylePalette() const; + QString tikzSource(); void updateFileName(); void refreshTikz(); +public slots: + void on_tikzSource_textChanged(); protected: void closeEvent(QCloseEvent *event); void changeEvent(QEvent *event); diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index ffc111c..a650961 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -80,6 +80,8 @@ void TikzScene::graphReplaced() void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) { + if (!_enabled) return; + // current mouse position, in scene coordinates _mouseDownPos = event->scenePos(); @@ -181,6 +183,8 @@ void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if (!_enabled) return; + // current mouse position, in scene coordinates QPointF mousePos = event->scenePos(); //QRectF rb = views()[0]->rubberBandRect(); @@ -323,6 +327,8 @@ void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + if (!_enabled) return; + // current mouse position, in scene coordinates QPointF mousePos = event->scenePos(); @@ -415,6 +421,8 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void TikzScene::keyReleaseEvent(QKeyEvent *event) { + if (!_enabled) return; + if (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) { deleteSelectedItems(); } else if (event->modifiers() == Qt::NoModifier) { @@ -438,6 +446,8 @@ void TikzScene::keyReleaseEvent(QKeyEvent *event) void TikzScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { + if (!_enabled) return; + QPointF mousePos = event->scenePos(); foreach (QGraphicsItem *gi, items(mousePos)) { if (EdgeItem *ei = dynamic_cast(gi)) { @@ -462,6 +472,18 @@ void TikzScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) } } +bool TikzScene::enabled() const +{ + return _enabled; +} + +void TikzScene::setEnabled(bool enabled) +{ + _enabled = enabled; + update(); +} + + void TikzScene::applyActiveStyleToNodes() { ApplyStyleToNodesCommand *cmd = new ApplyStyleToNodesCommand(this, _styles->activeNodeStyleName()); _tikzDocument->undoStack()->push(cmd); @@ -547,6 +569,17 @@ void TikzScene::deselectAll() selectedItems().clear(); } +void TikzScene::parseTikz(QString tikz) +{ + Graph *newGraph = new Graph(this); + TikzAssembler ass(newGraph); + if (ass.parse(tikz)) { + ReplaceGraphCommand *cmd = new ReplaceGraphCommand(this, graph(), newGraph); + tikzDocument()->undoStack()->push(cmd); + setEnabled(true); + } +} + void TikzScene::getSelection(QSet &selNodes, QSet &selEdges) { foreach (QGraphicsItem *gi, selectedItems()) { diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index 7061143..3cc2e87 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -44,6 +44,10 @@ public: void pasteFromClipboard(); void selectAllNodes(); void deselectAll(); + void parseTikz(QString tikz); + bool enabled() const; + void setEnabled(bool enabled); + public slots: void graphReplaced(); @@ -73,6 +77,7 @@ private: int _oldBend; int _oldInAngle; int _oldOutAngle; + bool _enabled; void getSelection(QSet &selNodes, QSet &selEdges); QSet getSelectedNodes(); diff --git a/src/gui/tikzview.cpp b/src/gui/tikzview.cpp index 60db665..047ef50 100644 --- a/src/gui/tikzview.cpp +++ b/src/gui/tikzview.cpp @@ -32,6 +32,10 @@ void TikzView::setScene(QGraphicsScene *scene) void TikzView::drawBackground(QPainter *painter, const QRectF &rect) { + // draw a gray background if disabled + TikzScene *sc = static_cast(scene()); + if (!sc->enabled()) painter->fillRect(rect, QBrush(QColor(240,240,240))); + // draw the grid QPen pen1; diff --git a/src/gui/tikzview.h b/src/gui/tikzview.h index cb41fd4..b2006c8 100644 --- a/src/gui/tikzview.h +++ b/src/gui/tikzview.h @@ -20,6 +20,7 @@ class TikzView : public QGraphicsView Q_OBJECT public: explicit TikzView(QWidget *parent = 0); + public slots: void zoomIn(); void zoomOut(); diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp index 32fafbe..4c5d0dc 100644 --- a/src/gui/undocommands.cpp +++ b/src/gui/undocommands.cpp @@ -351,3 +351,20 @@ void ChangeLabelCommand::redo() GraphUpdateCommand::redo(); } + +ReplaceGraphCommand::ReplaceGraphCommand(TikzScene *scene, Graph *oldGraph, Graph *newGraph, QUndoCommand *parent) : + GraphUpdateCommand(scene, parent), _oldGraph(oldGraph), _newGraph(newGraph) +{ +} + +void ReplaceGraphCommand::undo() +{ + _scene->tikzDocument()->setGraph(_oldGraph); + _scene->graphReplaced(); +} + +void ReplaceGraphCommand::redo() +{ + _scene->tikzDocument()->setGraph(_newGraph); + _scene->graphReplaced(); +} diff --git a/src/gui/undocommands.h b/src/gui/undocommands.h index e716458..a0abb26 100644 --- a/src/gui/undocommands.h +++ b/src/gui/undocommands.h @@ -146,4 +146,18 @@ private: QString _newLabel; }; +class ReplaceGraphCommand : public GraphUpdateCommand +{ +public: + explicit ReplaceGraphCommand(TikzScene *scene, + Graph *oldGraph, + Graph *newGraph, + QUndoCommand *parent = 0); + void undo() override; + void redo() override; +private: + Graph *_oldGraph; + Graph *_newGraph; +}; + #endif // UNDOCOMMANDS_H -- cgit v1.2.3