Properly handle node remove via undo

(cherry picked from commit 37ffb40047)
This commit is contained in:
Tomasz Chabora 2020-03-29 19:59:04 +02:00 committed by Rémi Verschelde
parent 3658f7127e
commit 472b0e0d34
4 changed files with 38 additions and 0 deletions

View file

@ -39,6 +39,13 @@
#include "scene/resources/rectangle_shape_2d.h"
#include "scene/resources/segment_shape_2d.h"
void CollisionShape2DEditor::_node_removed(Node *p_node) {
if (p_node == node) {
node = NULL;
}
}
Variant CollisionShape2DEditor::get_handle_value(int idx) const {
switch (shape_type) {
@ -525,6 +532,20 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
}
}
void CollisionShape2DEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
get_tree()->connect("node_removed", this, "_node_removed");
} break;
case NOTIFICATION_EXIT_TREE: {
get_tree()->disconnect("node_removed", this, "_node_removed");
} break;
}
}
void CollisionShape2DEditor::edit(Node *p_node) {
if (!canvas_item_editor) {
@ -549,6 +570,7 @@ void CollisionShape2DEditor::edit(Node *p_node) {
void CollisionShape2DEditor::_bind_methods() {
ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type);
ClassDB::bind_method(D_METHOD("_node_removed"), &CollisionShape2DEditor::_node_removed);
}
CollisionShape2DEditor::CollisionShape2DEditor(EditorNode *p_editor) {

View file

@ -71,6 +71,8 @@ class CollisionShape2DEditor : public Control {
void _get_current_shape_type();
protected:
void _notification(int p_what);
void _node_removed(Node *p_node);
static void _bind_methods();
public:

View file

@ -38,6 +38,13 @@
#include "editor/editor_settings.h"
#include "scene/gui/split_container.h"
void TileMapEditor::_node_removed(Node *p_node) {
if (p_node == node) {
node = NULL;
}
}
void TileMapEditor::_notification(int p_what) {
switch (p_what) {
@ -60,6 +67,7 @@ void TileMapEditor::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
get_tree()->connect("node_removed", this, "_node_removed");
paint_button->set_icon(get_icon("Edit", "EditorIcons"));
bucket_fill_button->set_icon(get_icon("Bucket", "EditorIcons"));
picker_button->set_icon(get_icon("ColorPick", "EditorIcons"));
@ -80,6 +88,10 @@ void TileMapEditor::_notification(int p_what) {
p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "EditorIcons"));
} break;
case NOTIFICATION_EXIT_TREE: {
get_tree()->disconnect("node_removed", this, "_node_removed");
} break;
}
}
@ -1826,6 +1838,7 @@ void TileMapEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_erase_points"), &TileMapEditor::_erase_points);
ClassDB::bind_method(D_METHOD("_icon_size_changed"), &TileMapEditor::_icon_size_changed);
ClassDB::bind_method(D_METHOD("_node_removed"), &TileMapEditor::_node_removed);
}
TileMapEditor::CellOp TileMapEditor::_get_op_from_cell(const Point2i &p_pos) {

View file

@ -211,6 +211,7 @@ class TileMapEditor : public VBoxContainer {
protected:
void _notification(int p_what);
void _node_removed(Node *p_node);
static void _bind_methods();
CellOp _get_op_from_cell(const Point2i &p_pos);