Detect external modification of scenes
This commit is contained in:
parent
3099f6fae4
commit
412125f191
@ -510,6 +510,7 @@ int EditorData::add_edited_scene(int p_at_pos) {
|
|||||||
EditedScene es;
|
EditedScene es;
|
||||||
es.root = nullptr;
|
es.root = nullptr;
|
||||||
es.path = String();
|
es.path = String();
|
||||||
|
es.file_modified_time = 0;
|
||||||
es.history_current = -1;
|
es.history_current = -1;
|
||||||
es.version = 0;
|
es.version = 0;
|
||||||
es.live_edit_root = NodePath(String("/root"));
|
es.live_edit_root = NodePath(String("/root"));
|
||||||
@ -666,6 +667,10 @@ void EditorData::set_edited_scene_root(Node *p_root) {
|
|||||||
p_root->set_filename(edited_scene[current_edited_scene].path);
|
p_root->set_filename(edited_scene[current_edited_scene].path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (edited_scene[current_edited_scene].path != "") {
|
||||||
|
edited_scene.write[current_edited_scene].file_modified_time = FileAccess::get_modified_time(edited_scene[current_edited_scene].path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int EditorData::get_edited_scene_count() const {
|
int EditorData::get_edited_scene_count() const {
|
||||||
@ -697,6 +702,21 @@ uint64_t EditorData::get_scene_version(int p_idx) const {
|
|||||||
return edited_scene[p_idx].version;
|
return edited_scene[p_idx].version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorData::set_scene_modified_time(int p_idx, uint64_t p_time) {
|
||||||
|
if (p_idx == -1) {
|
||||||
|
p_idx = current_edited_scene;
|
||||||
|
}
|
||||||
|
|
||||||
|
ERR_FAIL_INDEX(p_idx, edited_scene.size());
|
||||||
|
|
||||||
|
edited_scene.write[p_idx].file_modified_time = p_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t EditorData::get_scene_modified_time(int p_idx) const {
|
||||||
|
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), 0);
|
||||||
|
return edited_scene[p_idx].file_modified_time;
|
||||||
|
}
|
||||||
|
|
||||||
String EditorData::get_scene_type(int p_idx) const {
|
String EditorData::get_scene_type(int p_idx) const {
|
||||||
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
|
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
|
||||||
if (!edited_scene[p_idx].root) {
|
if (!edited_scene[p_idx].root) {
|
||||||
|
@ -111,6 +111,7 @@ public:
|
|||||||
struct EditedScene {
|
struct EditedScene {
|
||||||
Node *root = nullptr;
|
Node *root = nullptr;
|
||||||
String path;
|
String path;
|
||||||
|
uint64_t file_modified_time;
|
||||||
Dictionary editor_states;
|
Dictionary editor_states;
|
||||||
List<Node *> selection;
|
List<Node *> selection;
|
||||||
Vector<EditorHistory::History> history_stored;
|
Vector<EditorHistory::History> history_stored;
|
||||||
@ -191,6 +192,8 @@ public:
|
|||||||
Ref<Script> get_scene_root_script(int p_idx) const;
|
Ref<Script> get_scene_root_script(int p_idx) const;
|
||||||
void set_edited_scene_version(uint64_t version, int p_scene_idx = -1);
|
void set_edited_scene_version(uint64_t version, int p_scene_idx = -1);
|
||||||
uint64_t get_scene_version(int p_idx) const;
|
uint64_t get_scene_version(int p_idx) const;
|
||||||
|
void set_scene_modified_time(int p_idx, uint64_t p_time);
|
||||||
|
uint64_t get_scene_modified_time(int p_idx) const;
|
||||||
void clear_edited_scenes();
|
void clear_edited_scenes();
|
||||||
void set_edited_scene_live_edit_root(const NodePath &p_root);
|
void set_edited_scene_live_edit_root(const NodePath &p_root);
|
||||||
NodePath get_edited_scene_live_edit_root();
|
NodePath get_edited_scene_live_edit_root();
|
||||||
|
@ -588,6 +588,7 @@ void EditorNode::_notification(int p_what) {
|
|||||||
OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec")));
|
OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec")));
|
||||||
|
|
||||||
EditorFileSystem::get_singleton()->scan_changes();
|
EditorFileSystem::get_singleton()->scan_changes();
|
||||||
|
_scan_external_changes();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_APPLICATION_FOCUS_OUT: {
|
case NOTIFICATION_APPLICATION_FOCUS_OUT: {
|
||||||
@ -880,6 +881,69 @@ void EditorNode::_sources_changed(bool p_exist) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorNode::_scan_external_changes() {
|
||||||
|
disk_changed_list->clear();
|
||||||
|
TreeItem *r = disk_changed_list->create_item();
|
||||||
|
disk_changed_list->set_hide_root(true);
|
||||||
|
bool need_reload = false;
|
||||||
|
|
||||||
|
// Check if any edited scene has changed.
|
||||||
|
|
||||||
|
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
|
||||||
|
if (editor_data.get_scene_path(i) == "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t last_date = editor_data.get_scene_modified_time(i);
|
||||||
|
uint64_t date = FileAccess::get_modified_time(editor_data.get_scene_path(i));
|
||||||
|
|
||||||
|
if (date > last_date) {
|
||||||
|
TreeItem *ti = disk_changed_list->create_item(r);
|
||||||
|
ti->set_text(0, editor_data.get_scene_path(i).get_file());
|
||||||
|
need_reload = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_reload) {
|
||||||
|
disk_changed->call_deferred("popup_centered_ratio", 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorNode::_resave_scenes(String p_str) {
|
||||||
|
save_all_scenes();
|
||||||
|
disk_changed->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorNode::_reload_modified_scenes() {
|
||||||
|
int current_idx = editor_data.get_edited_scene();
|
||||||
|
|
||||||
|
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
|
||||||
|
if (editor_data.get_scene_path(i) == "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t last_date = editor_data.get_scene_modified_time(i);
|
||||||
|
uint64_t date = FileAccess::get_modified_time(editor_data.get_scene_path(i));
|
||||||
|
|
||||||
|
if (date > last_date) {
|
||||||
|
String filename = editor_data.get_scene_path(i);
|
||||||
|
editor_data.set_edited_scene(i);
|
||||||
|
_remove_edited_scene(false);
|
||||||
|
|
||||||
|
Error err = load_scene(filename, false, false, true, false, true);
|
||||||
|
if (err != OK) {
|
||||||
|
ERR_PRINT("Failed to load scene");
|
||||||
|
}
|
||||||
|
editor_data.move_edited_scene_to_index(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_undo_redo()->clear_history(false);
|
||||||
|
set_current_scene(current_idx);
|
||||||
|
_update_scene_tabs();
|
||||||
|
disk_changed->hide();
|
||||||
|
}
|
||||||
|
|
||||||
void EditorNode::_vp_resized() {
|
void EditorNode::_vp_resized() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1505,6 +1569,7 @@ void EditorNode::_save_scene(String p_file, int idx) {
|
|||||||
} else {
|
} else {
|
||||||
editor_data.set_edited_scene_version(0, idx);
|
editor_data.set_edited_scene_version(0, idx);
|
||||||
}
|
}
|
||||||
|
editor_data.set_scene_modified_time(idx, FileAccess::get_modified_time(p_file));
|
||||||
|
|
||||||
editor_folding.save_scene_folding(scene, p_file);
|
editor_folding.save_scene_folding(scene, p_file);
|
||||||
|
|
||||||
@ -3322,7 +3387,7 @@ int EditorNode::new_scene() {
|
|||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported) {
|
Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported, bool p_silent_change_tab) {
|
||||||
if (!is_inside_tree()) {
|
if (!is_inside_tree()) {
|
||||||
defer_load_scene = p_scene;
|
defer_load_scene = p_scene;
|
||||||
return OK;
|
return OK;
|
||||||
@ -3362,8 +3427,10 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
|
|||||||
|
|
||||||
if (!editor_data.get_edited_scene_root() && editor_data.get_edited_scene_count() == 2) {
|
if (!editor_data.get_edited_scene_root() && editor_data.get_edited_scene_count() == 2) {
|
||||||
_remove_edited_scene();
|
_remove_edited_scene();
|
||||||
} else {
|
} else if (!p_silent_change_tab) {
|
||||||
_scene_tab_changed(idx);
|
_scene_tab_changed(idx);
|
||||||
|
} else {
|
||||||
|
set_current_scene(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
dependency_errors.clear();
|
dependency_errors.clear();
|
||||||
@ -6599,6 +6666,29 @@ EditorNode::EditorNode() {
|
|||||||
//plugin stuff
|
//plugin stuff
|
||||||
|
|
||||||
add_editor_plugin(memnew(DebuggerEditorPlugin(this, debug_menu)));
|
add_editor_plugin(memnew(DebuggerEditorPlugin(this, debug_menu)));
|
||||||
|
|
||||||
|
disk_changed = memnew(ConfirmationDialog);
|
||||||
|
{
|
||||||
|
VBoxContainer *vbc = memnew(VBoxContainer);
|
||||||
|
disk_changed->add_child(vbc);
|
||||||
|
|
||||||
|
Label *dl = memnew(Label);
|
||||||
|
dl->set_text(TTR("The following files are newer on disk.\nWhat action should be taken?"));
|
||||||
|
vbc->add_child(dl);
|
||||||
|
|
||||||
|
disk_changed_list = memnew(Tree);
|
||||||
|
vbc->add_child(disk_changed_list);
|
||||||
|
disk_changed_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
|
||||||
|
|
||||||
|
disk_changed->connect("confirmed", callable_mp(this, &EditorNode::_reload_modified_scenes));
|
||||||
|
disk_changed->get_ok_button()->set_text(TTR("Reload"));
|
||||||
|
|
||||||
|
disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave");
|
||||||
|
disk_changed->connect("custom_action", callable_mp(this, &EditorNode::_resave_scenes));
|
||||||
|
}
|
||||||
|
|
||||||
|
gui_base->add_child(disk_changed);
|
||||||
|
|
||||||
add_editor_plugin(memnew(AnimationPlayerEditorPlugin(this)));
|
add_editor_plugin(memnew(AnimationPlayerEditorPlugin(this)));
|
||||||
add_editor_plugin(memnew(CanvasItemEditorPlugin(this)));
|
add_editor_plugin(memnew(CanvasItemEditorPlugin(this)));
|
||||||
add_editor_plugin(memnew(Node3DEditorPlugin(this)));
|
add_editor_plugin(memnew(Node3DEditorPlugin(this)));
|
||||||
|
@ -422,6 +422,9 @@ private:
|
|||||||
Label *version_label;
|
Label *version_label;
|
||||||
Button *bottom_panel_raise;
|
Button *bottom_panel_raise;
|
||||||
|
|
||||||
|
Tree *disk_changed_list;
|
||||||
|
ConfirmationDialog *disk_changed;
|
||||||
|
|
||||||
void _bottom_panel_raise_toggled(bool);
|
void _bottom_panel_raise_toggled(bool);
|
||||||
|
|
||||||
EditorInterface *editor_interface;
|
EditorInterface *editor_interface;
|
||||||
@ -641,6 +644,9 @@ private:
|
|||||||
static void _resource_loaded(RES p_resource, const String &p_path);
|
static void _resource_loaded(RES p_resource, const String &p_path);
|
||||||
|
|
||||||
void _resources_changed(const Vector<String> &p_resources);
|
void _resources_changed(const Vector<String> &p_resources);
|
||||||
|
void _scan_external_changes();
|
||||||
|
void _reload_modified_scenes();
|
||||||
|
void _resave_scenes(String p_str);
|
||||||
|
|
||||||
void _feature_profile_changed();
|
void _feature_profile_changed();
|
||||||
bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class);
|
bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class);
|
||||||
@ -741,7 +747,7 @@ public:
|
|||||||
void fix_dependencies(const String &p_for_file);
|
void fix_dependencies(const String &p_for_file);
|
||||||
void clear_scene() { _cleanup_scene(); }
|
void clear_scene() { _cleanup_scene(); }
|
||||||
int new_scene();
|
int new_scene();
|
||||||
Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false);
|
Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false, bool p_silent_change_tab = false);
|
||||||
Error load_resource(const String &p_resource, bool p_ignore_broken_deps = false);
|
Error load_resource(const String &p_resource, bool p_ignore_broken_deps = false);
|
||||||
|
|
||||||
bool is_scene_open(const String &p_path);
|
bool is_scene_open(const String &p_path);
|
||||||
|
Loading…
Reference in New Issue
Block a user