From d66b1752b8d45e6a502111bc4da0ab1bab8dd612 Mon Sep 17 00:00:00 2001 From: pancelor Date: Wed, 11 Oct 2023 07:01:55 -0700 Subject: [PATCH] Fix tilemap live editing while game is running --- core/object/undo_redo.cpp | 43 +++++++++++++++++++++------------------ core/object/undo_redo.h | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index 2435ab48acfc..a8f2ac5bfe56 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -71,9 +71,7 @@ bool UndoRedo::_redo(bool p_execute) { } current_action++; - if (p_execute) { - _process_operation_list(actions.write[current_action].do_ops.front()); - } + _process_operation_list(actions.write[current_action].do_ops.front(), p_execute); version++; emit_signal(SNAME("version_changed")); @@ -321,7 +319,7 @@ void UndoRedo::commit_action(bool p_execute) { } } -void UndoRedo::_process_operation_list(List::Element *E) { +void UndoRedo::_process_operation_list(List::Element *E, bool p_execute) { const int PREALLOCATE_ARGS_COUNT = 16; LocalVector args; @@ -337,18 +335,20 @@ void UndoRedo::_process_operation_list(List::Element *E) { switch (op.type) { case Operation::TYPE_METHOD: { - Callable::CallError ce; - Variant ret; - op.callable.callp(nullptr, 0, ret, ce); - if (ce.error != Callable::CallError::CALL_OK) { - ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, nullptr, 0, ce)); - } + if (p_execute) { + Callable::CallError ce; + Variant ret; + op.callable.callp(nullptr, 0, ret, ce); + if (ce.error != Callable::CallError::CALL_OK) { + ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, nullptr, 0, ce)); + } #ifdef TOOLS_ENABLED - Resource *res = Object::cast_to(obj); - if (res) { - res->set_edited(true); - } + Resource *res = Object::cast_to(obj); + if (res) { + res->set_edited(true); + } #endif + } if (method_callback) { Vector binds; @@ -373,13 +373,16 @@ void UndoRedo::_process_operation_list(List::Element *E) { } } break; case Operation::TYPE_PROPERTY: { - obj->set(op.name, op.value); + if (p_execute) { + obj->set(op.name, op.value); #ifdef TOOLS_ENABLED - Resource *res = Object::cast_to(obj); - if (res) { - res->set_edited(true); - } + Resource *res = Object::cast_to(obj); + if (res) { + res->set_edited(true); + } #endif + } + if (property_callback) { property_callback(prop_callback_ud, obj, op.name, op.value); } @@ -400,7 +403,7 @@ bool UndoRedo::undo() { if (current_action < 0) { return false; //nothing to redo } - _process_operation_list(actions.write[current_action].undo_ops.front()); + _process_operation_list(actions.write[current_action].undo_ops.front(), true); current_action--; version--; emit_signal(SNAME("version_changed")); diff --git a/core/object/undo_redo.h b/core/object/undo_redo.h index 389d8714f762..74a6bea73274 100644 --- a/core/object/undo_redo.h +++ b/core/object/undo_redo.h @@ -85,7 +85,7 @@ class UndoRedo : public Object { uint64_t version = 1; void _pop_history_tail(); - void _process_operation_list(List::Element *E); + void _process_operation_list(List::Element *E, bool p_execute); void _discard_redo(); bool _redo(bool p_execute);