aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikko Syrjä <mikko@3d-system.fi>2019-02-22 22:11:03 +0200
committerMikko Syrjä <mikko@3d-system.fi>2019-02-22 22:11:03 +0200
commit07599f27937b8af9a3d3a46f17e34b51d6eada2c (patch)
treef4d84b5e1b9bbd253bcddf195cf00ba510a4dd4f
parentcddb64f0238e9a8a0975732b925cbaae211a1b65 (diff)
downloadsymedit-07599f27937b8af9a3d3a46f17e34b51d6eada2c.tar.gz
symedit-07599f27937b8af9a3d3a46f17e34b51d6eada2c.zip
Implemented undo and redo.
-rw-r--r--Editor.qml8
-rw-r--r--main.qml51
-rw-r--r--symbol.cpp16
-rw-r--r--symbol.h8
-rw-r--r--symedit.cpp72
-rw-r--r--symedit.h24
6 files changed, 136 insertions, 43 deletions
diff --git a/Editor.qml b/Editor.qml
index 6060767..b05c3d9 100644
--- a/Editor.qml
+++ b/Editor.qml
@@ -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)
diff --git a/main.qml b/main.qml
index 0e05f51..f3d2961 100644
--- a/main.qml
+++ b/main.qml
@@ -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()
diff --git a/symbol.cpp b/symbol.cpp
index 6a86bab..11d9791 100644
--- a/symbol.cpp
+++ b/symbol.cpp
@@ -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)
{
//##
}
-
diff --git a/symbol.h b/symbol.h
index ea236b4..2ee996c 100644
--- a/symbol.h
+++ b/symbol.h
@@ -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();
+}
diff --git a/symedit.h b/symedit.h
index b9241b5..f10a07a 100644
--- a/symedit.h
+++ b/symedit.h
@@ -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