diff options
| author | Mikko Syrjä <mikko@3d-system.fi> | 2019-02-22 22:11:03 +0200 |
|---|---|---|
| committer | Mikko Syrjä <mikko@3d-system.fi> | 2019-02-22 22:11:03 +0200 |
| commit | 07599f27937b8af9a3d3a46f17e34b51d6eada2c (patch) | |
| tree | f4d84b5e1b9bbd253bcddf195cf00ba510a4dd4f | |
| parent | cddb64f0238e9a8a0975732b925cbaae211a1b65 (diff) | |
| download | symedit-07599f27937b8af9a3d3a46f17e34b51d6eada2c.tar.gz symedit-07599f27937b8af9a3d3a46f17e34b51d6eada2c.zip | |
Implemented undo and redo.
| -rw-r--r-- | Editor.qml | 8 | ||||
| -rw-r--r-- | main.qml | 51 | ||||
| -rw-r--r-- | symbol.cpp | 16 | ||||
| -rw-r--r-- | symbol.h | 8 | ||||
| -rw-r--r-- | symedit.cpp | 72 | ||||
| -rw-r--r-- | symedit.h | 24 |
6 files changed, 136 insertions, 43 deletions
@@ -150,7 +150,10 @@ Rectangle context.beginPath().rect((start.x + max + offset) * scalexy, (max - start.y + offset) * scalexy, size.width * scalexy, size.height * scalexy) if ( fill ) + { + context.fillStyle = (fill === 1 ? "black" : "white") context.fill() + } else context.stroke() } @@ -160,7 +163,10 @@ Rectangle context.beginPath().ellipse((center.x + max - radius + offset) * scalexy, (max - center.y - radius + offset) * scalexy, radius * 2 * scalexy, radius * 2 * scalexy) if ( fill ) + { + context.fillStyle = (fill === 1 ? "black" : "white") context.fill() + } else context.stroke() } @@ -229,7 +235,7 @@ Rectangle paintgrid(context) context.strokeStyle = "black" - context.fillStyle = "black" +// context.fillStyle = "black" paintsymbol(context) @@ -11,9 +11,10 @@ ApplicationWindow property real zoomscale: 1.0 property real zoomstep: 1.3 - property bool fillitem: false + property int fillitem: 0 property real linewidth: 1 property int alignment: 1 + property int textsize: 1 property int snapgrid: 1 property int tool: 0 @@ -37,8 +38,9 @@ ApplicationWindow Menu { title: qsTr("Edit") //%% - MenuItem { text: qsTr("Undo"); shortcut: "Ctrl+Z"; onTriggered: undo() } //%% - MenuItem { text: qsTr("Redo"); shortcut: "Ctrl+Y"; onTriggered: redo() } //%% + MenuItem { text: qsTr("Undo"); shortcut: "Ctrl+Z"; onTriggered: undo(true) } //%% + MenuItem { text: qsTr("Redo"); shortcut: "Ctrl+Y"; onTriggered: undo(false) } //%% +// MenuItem { text: qsTr("Redo"); shortcut: "Ctrl+Y,Ctrl+Shift+Z"; onTriggered: undo(false) } //%% MenuSeparator { } MenuItem { text: qsTr("Cut"); shortcut: "Ctrl+X"; onTriggered: cut() } //%% MenuItem { text: qsTr("Copy"); shortcut: "Ctrl+C"; onTriggered: copy() } //%% @@ -102,8 +104,8 @@ ApplicationWindow BarTool { image: "image/open_icon&48.png"; tooltip: "Open File"; onClicked: open() } //%% BarTool { image: "image/save_icon&48.png"; tooltip: "Save File"; onClicked: save() } //%% BarSeparator { } - BarTool { image: "image/undo_icon&48.png"; tooltip: "Undo Edit"; onClicked: undo() } //%% - BarTool { image: "image/redo_icon&48.png"; tooltip: "Redo Edit"; onClicked: redo() } //%% + BarTool { image: "image/undo_icon&48.png"; tooltip: "Undo Edit"; onClicked: undo(true) } //%% + BarTool { image: "image/redo_icon&48.png"; tooltip: "Redo Edit"; onClicked: undo(false) } //%% BarTool { image: "image/cut_icon&48.png"; tooltip: "Cut Symbol"; onClicked: cut() } //%% BarTool { image: "image/copy_icon&48.png"; tooltip: "Copy Symbol"; onClicked: copy() } //%% BarTool { image: "image/paste_icon&48.png"; tooltip: "Paste symbol"; onClicked: paste() } //%% @@ -129,12 +131,14 @@ ApplicationWindow { height: 32 Item { Layout.fillWidth: true } - CheckBox + Label { text: qsTr("Fill") } //%% + ComboBox { - id: fillcheck - checked: fillitem - text: qsTr("Fill") //%% - onClicked: { fillitem = !fillitem } + id: filllist + implicitWidth: 60 + model: [ 0, 1, 2 ] + onCurrentIndexChanged: { fillitem = currentIndex; editor.update() } + function setFill() { currentIndex = fillitem } } BarSeparator { } Label { text: qsTr("Snap") } //%% @@ -169,6 +173,16 @@ ApplicationWindow function setWidth() { currentIndex = linewidth - 1 } } BarSeparator { } + Label { text: qsTr("Text size") } //%% + ComboBox + { + id: sizelist + implicitWidth: 60 + model: [ 1, 2, 3, 4, 5 ] + onCurrentIndexChanged: { textsize = currentIndex + 1; editor.update() } + function setSize() { currentIndex = textsize - 1 } + } + BarSeparator { } Label { text: qsTr("Alignment") } //%% ComboBox { @@ -213,6 +227,7 @@ ApplicationWindow onFillitemChanged: { manager.setFillItem(fillitem); } onAlignmentChanged: { manager.setAlignment(alignment); } onLinewidthChanged: { manager.setLineWidth(linewidth); } + onTextsizeChanged: { manager.setTextSize(textsize); } onSnapgridChanged: { manager.setSnapGrid(snapgrid); } onToolChanged: { manager.setTool(tool); } @@ -226,10 +241,13 @@ ApplicationWindow fillitem = manager.getFillItem() alignment = manager.getAlignment() linewidth = manager.getLineWidth() + textsize = manager.getTextSize() snapgrid = manager.getSnapGrid() tool = manager.getTool() + filllist.setFill() snaplist.setSnap() + sizelist.setSize() widthlist.setWidth() alignlist.setAlign() @@ -272,14 +290,13 @@ ApplicationWindow editor.update() } - function undo() - { - //## - } - - function redo() + function undo(undo) { - //## + if ( manager.undo(undo) ) + { + symbol = manager.getSymbol() + editor.update() + } } function cut() @@ -15,18 +15,18 @@ \param value Item value. \param fill Item area fill. */ -SymEditSymbol::Item::Item(int operation, QPoint point, int value, bool fill) +SymEditSymbol::Item::Item(int operation, QPoint point, int value, int fill) : Operation(operation), Point(point), Value(value, value), Fill(fill), Align(9) { } -SymEditSymbol::Item::Item(int operation, QPoint point, QPoint value, bool fill) +SymEditSymbol::Item::Item(int operation, QPoint point, QPoint value, int fill) : Operation(operation), Point(point), Value(value), Fill(fill), Align(0) { } SymEditSymbol::Item::Item(int operation, QPoint point, QString value, int align) - : Operation(operation), Point(point), Text(value), Fill(false), Align(align) + : Operation(operation), Point(point), Text(value), Fill(0), Align(align) { } @@ -129,14 +129,14 @@ void SymEditSymbol::Clear() \param fill Item area fill. \return Reference to item. */ -SymEditSymbol::Item& SymEditSymbol::AddItem(int operation, QPoint point, int value, bool fill) +SymEditSymbol::Item& SymEditSymbol::AddItem(int operation, QPoint point, int value, int fill) { Item item(operation, point, value, fill); ActiveIndex = static_cast<int>(Items.size()); Items.push_back(item); return Items.back(); } -SymEditSymbol::Item& SymEditSymbol::AddItem(int operation, QPoint point, QPoint value, bool fill) +SymEditSymbol::Item& SymEditSymbol::AddItem(int operation, QPoint point, QPoint value, int fill) { Item item(operation, point, value, fill); ActiveIndex = static_cast<int>(Items.size()); @@ -232,9 +232,11 @@ const SymEditSymbol::Item& SymEditSymbol::GetItem(int index) const return Items.at(static_cast<size_t>(index)); } -// +//! Rotate symbol. +/*! + \param dir Positive value rotates right, negative left +*/ void SymEditSymbol::RotateSymbol(int dir) { //## } - @@ -15,8 +15,8 @@ public: class Item //!< Symbol item. { public: - Item(int operation, QPoint point, int value, bool fill); - Item(int operation, QPoint point, QPoint value, bool fill); + Item(int operation, QPoint point, int value, int fill); + Item(int operation, QPoint point, QPoint value, int fill); Item(int operation, QPoint point, QString value, int align); int Operation; //!< Item operation. @@ -31,8 +31,8 @@ public: QString& Save(QString& buffer) const; void Clear(); - Item& AddItem(int operation, QPoint point, int value, bool fill); - Item& AddItem(int operation, QPoint point, QPoint end, bool fill); + Item& AddItem(int operation, QPoint point, int value, int fill); + Item& AddItem(int operation, QPoint point, QPoint end, int fill); Item& AddItem(int operation, QPoint point, QString text, int align); void RemoveItem(int index); diff --git a/symedit.cpp b/symedit.cpp index 83fb7ea..1138d66 100644 --- a/symedit.cpp +++ b/symedit.cpp @@ -8,7 +8,7 @@ // settings functions // //! Constructor. -SymEditSettings::SymEditSettings() : FillItem(false), Alignment(9), LineWidth(1), SnapGrid(5), Tool(1) +SymEditSettings::SymEditSettings() : FillItem(0), Alignment(9), LineWidth(1), TextSize(1), SnapGrid(5), Tool(1) { } @@ -23,9 +23,10 @@ void SymEditSettings::Load() Size.setWidth(settings.value("window/width", 500).toInt()); Size.setHeight(settings.value("window/height", 500).toInt()); - FillItem = settings.value("editor/fill", false).toBool(); + FillItem = settings.value("editor/fill", 0).toInt(); Alignment = settings.value("editor/align", 9).toInt(); LineWidth = settings.value("editor/width", 1).toInt(); + TextSize = settings.value("editor/size", 1).toInt(); SnapGrid = settings.value("editor/snap", 5).toInt(); Tool = settings.value("editor/tool", 1).toInt(); } @@ -43,6 +44,7 @@ void SymEditSettings::Save() const settings.setValue("editor/fill", FillItem); settings.setValue("editor/align", Alignment); settings.setValue("editor/width", LineWidth); + settings.setValue("editor/size", TextSize); settings.setValue("editor/snap", SnapGrid); settings.setValue("editor/tool", Tool); } @@ -104,9 +106,10 @@ QSize SymEditManager::getWindowSize() const /*! \param value Setting value. */ -void SymEditManager::setFillItem(bool value) { Settings.FillItem = value; } +void SymEditManager::setFillItem(int value) { Settings.FillItem = value; } void SymEditManager::setAlignment(int value) { Settings.Alignment = value; } void SymEditManager::setLineWidth(int value) { Settings.LineWidth = value; } +void SymEditManager::setTextSize(int value) { Settings.TextSize = value; } void SymEditManager::setSnapGrid(int value) { Settings.SnapGrid = value; } void SymEditManager::setTool(int value) { Settings.Tool = value; } //@} @@ -116,9 +119,10 @@ void SymEditManager::setTool(int value) { Settings.Tool = value; } /*! \return Setting value. */ -bool SymEditManager::getFillItem() const { return Settings.FillItem; } +int SymEditManager::getFillItem() const { return Settings.FillItem; } int SymEditManager::getAlignment() const { return Settings.Alignment; } int SymEditManager::getLineWidth() const { return Settings.LineWidth; } +int SymEditManager::getTextSize() const { return Settings.TextSize; } int SymEditManager::getSnapGrid() const { return Settings.SnapGrid; } int SymEditManager::getTool() const { return Settings.Tool; } //@} @@ -141,8 +145,9 @@ QString SymEditManager::getSymbol() const \param fill Item area fill. \return Reference to item. */ -void SymEditManager::addValueItem(int operation, QPoint point, int value, bool fill) +void SymEditManager::addValueItem(int operation, QPoint point, int value, int fill) { + undosave(); Symbol.AddItem(operation, point, value, fill); } @@ -154,8 +159,9 @@ void SymEditManager::addValueItem(int operation, QPoint point, int value, bool f \param fill Item area fill. \return Reference to item. */ -void SymEditManager::addPointItem(int operation, QPoint point, QPoint value, bool fill) +void SymEditManager::addPointItem(int operation, QPoint point, QPoint value, int fill) { + undosave(); Symbol.AddItem(operation, point, value, fill); } @@ -169,12 +175,14 @@ void SymEditManager::addPointItem(int operation, QPoint point, QPoint value, boo */ void SymEditManager::addTextItem(int operation, QPoint point, QString value, int align) { + undosave(); Symbol.AddItem(operation, point, value, align); } //! Remove active item. void SymEditManager::removeItem() { + undosave(); Symbol.RemoveItem(Symbol.GetActiveIndex()); } @@ -247,7 +255,7 @@ QString SymEditManager::getItemText(int index) const } // -bool SymEditManager::getItemFill(int index) const +int SymEditManager::getItemFill(int index) const { const auto& item = Symbol.GetItem(index); return item.Fill; @@ -276,6 +284,7 @@ void SymEditManager::cutClipboard() { if ( QClipboard* clipboard = QGuiApplication::clipboard() ) { + undosave(); clipboard->setText(getSymbol()); Symbol.Clear(); } @@ -292,12 +301,59 @@ void SymEditManager::copyClipboard() const void SymEditManager::pasteClipboard() { if ( QClipboard* clipboard = QGuiApplication::clipboard() ) + { + undosave(); Symbol.Load(clipboard->text()); + } } -// +//! Rotate symbol. +/*! + \param dir Positive value rotates right, negative left +*/ void SymEditManager::rotateSymbol(int dir) { + undosave(); Symbol.RotateSymbol(dir); } +//! Undo edit operation. +/*! + \param undo True undoes, false redoes. + \return True for success. +*/ +bool SymEditManager::undo(bool undo) +{ + if ( undo ) + { + if ( UndoStack.empty() ) + return false; + + QString buffer; + Symbol.Save(buffer); + RedoStack.push_back(buffer); + + Symbol.Load(UndoStack.back()); + UndoStack.pop_back(); + return true; + } + if ( RedoStack.empty() ) + return false; + + QString buffer; + Symbol.Save(buffer); + UndoStack.push_back(buffer); + + Symbol.Load(RedoStack.back()); + RedoStack.pop_back(); + return true; +} + +//! Save item to undo stack. +void SymEditManager::undosave() +{ + QString buffer; + Symbol.Save(buffer); + UndoStack.push_back(buffer); + RedoStack.clear(); +} @@ -6,6 +6,8 @@ #include <QPoint> #include <QSize> +#include <deque> + #include "symbol.h" //! Settings class. @@ -23,9 +25,10 @@ private: QPoint Position; //!< Window position. QSize Size; //!< Window size. - bool FillItem; //!< Fill object. + int FillItem; //!< Fill object. int Alignment; //!< Text alignment. int LineWidth; //!< Line width. + int TextSize; //!< Text size. int SnapGrid; //!< Snap granularity. int Tool; //!< Current tool. }; @@ -47,22 +50,24 @@ public: Q_INVOKABLE QPoint getWindowPos() const; Q_INVOKABLE QSize getWindowSize() const; - Q_INVOKABLE void setFillItem(bool fill); + Q_INVOKABLE void setFillItem(int fill); Q_INVOKABLE void setAlignment(int align); Q_INVOKABLE void setLineWidth(int align); + Q_INVOKABLE void setTextSize(int size); Q_INVOKABLE void setSnapGrid(int snap); Q_INVOKABLE void setTool(int tool); - Q_INVOKABLE bool getFillItem() const; + Q_INVOKABLE int getFillItem() const; Q_INVOKABLE int getAlignment() const; Q_INVOKABLE int getLineWidth() const; + Q_INVOKABLE int getTextSize() const; Q_INVOKABLE int getSnapGrid() const; Q_INVOKABLE int getTool() const; Q_INVOKABLE QString getSymbol() const; - Q_INVOKABLE void addValueItem(int operation, QPoint point, int value, bool fill); - Q_INVOKABLE void addPointItem(int operation, QPoint point, QPoint value, bool fill); + Q_INVOKABLE void addValueItem(int operation, QPoint point, int value, int fill); + Q_INVOKABLE void addPointItem(int operation, QPoint point, QPoint value, int fill); Q_INVOKABLE void addTextItem(int operation, QPoint point, QString value, int align); Q_INVOKABLE void removeItem(); @@ -72,7 +77,7 @@ public: Q_INVOKABLE int getItemValue(int index) const; Q_INVOKABLE QPoint getItemPoint(int index) const; Q_INVOKABLE QString getItemText(int index ) const; - Q_INVOKABLE bool getItemFill(int index) const; + Q_INVOKABLE int getItemFill(int index) const; Q_INVOKABLE int selectItem(QPoint point) const; Q_INVOKABLE void setActiveIndex(int index); @@ -84,10 +89,17 @@ public: Q_INVOKABLE void rotateSymbol(int dir); + Q_INVOKABLE bool undo(bool undo); + private: + void undosave(); + bool Initialized = false; //!< Initialization mutex. SymEditSymbol Symbol; //!< Current symbol. SymEditSettings Settings; //!< Editor settings. + + std::deque<QString> UndoStack; //!< Undo stack. + std::deque<QString> RedoStack; //!< Redo stack. }; #endif |
