@@ -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+
743757int EditorData::get_edited_scene () const {
744758 return current_edited_scene;
745759}
0 commit comments