Skip to content

Commit 0994b19

Browse files
committed
Merge pull request #111025 from xuhuisheng/dev/clear_inheritance
Fix Clear Inheritance issues
2 parents 9597771 + 766b45b commit 0994b19

File tree

5 files changed

+51
-30
lines changed

5 files changed

+51
-30
lines changed

editor/docks/scene_tree_dock.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
13961396
Node *node = e->get();
13971397
if (node) {
13981398
node->set_scene_inherited_state(Ref<SceneState>());
1399-
scene_tree->update_tree();
1399+
editor_data->reload_scene_from_memory(editor_data->get_edited_scene(), true);
1400+
scene_tree->clear_cache();
14001401
InspectorDock::get_inspector_singleton()->update_tree();
14011402
}
14021403
}

editor/editor_data.cpp

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -706,40 +706,54 @@ bool EditorData::check_and_update_scene(int p_idx) {
706706
bool must_reload = _find_updated_instances(edited_scene[p_idx].root, edited_scene[p_idx].root, checked_scenes);
707707

708708
if (must_reload) {
709-
Ref<PackedScene> pscene;
710-
pscene.instantiate();
711-
712-
EditorProgress ep("update_scene", TTR("Updating Scene"), 2);
713-
ep.step(TTR("Storing local changes..."), 0);
714-
// Pack first, so it stores diffs to previous version of saved scene.
715-
Error err = pscene->pack(edited_scene[p_idx].root);
716-
ERR_FAIL_COND_V(err != OK, false);
717-
ep.step(TTR("Updating scene..."), 1);
718-
Node *new_scene = pscene->instantiate(PackedScene::GEN_EDIT_STATE_MAIN);
719-
ERR_FAIL_NULL_V(new_scene, false);
720-
721-
// Transfer selection.
722-
List<Node *> new_selection;
723-
for (const Node *E : edited_scene.write[p_idx].selection) {
724-
NodePath p = edited_scene[p_idx].root->get_path_to(E);
725-
Node *new_node = new_scene->get_node(p);
726-
if (new_node) {
727-
new_selection.push_back(new_node);
728-
}
729-
}
730-
731-
new_scene->set_scene_file_path(edited_scene[p_idx].root->get_scene_file_path());
732-
Node *old_root = edited_scene[p_idx].root;
733-
EditorNode::get_singleton()->set_edited_scene(new_scene);
734-
memdelete(old_root);
735-
edited_scene.write[p_idx].selection = new_selection;
709+
reload_scene_from_memory(p_idx, false);
736710

737711
return true;
738712
}
739713

740714
return false;
741715
}
742716

717+
bool EditorData::reload_scene_from_memory(int p_idx, bool p_mark_unsaved) {
718+
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), false);
719+
if (!edited_scene[p_idx].root) {
720+
return false;
721+
}
722+
723+
Ref<PackedScene> pscene;
724+
pscene.instantiate();
725+
726+
EditorProgress ep("update_scene", TTR("Updating Scene"), 2);
727+
ep.step(TTR("Storing local changes..."), 0);
728+
// Pack first, so it stores diffs to previous version of saved scene.
729+
Error err = pscene->pack(edited_scene[p_idx].root);
730+
ERR_FAIL_COND_V(err != OK, false);
731+
ep.step(TTR("Updating scene..."), 1);
732+
Node *new_scene = pscene->instantiate(PackedScene::GEN_EDIT_STATE_MAIN);
733+
ERR_FAIL_NULL_V(new_scene, false);
734+
735+
// Transfer selection.
736+
List<Node *> new_selection;
737+
for (const Node *E : edited_scene.write[p_idx].selection) {
738+
NodePath p = edited_scene[p_idx].root->get_path_to(E);
739+
Node *new_node = new_scene->get_node(p);
740+
if (new_node) {
741+
new_selection.push_back(new_node);
742+
}
743+
}
744+
745+
new_scene->set_scene_file_path(edited_scene[p_idx].root->get_scene_file_path());
746+
Node *old_root = edited_scene[p_idx].root;
747+
EditorNode::get_singleton()->set_edited_scene(new_scene);
748+
memdelete(old_root);
749+
edited_scene.write[p_idx].selection = new_selection;
750+
751+
if (p_mark_unsaved) {
752+
EditorUndoRedoManager::get_singleton()->clear_history(get_scene_history_id(p_idx));
753+
}
754+
return true;
755+
}
756+
743757
int EditorData::get_edited_scene() const {
744758
return current_edited_scene;
745759
}

editor/editor_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ class EditorData {
219219
void set_edited_scene_live_edit_root(const NodePath &p_root);
220220
NodePath get_edited_scene_live_edit_root();
221221
bool check_and_update_scene(int p_idx);
222+
bool reload_scene_from_memory(int p_idx, bool p_mark_unsaved);
222223
void move_edited_scene_to_index(int p_idx);
223224

224225
bool call_build();

editor/scene/scene_tree_editor.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,13 +1743,17 @@ void SceneTreeEditor::set_display_foreign_nodes(bool p_display) {
17431743
_update_tree();
17441744
}
17451745

1746-
void SceneTreeEditor::set_valid_types(const Vector<StringName> &p_valid) {
1747-
valid_types = p_valid;
1746+
void SceneTreeEditor::clear_cache() {
17481747
node_cache.force_update = true;
17491748
callable_mp(this, &SceneTreeEditor::_update_tree).call_deferred(false);
17501749
tree_dirty = true;
17511750
}
17521751

1752+
void SceneTreeEditor::set_valid_types(const Vector<StringName> &p_valid) {
1753+
valid_types = p_valid;
1754+
clear_cache();
1755+
}
1756+
17531757
void SceneTreeEditor::set_editor_selection(EditorSelection *p_selection) {
17541758
editor_selection = p_selection;
17551759
tree->set_select_mode(Tree::SELECT_MULTI);

editor/scene/scene_tree_editor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ class SceneTreeEditor : public Control {
248248

249249
void set_show_enabled_subscene(bool p_show) { show_enabled_subscene = p_show; }
250250
void set_valid_types(const Vector<StringName> &p_valid);
251+
void clear_cache();
251252

252253
inline void update_tree() { _update_tree(); }
253254

0 commit comments

Comments
 (0)