@@ -677,6 +677,7 @@ bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, HashSet<Str
677677
678678 if (!checked_paths.has (path)) {
679679 uint64_t modified_time = FileAccess::get_modified_time (path);
680+
680681 if (modified_time != ss->get_last_modified_time ()) {
681682 return true ; // external scene changed
682683 }
@@ -706,40 +707,55 @@ bool EditorData::check_and_update_scene(int p_idx) {
706707 bool must_reload = _find_updated_instances (edited_scene[p_idx].root , edited_scene[p_idx].root , checked_scenes);
707708
708709 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;
710+ reload_scene_from_memory (p_idx, false );
736711
737712 return true ;
738713 }
739714
740715 return false ;
741716}
742717
718+ bool EditorData::reload_scene_from_memory (int p_idx, bool need_mark_unsaved) {
719+ ERR_FAIL_INDEX_V (p_idx, edited_scene.size (), false );
720+ if (!edited_scene[p_idx].root ) {
721+ return false ;
722+ }
723+
724+ Ref<PackedScene> pscene;
725+ pscene.instantiate ();
726+
727+ EditorProgress ep (" update_scene" , TTR (" Updating Scene" ), 2 );
728+ ep.step (TTR (" Storing local changes..." ), 0 );
729+ // Pack first, so it stores diffs to previous version of saved scene.
730+ Error err = pscene->pack (edited_scene[p_idx].root );
731+ ERR_FAIL_COND_V (err != OK, false );
732+ ep.step (TTR (" Updating scene..." ), 1 );
733+ Node *new_scene = pscene->instantiate (PackedScene::GEN_EDIT_STATE_MAIN);
734+ ERR_FAIL_NULL_V (new_scene, false );
735+
736+ // Transfer selection.
737+ List<Node *> new_selection;
738+ for (const Node *E : edited_scene.write [p_idx].selection ) {
739+ NodePath p = edited_scene[p_idx].root ->get_path_to (E);
740+ Node *new_node = new_scene->get_node (p);
741+ if (new_node) {
742+ new_selection.push_back (new_node);
743+ }
744+ }
745+
746+ new_scene->set_scene_file_path (edited_scene[p_idx].root ->get_scene_file_path ());
747+ Node *old_root = edited_scene[p_idx].root ;
748+ EditorNode::get_singleton ()->set_edited_scene (new_scene);
749+ memdelete (old_root);
750+ edited_scene.write [p_idx].selection = new_selection;
751+
752+ if (need_mark_unsaved) {
753+ EditorUndoRedoManager::get_singleton ()->clear_history ();
754+ EditorUndoRedoManager::get_singleton ()->set_history_as_unsaved (get_current_edited_scene_history_id ());
755+ }
756+ return true ;
757+ }
758+
743759int EditorData::get_edited_scene () const {
744760 return current_edited_scene;
745761}
0 commit comments