mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 13:36:14 +03:00
88 lines
1.3 KiB
C++
88 lines
1.3 KiB
C++
#include "Pch.h"
|
|
#include "Undo.h"
|
|
|
|
Undo::~Undo()
|
|
{
|
|
clear();
|
|
}
|
|
|
|
Undo& Undo::get()
|
|
{
|
|
static Undo undo;
|
|
return undo;
|
|
}
|
|
|
|
void Undo::clear()
|
|
{
|
|
for (Entry* cmd : m_track.done)
|
|
{
|
|
destroyEntry(cmd);
|
|
}
|
|
m_track.done.clear();
|
|
|
|
for (Entry* cmd : m_track.undone)
|
|
{
|
|
destroyEntry(cmd);
|
|
}
|
|
m_track.undone.clear();
|
|
}
|
|
|
|
void* Undo::allocateEntry(size_t size, size_t alignment)
|
|
{
|
|
return _aligned_malloc(size, alignment);
|
|
}
|
|
|
|
void Undo::destroyEntry(Entry* cmd)
|
|
{
|
|
if (!cmd)
|
|
{
|
|
return;
|
|
}
|
|
|
|
cmd->~Entry();
|
|
_aligned_free(cmd);
|
|
}
|
|
|
|
void Undo::done(Entry* cmd)
|
|
{
|
|
m_track.done.push_back(cmd);
|
|
|
|
// Erase redo stack when a new entry is added to the undo stack
|
|
for (Entry* cmd : m_track.undone)
|
|
{
|
|
destroyEntry(cmd);
|
|
}
|
|
m_track.undone.clear();
|
|
}
|
|
|
|
bool Undo::undo()
|
|
{
|
|
if (m_track.done.empty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Entry* cmd = m_track.done.back();
|
|
m_track.done.pop_back();
|
|
|
|
cmd->undo();
|
|
m_track.undone.push_back(cmd);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Undo::redo()
|
|
{
|
|
if (m_track.undone.empty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Entry* cmd = m_track.undone.back();
|
|
m_track.undone.pop_back();
|
|
|
|
cmd->redo();
|
|
m_track.done.push_back(cmd);
|
|
|
|
return true;
|
|
} |