#include "edit_history.h" EditHistory *EditHistory::singleton_instance{ nullptr }; void EditHistory::_bind_methods() { ClassDB::bind_method(D_METHOD("push_action", "do_action", "undo_action"), &self_type::push_action); ClassDB::bind_method(D_METHOD("undo_last"), &self_type::undo); ClassDB::bind_method(D_METHOD("redo_last"), &self_type::redo); } void EditHistory::push_action(Callable do_action, Callable undo_action) { if (this->undo_count != 0) { this->history.resize(this->history.size() - this->undo_count); this->undo_count = 0; } do_action.call(); this->history.push_back({ do_action, undo_action }); } void EditHistory::undo() { if (this->undo_count < this->history.size()) { this->undo_count++; this->history[this->history.size() - this->undo_count].undo_action.call(); } } void EditHistory::redo() { if (this->undo_count > 0) { this->history[this->history.size() - this->undo_count].do_action.call(); this->undo_count--; } }