Browse Source

Merge pull request #27309 from KoBeWi/main_scene_on_android

Ensure main scene is set when running on device
Rémi Verschelde 6 years ago
parent
commit
a69436aa4e
4 changed files with 57 additions and 23 deletions
  1. 38 23
      editor/editor_node.cpp
  2. 2 0
      editor/editor_node.h
  3. 12 0
      editor/editor_run_native.cpp
  4. 5 0
      editor/editor_run_native.h

+ 38 - 23
editor/editor_node.cpp

@@ -1296,7 +1296,12 @@ void EditorNode::_dialog_action(String p_file) {
 			ProjectSettings::get_singleton()->set("application/run/main_scene", p_file);
 			ProjectSettings::get_singleton()->save();
 			//would be nice to show the project manager opened with the highlighted field..
-			_run(false, ""); // automatically run the project
+
+			if (pick_main_scene->has_meta("from_native") && (bool)pick_main_scene->get_meta("from_native")) {
+				run_native->resume_run_native();
+			} else {
+				_run(false, ""); // automatically run the project
+			}
 		} break;
 		case FILE_CLOSE:
 		case FILE_CLOSE_ALL_AND_QUIT:
@@ -1809,28 +1814,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
 	if (run_filename == "") {
 
 		//evidently, run the scene
-		main_scene = GLOBAL_DEF("application/run/main_scene", "");
-		if (main_scene == "") {
-
-			current_option = -1;
-			pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in \"Project Settings\" under the 'application' category."));
-			pick_main_scene->popup_centered_minsize();
-			return;
-		}
-
-		if (!FileAccess::exists(main_scene)) {
-
-			current_option = -1;
-			pick_main_scene->set_text(vformat(TTR("Selected scene '%s' does not exist, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
-			pick_main_scene->popup_centered_minsize();
-			return;
-		}
-
-		if (ResourceLoader::get_resource_type(main_scene) != "PackedScene") {
-
-			current_option = -1;
-			pick_main_scene->set_text(vformat(TTR("Selected scene '%s' is not a scene file, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
-			pick_main_scene->popup_centered_minsize();
+		if (!ensure_main_scene(false)) {
 			return;
 		}
 	}
@@ -4167,6 +4151,37 @@ bool EditorNode::has_scenes_in_session() {
 	return !scenes.empty();
 }
 
+bool EditorNode::ensure_main_scene(bool p_from_native) {
+	pick_main_scene->set_meta("from_native", p_from_native); //whether from play button or native run
+	String main_scene = GLOBAL_DEF("application/run/main_scene", "");
+
+	if (main_scene == "") {
+
+		current_option = -1;
+		pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in \"Project Settings\" under the 'application' category."));
+		pick_main_scene->popup_centered_minsize();
+		return false;
+	}
+
+	if (!FileAccess::exists(main_scene)) {
+
+		current_option = -1;
+		pick_main_scene->set_text(vformat(TTR("Selected scene '%s' does not exist, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
+		pick_main_scene->popup_centered_minsize();
+		return false;
+	}
+
+	if (ResourceLoader::get_resource_type(main_scene) != "PackedScene") {
+
+		current_option = -1;
+		pick_main_scene->set_text(vformat(TTR("Selected scene '%s' is not a scene file, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
+		pick_main_scene->popup_centered_minsize();
+		return false;
+	}
+
+	return true;
+}
+
 void EditorNode::_update_layouts_menu() {
 
 	editor_layouts->clear();

+ 2 - 0
editor/editor_node.h

@@ -836,6 +836,8 @@ public:
 
 	static void add_init_callback(EditorNodeInitCallback p_callback) { _init_callbacks.push_back(p_callback); }
 	static void add_build_callback(EditorBuildCallback p_callback);
+
+	bool ensure_main_scene(bool p_from_native);
 };
 
 struct EditorProgress {

+ 12 - 0
editor/editor_run_native.cpp

@@ -101,6 +101,12 @@ void EditorRunNative::_notification(int p_what) {
 
 void EditorRunNative::_run_native(int p_idx, int p_platform) {
 
+	if (!EditorNode::get_singleton()->ensure_main_scene(true)) {
+		resume_idx = p_idx;
+		resume_platform = p_platform;
+		return;
+	}
+
 	Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(p_platform);
 	ERR_FAIL_COND(eep.is_null());
 
@@ -144,6 +150,10 @@ void EditorRunNative::_run_native(int p_idx, int p_platform) {
 	eep->run(preset, p_idx, flags);
 }
 
+void EditorRunNative::resume_run_native() {
+	_run_native(resume_idx, resume_platform);
+}
+
 void EditorRunNative::_bind_methods() {
 
 	ClassDB::bind_method("_run_native", &EditorRunNative::_run_native);
@@ -198,4 +208,6 @@ EditorRunNative::EditorRunNative() {
 	deploy_debug_remote = false;
 	debug_collisions = false;
 	debug_navigation = false;
+	resume_idx = 0;
+	resume_platform = 0;
 }

+ 5 - 0
editor/editor_run_native.h

@@ -45,6 +45,9 @@ class EditorRunNative : public HBoxContainer {
 	bool debug_collisions;
 	bool debug_navigation;
 
+	int resume_idx;
+	int resume_platform;
+
 	void _run_native(int p_idx, int p_platform);
 
 protected:
@@ -64,6 +67,8 @@ public:
 	void set_debug_navigation(bool p_debug);
 	bool get_debug_navigation() const;
 
+	void resume_run_native();
+
 	EditorRunNative();
 };