src/EditHistory.h

changeset 629
b75c6cce02e2
child 638
382226e40865
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/EditHistory.h	Tue Jan 21 02:03:27 2014 +0200
@@ -0,0 +1,184 @@
+/*
+ *  LDForge: LDraw parts authoring CAD
+ *  Copyright (C) 2013, 2014 Santeri Piippo
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LDFORGE_HISTORY_H
+#define LDFORGE_HISTORY_H
+
+#include "Main.h"
+#include "LDObject.h"
+
+#define IMPLEMENT_HISTORY_TYPE(N)							\
+	virtual ~N##History() {}								\
+	virtual void undo() const override;						\
+	virtual void redo() const override;						\
+															\
+	virtual History::EHistoryType getType() const override	\
+	{														\
+		return History::E##N##History;						\
+	}														\
+															\
+	virtual QString getTypeName() const						\
+	{														\
+		return #N;											\
+	}
+
+class AbstractHistoryEntry;
+
+// =============================================================================
+class History
+{
+	PROPERTY (private,	int,			Position,	NUM_OPS,	STOCK_WRITE)
+	PROPERTY (public,	LDDocument*,	Document,	NO_OPS,		STOCK_WRITE)
+	PROPERTY (public,	bool,			Ignoring,	BOOL_OPS,	STOCK_WRITE)
+
+	public:
+		typedef QList<AbstractHistoryEntry*> Changeset;
+
+		enum EHistoryType
+		{
+			EDelHistory,
+			EEditHistory,
+			EAddHistory,
+			EMoveHistory,
+			ESwapHistory,
+		};
+
+		History();
+		void undo();
+		void redo();
+		void clear();
+
+		void addStep();
+		void add (AbstractHistoryEntry* entry);
+
+		inline long getSize() const
+		{
+			return m_changesets.size();
+		}
+
+		inline History& operator<< (AbstractHistoryEntry* entry)
+		{
+			add (entry);
+			return *this;
+		}
+
+		inline const Changeset& getChangeset (long pos) const
+		{
+			return m_changesets[pos];
+		}
+
+	private:
+		Changeset m_currentChangeset;
+		QList<Changeset> m_changesets;
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class AbstractHistoryEntry
+{
+	PROPERTY (public,	History*,	Parent,	NO_OPS,	STOCK_WRITE)
+
+	public:
+		virtual ~AbstractHistoryEntry() {}
+		virtual void undo() const = 0;
+		virtual void redo() const = 0;
+		virtual History::EHistoryType getType() const = 0;
+		virtual QString getTypeName() const = 0;
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class DelHistory : public AbstractHistoryEntry
+{
+	PROPERTY (private,	int,		Index,		NO_OPS,	STOCK_WRITE)
+	PROPERTY (private,	QString,	Code,		NO_OPS,	STOCK_WRITE)
+
+	public:
+		IMPLEMENT_HISTORY_TYPE (Del)
+		DelHistory (int idx, LDObject* obj);
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class EditHistory : public AbstractHistoryEntry
+{
+	PROPERTY (private,	int, 		Index,		NO_OPS,	STOCK_WRITE)
+	PROPERTY (private,	QString,	OldCode,	NO_OPS,	STOCK_WRITE)
+	PROPERTY (private,	QString,	NewCode,	NO_OPS,	STOCK_WRITE)
+
+	public:
+		IMPLEMENT_HISTORY_TYPE (Edit)
+
+		EditHistory (int idx, QString oldCode, QString newCode) :
+				m_Index (idx),
+				m_OldCode (oldCode),
+				m_NewCode (newCode) {}
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class AddHistory : public AbstractHistoryEntry
+{
+	PROPERTY (private,	int,		Index,	NO_OPS,	STOCK_WRITE)
+	PROPERTY (private,	QString,	Code,		NO_OPS,	STOCK_WRITE)
+
+	public:
+		IMPLEMENT_HISTORY_TYPE (Add)
+
+		AddHistory (int idx, LDObject* obj) :
+				m_Index (idx),
+				m_Code (obj->raw()) {}
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class MoveHistory : public AbstractHistoryEntry
+{
+	public:
+		IMPLEMENT_HISTORY_TYPE (Move)
+
+		QList<int> indices;
+		Vertex dest;
+
+		MoveHistory (QList<int> indices, Vertex dest) :
+				indices (indices),
+				dest (dest) {}
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+class SwapHistory : public AbstractHistoryEntry
+{
+	public:
+		IMPLEMENT_HISTORY_TYPE (Swap)
+
+		SwapHistory (int a, int b) :
+				a (a),
+				b (b) {}
+
+	private:
+		int a, b;
+};
+
+#endif // LDFORGE_HISTORY_H

mercurial