1// SuperTux
2// Copyright (C) 2018 Ingo Ruhnke <grumbel@gmail.com>
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17#ifndef HEADER_SUPERTUX_EDITOR_UNDO_MANAGER_HPP
18#define HEADER_SUPERTUX_EDITOR_UNDO_MANAGER_HPP
19
20#include <vector>
21#include <string>
22#include <memory>
23
24class Level;
25
26class UndoManager
27{
28private:
29public:
30 UndoManager();
31
32 void try_snapshot(Level& level);
33
34 std::unique_ptr<Level> undo();
35 std::unique_ptr<Level> redo();
36
37 bool has_unsaved_changes() const
38 {
39 return m_index_pos != 1;
40 }
41
42 void reset_index()
43 {
44 m_index_pos = 1;
45 }
46
47private:
48 void push_undo_stack(std::string&& level_snapshot);
49 void cleanup();
50 void debug_print(const char* action);
51
52private:
53 size_t m_max_snapshots;
54 int m_index_pos;
55 std::vector<std::string> m_undo_stack;
56 std::vector<std::string> m_redo_stack;
57
58private:
59 UndoManager(const UndoManager&) = delete;
60 UndoManager& operator=(const UndoManager&) = delete;
61};
62
63#endif
64
65/* EOF */
66