src/edithistory.h

changeset 136
e8444e0d7f1a
parent 133
e39326ee48dc
child 149
008989bc7d6e
child 152
03f8e6d42e13
--- a/src/edithistory.h	Wed Sep 22 00:25:31 2021 +0300
+++ b/src/edithistory.h	Wed Sep 22 12:30:48 2021 +0300
@@ -1,7 +1,24 @@
+/*
+ *  LDForge: LDraw parts authoring CAD
+ *  Copyright (C) 2013 - 2020 Teemu 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/>.
+ */
+
 #pragma once
 #include "main.h"
 #include "model.h"
-#include "modeleditcontext.h"
 
 class AbstractHistoryEntry
 {
@@ -13,14 +30,14 @@
 class InsertHistoryEntry : public AbstractHistoryEntry
 {
 public:
-	InsertHistoryEntry(int position, const QString& code) :
+	InsertHistoryEntry(int position, const QByteArray& state) :
 		position{position},
-		code{code} {}
+		state{state} {}
 	void undo(Model::EditContext& editContext) override;
 	void redo(Model::EditContext& editContext) override;
 protected:
 	int position;
-	QString code;
+	QByteArray state;
 };
 
 class DeleteHistoryEntry : public InsertHistoryEntry
@@ -33,21 +50,51 @@
 class EditHistoryEntry : public AbstractHistoryEntry
 {
 public:
-	EditHistoryEntry(int position, const QString& codeBefore, const QString& codeAfter) :
+	EditHistoryEntry(int position, const QByteArray& stateBefore, const QByteArray& stateAfter) :
 		position{position},
-		codeBefore{codeBefore},
-		codeAfter{codeAfter} {}
+		stateBefore{stateBefore},
+		stateAfter{stateAfter} {}
 	void undo(Model::EditContext& editContext) override;
 	void redo(Model::EditContext& editContext) override;
 private:
 	int position;
-	QString codeBefore;
-	QString codeAfter;
+	QByteArray stateBefore;
+	QByteArray stateAfter;
 };
 
 class EditHistory
 {
 public:
-	using Changeset = QVector<std::unique_ptr<AbstractHistoryEntry>>;
+	using Changeset = std::vector<std::unique_ptr<AbstractHistoryEntry>>;
 	EditHistory();
+	/**
+	 * @brief Adds a new entry into the edit history. Creates a new changeset if there is not one already open.
+	 * If behind in history, deletes all history entries in front.
+	 */
+	template<typename T, typename... Rs>
+	void add(Rs&&... args)
+	{
+		if (not this->changesetOpen)
+		{
+			while (this->position < this->changesets.size())
+			{
+				this->changesets.erase(this->changesets.end() - 1);
+			}
+			if (this->changesets.empty())
+			{
+				this->changesets.emplace_back();
+			}
+			this->changesetOpen = true;
+		}
+		this->changesets.back().emplace_back(args...);
+	}
+	void commit()
+	{
+		this->changesetOpen = false;
+		this->position += 1;
+	}
+private:
+	std::vector<Changeset> changesets;
+	std::size_t position = 0;
+	bool changesetOpen = false;
 };
\ No newline at end of file

mercurial