mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 18:56:16 +03:00
53 lines
1023 B
C++
53 lines
1023 B
C++
#pragma once
|
|
#include "Pch.h"
|
|
|
|
class Undo final
|
|
{
|
|
public:
|
|
explicit Undo() = default;
|
|
~Undo();
|
|
|
|
static Undo& get();
|
|
|
|
struct Entry
|
|
{
|
|
Entry() = default;
|
|
virtual ~Entry() = default;
|
|
|
|
virtual const char* getType() const { return "Base Command"; }
|
|
|
|
virtual void undo() { }
|
|
virtual void redo() { }
|
|
};
|
|
|
|
struct Track
|
|
{
|
|
std::vector<Entry*> done; // undo stack.
|
|
std::vector<Entry*> undone; // redo stack.
|
|
};
|
|
|
|
void clear();
|
|
|
|
template<typename EntryT, typename ...Args>
|
|
static EntryT* createEntry(Args&&... params)
|
|
{
|
|
void* block = allocateEntry(sizeof(EntryT), alignof(EntryT));
|
|
return new (block) EntryT(params...);
|
|
}
|
|
|
|
static void destroyEntry(Entry* cmd);
|
|
|
|
// Add entry.
|
|
void done(Entry* cmd);
|
|
|
|
bool undo();
|
|
bool redo();
|
|
|
|
bool hasUndo() const { return !m_track.done.empty(); }
|
|
bool hasRedo() const { return !m_track.undone.empty(); }
|
|
|
|
private:
|
|
static void* allocateEntry(size_t size, size_t alignment);
|
|
|
|
Track m_track;
|
|
}; |