# HG changeset patch # User Teemu Piippo # Date 1632303048 -10800 # Node ID e8444e0d7f1a53cb17335c6512fdc2251cdde823 # Parent d384df40c8e7fb377634e62e7e05ab69f7e598ff Work on edit history diff -r d384df40c8e7 -r e8444e0d7f1a CMakeLists.txt --- a/CMakeLists.txt Wed Sep 22 00:25:31 2021 +0300 +++ b/CMakeLists.txt Wed Sep 22 12:30:48 2021 +0300 @@ -25,7 +25,7 @@ source_group("3.2 Widgets" REGULAR_EXPRESSION "src/(ui|widgets)/.+\\.(cpp|h|ui)") source_group("3.1 Settings editor" REGULAR_EXPRESSION "src/settingseditor/.+\\.(cpp|h|ui)") source_group("3 User interface" REGULAR_EXPRESSION "src/(mainwindow|document|documentmanager|uiutilities)\\.(cpp|h|ui)") -source_group("2 Model handling" REGULAR_EXPRESSION "src/(model|modeleditcontext|libraries|colors|parser|vertexmap)\\.(cpp|h|ui)") +source_group("2 Model handling" REGULAR_EXPRESSION "src/(model|modeleditcontext|libraries|colors|parser|vertexmap|edithistory)\\.(cpp|h|ui)") source_group("6 Editing tools" REGULAR_EXPRESSION "src/tools/.+\\.(cpp|h|ui)") set (LDFORGE_SOURCES diff -r d384df40c8e7 -r e8444e0d7f1a src/document.h --- a/src/document.h Wed Sep 22 00:25:31 2021 +0300 +++ b/src/document.h Wed Sep 22 12:30:48 2021 +0300 @@ -23,6 +23,7 @@ #include "ui/canvas.h" #include "model.h" #include "vertexmap.h" +#include "edithistory.h" namespace Ui { @@ -67,4 +68,8 @@ QVector tools; BaseTool* selectedTool = nullptr; QMap toolActions; + /** + * @brief History information of edits to this model + */ + EditHistory editHistory; }; diff -r d384df40c8e7 -r e8444e0d7f1a src/edithistory.cpp --- a/src/edithistory.cpp Wed Sep 22 00:25:31 2021 +0300 +++ b/src/edithistory.cpp Wed Sep 22 12:30:48 2021 +0300 @@ -1,4 +1,23 @@ +/* + * 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 . + */ + #include "edithistory.h" +#include "modeleditcontext.h" EditHistory::EditHistory() { diff -r d384df40c8e7 -r e8444e0d7f1a src/edithistory.h --- 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 . + */ + #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>; + using Changeset = std::vector>; 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 + 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 changesets; + std::size_t position = 0; + bool changesetOpen = false; }; \ No newline at end of file diff -r d384df40c8e7 -r e8444e0d7f1a src/model.h --- a/src/model.h Wed Sep 22 00:25:31 2021 +0300 +++ b/src/model.h Wed Sep 22 12:30:48 2021 +0300 @@ -65,6 +65,7 @@ void apply(Fn f) const; Q_SIGNALS: void objectAdded(ldraw::id_t id, int position); + void objectModified(ldraw::id_t id, int position); private: using ModelObjectPointer = std::unique_ptr; template @@ -98,6 +99,9 @@ std::map objectsById; mutable std::vector cachedPolygons; mutable bool needRecache = true; + /** + * @brief Amount of model edit contexts active + */ int editCounter = 0; }; diff -r d384df40c8e7 -r e8444e0d7f1a src/modeleditcontext.cpp --- a/src/modeleditcontext.cpp Wed Sep 22 00:25:31 2021 +0300 +++ b/src/modeleditcontext.cpp Wed Sep 22 12:30:48 2021 +0300 @@ -31,6 +31,7 @@ { this->model().objectModified(id); } + this->model().editFinished(); } ldraw::id_t Model::EditContext::append(std::unique_ptr&& object)