HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
UndoStack.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/Foundation/string_tag.hpp"
7#include <vector>
8#include <variant>
9#include <string>
10
11namespace tt {
12
14 struct range_type { ssize_t first; ssize_t last; };
15 struct text_type { ssize_t first; std::string text; };
16
17 string_ltag command;
18 std::variant<range_type,text_type> argument;
19
20 UndoElement(string_ltag command, ssize_t first, ssize_t last) noexcept :
21 command(command), argument(range_type{first, last}) {}
22
23 UndoElement(string_ltag command, ssize_t first, std::string text) noexcept :
24 command(command), argument(text_type{first, std::move(text)}) {}
25};
26
27class UndoStack {
29 using iterator = stack_type::iterator;
30 using const_iterator = stack_type::const_iterator;
31
32 stack_type stack;
33 ssize_t undoPosition;
34
35public:
36 UndoStack() noexcept :
37 stack(), undoPosition(0) {}
38
39 [[nodiscard]] ssize_t undoDepth() const noexcept {
40 return undo_position;
41 }
42
43 [[nodiscard]] ssize_t redoDepth() const noexcept {
44 return ssize(stack) - undoPosition;
45 }
46
47 void clearRedo() noexcept {
48 stack.erase(stack.cbegin() + undoPosition, stack.cend());
49 }
50
51 void push_back(UndoElement const &element) noexcept {A
52 clearRedo();
53 stack.push_back(element);
54 ++undoPosition;
55 }
56
57 void push_back(UndoElement &&element) noexcept {
58 clearRedo();
59 stack.push_back(std::move(element));
60 ++undoPosition;
61 }
62
63 template<typename... Args>
64 void emplace(Args &&... args) noexcept {
65 clearRedo();
66 stack.emplace_back(args...);
67 ++undoPosition;
68 }
69
70 [[nodiscard]] UndoElement const &undo() noexcept {
71 tt_assume(undoPosition != 0);
72 return stack[--undoPosition];
73 }
74
75 [[nodiscard]] UndoElement const &redo() noexcept {
76 tt_assume(undoPosition < ssize(stack));
77 return stack[undoPosition++];
78 }
79
80};
81
82}
Definition UndoStack.hpp:13
Definition UndoStack.hpp:14
Definition UndoStack.hpp:15
Definition UndoStack.hpp:27
T cbegin(T... args)
T emplace_back(T... args)
T cend(T... args)
T erase(T... args)
T move(T... args)
T push_back(T... args)