Merge pull request #83146 from pancelor/fix-tilemap-liveupdate

Fix tilemap live editing while game is running
This commit is contained in:
Rémi Verschelde 2023-10-16 10:39:48 +02:00
commit 4a6e8dc57b
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 24 additions and 21 deletions

View file

@ -71,9 +71,7 @@ bool UndoRedo::_redo(bool p_execute) {
} }
current_action++; current_action++;
if (p_execute) { _process_operation_list(actions.write[current_action].do_ops.front(), p_execute);
_process_operation_list(actions.write[current_action].do_ops.front());
}
version++; version++;
emit_signal(SNAME("version_changed")); emit_signal(SNAME("version_changed"));
@ -321,7 +319,7 @@ void UndoRedo::commit_action(bool p_execute) {
} }
} }
void UndoRedo::_process_operation_list(List<Operation>::Element *E) { void UndoRedo::_process_operation_list(List<Operation>::Element *E, bool p_execute) {
const int PREALLOCATE_ARGS_COUNT = 16; const int PREALLOCATE_ARGS_COUNT = 16;
LocalVector<const Variant *> args; LocalVector<const Variant *> args;
@ -337,18 +335,20 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) {
switch (op.type) { switch (op.type) {
case Operation::TYPE_METHOD: { case Operation::TYPE_METHOD: {
Callable::CallError ce; if (p_execute) {
Variant ret; Callable::CallError ce;
op.callable.callp(nullptr, 0, ret, ce); Variant ret;
if (ce.error != Callable::CallError::CALL_OK) { op.callable.callp(nullptr, 0, ret, ce);
ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, nullptr, 0, 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 #ifdef TOOLS_ENABLED
Resource *res = Object::cast_to<Resource>(obj); Resource *res = Object::cast_to<Resource>(obj);
if (res) { if (res) {
res->set_edited(true); res->set_edited(true);
} }
#endif #endif
}
if (method_callback) { if (method_callback) {
Vector<Variant> binds; Vector<Variant> binds;
@ -373,13 +373,16 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) {
} }
} break; } break;
case Operation::TYPE_PROPERTY: { case Operation::TYPE_PROPERTY: {
obj->set(op.name, op.value); if (p_execute) {
obj->set(op.name, op.value);
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
Resource *res = Object::cast_to<Resource>(obj); Resource *res = Object::cast_to<Resource>(obj);
if (res) { if (res) {
res->set_edited(true); res->set_edited(true);
} }
#endif #endif
}
if (property_callback) { if (property_callback) {
property_callback(prop_callback_ud, obj, op.name, op.value); property_callback(prop_callback_ud, obj, op.name, op.value);
} }
@ -400,7 +403,7 @@ bool UndoRedo::undo() {
if (current_action < 0) { if (current_action < 0) {
return false; //nothing to redo 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--; current_action--;
version--; version--;
emit_signal(SNAME("version_changed")); emit_signal(SNAME("version_changed"));

View file

@ -85,7 +85,7 @@ private:
uint64_t version = 1; uint64_t version = 1;
void _pop_history_tail(); void _pop_history_tail();
void _process_operation_list(List<Operation>::Element *E); void _process_operation_list(List<Operation>::Element *E, bool p_execute);
void _discard_redo(); void _discard_redo();
bool _redo(bool p_execute); bool _redo(bool p_execute);