From 143ada9e9c5285a360497d89eec843601d229c76 Mon Sep 17 00:00:00 2001 From: kobewi Date: Fri, 19 Sep 2025 17:46:05 +0200 Subject: [PATCH] Add scene painting undo redo --- editor/scene/scene_paint_editor_plugin.cpp | 29 +++++++++++++++++++++- editor/scene/scene_paint_editor_plugin.h | 2 ++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/editor/scene/scene_paint_editor_plugin.cpp b/editor/scene/scene_paint_editor_plugin.cpp index 83d589e06b..d8303b5bfd 100644 --- a/editor/scene/scene_paint_editor_plugin.cpp +++ b/editor/scene/scene_paint_editor_plugin.cpp @@ -233,8 +233,30 @@ void ScenePaintEditor::_gui_input_viewport(const Ref &p_event) { } } else if (mb->is_released()) { if (mb->get_button_index() == MouseButton::LEFT) { + if (is_painting && !action_nodes.is_empty()) { + undo_redo->create_action(TTR("Paint Node(s)")); + for (Node2D *node_2d : action_nodes) { + undo_redo->add_do_reference(node_2d); + undo_redo->add_do_method(node_2d->get_parent(), "add_child", node_2d); + undo_redo->add_do_method(node_2d, "set_owner", node_2d->get_owner()); + undo_redo->add_undo_method(node_2d->get_parent(), "remove_child", node_2d); + } + undo_redo->commit_action(false); + action_nodes.clear(); + } is_painting = false; } else if (mb->get_button_index() == MouseButton::RIGHT) { + if (is_erasing && !action_nodes.is_empty()) { + undo_redo->create_action(TTR("Remove Painted Node(s)")); + for (Node2D *node_2d : action_nodes) { + undo_redo->add_do_method(node_2d->get_meta("_paint_parent"), "remove_child", node_2d); + undo_redo->add_undo_reference(node_2d); + undo_redo->add_undo_method(node_2d->get_meta("_paint_parent"), "add_child", node_2d); + undo_redo->add_undo_method(node_2d, "set_owner", node_2d->get_owner()); + } + undo_redo->commit_action(false); + action_nodes.clear(); + } is_erasing = false; } } @@ -290,6 +312,8 @@ void ScenePaintEditor::_add_node_at_pos() { node_2d->set_owner(parent); node_2d->set_meta("_scene_painted", true); node_2d->set_global_position(pos); + + action_nodes.push_back(node_2d); } } @@ -313,7 +337,10 @@ void ScenePaintEditor::_remove_node_at_pos() { if (!node_2d || !node_2d->has_meta("_scene_painted") || node_2d->get_parent() != node) { continue; } - node_2d->queue_free(); + node_2d->set_meta("_paint_parent", node_2d->get_parent()); // Hack + node_2d->get_parent()->remove_child(node_2d); + + action_nodes.push_back(node_2d); } } diff --git a/editor/scene/scene_paint_editor_plugin.h b/editor/scene/scene_paint_editor_plugin.h index f8fa08b52a..ddb704d235 100644 --- a/editor/scene/scene_paint_editor_plugin.h +++ b/editor/scene/scene_paint_editor_plugin.h @@ -90,6 +90,8 @@ class ScenePaintEditor : public Control { Node2D *selected_scene; + LocalVector action_nodes; + void _edit(Object *p_object); void _draw(); -- 2.27.0.windows.1