1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #107671 from dsnopek/editor-run-control

Allow editor plugins to modify run arguments
This commit is contained in:
Thaddeus Crews
2025-10-20 18:09:32 -05:00
6 changed files with 37 additions and 1 deletions

View File

@@ -362,6 +362,20 @@
Remember that you have to manage the visibility of all your editor controls manually.
</description>
</method>
<method name="_run_scene" qualifiers="virtual const">
<return type="PackedStringArray" />
<param index="0" name="scene" type="String" />
<param index="1" name="args" type="PackedStringArray" />
<description>
This function is called when an individual scene is about to be played in the editor. [param args] is a list of command line arguments that will be passed to the new Godot instance, which will be replaced by the list returned by this function.
[codeblock]
func _run_scene(scene, args):
args.append("--an-extra-argument")
return args
[/codeblock]
[b]Note:[/b] Text that is printed in this method will not be visible in the editor's Output panel unless [member EditorSettings.run/output/always_clear_output_on_play] is [code]false[/code].
</description>
</method>
<method name="_save_external_data" qualifiers="virtual">
<return type="void" />
<description>

View File

@@ -7142,6 +7142,13 @@ bool EditorNode::call_build() {
return builds_successful;
}
void EditorNode::call_run_scene(const String &p_scene, Vector<String> &r_args) {
for (int i = 0; i < editor_data.get_editor_plugin_count(); i++) {
EditorPlugin *plugin = editor_data.get_editor_plugin(i);
plugin->run_scene(p_scene, r_args);
}
}
void EditorNode::_inherit_imported(const String &p_action) {
open_imported->hide();
load_scene(open_import_request, true, true);

View File

@@ -730,6 +730,7 @@ public:
void _on_plugin_ready(Object *p_script, const String &p_activate_name);
bool call_build();
void call_run_scene(const String &p_scene, Vector<String> &r_args);
// This is a very naive estimation, but we need something now. Will be reworked later.
bool is_editor_ready() const { return is_inside_tree() && !waiting_for_first_scan; }

View File

@@ -556,6 +556,13 @@ bool EditorPlugin::build() {
return success;
}
void EditorPlugin::run_scene(const String &p_scene, Vector<String> &r_args) {
Vector<String> new_args;
if (GDVIRTUAL_CALL(_run_scene, p_scene, r_args, new_args)) {
r_args = new_args;
}
}
void EditorPlugin::queue_save_layout() {
EditorNode::get_singleton()->save_editor_layout_delayed();
}
@@ -695,6 +702,7 @@ void EditorPlugin::_bind_methods() {
GDVIRTUAL_BIND(_set_window_layout, "configuration");
GDVIRTUAL_BIND(_get_window_layout, "configuration");
GDVIRTUAL_BIND(_build);
GDVIRTUAL_BIND(_run_scene, "scene", "args");
GDVIRTUAL_BIND(_enable_plugin);
GDVIRTUAL_BIND(_disable_plugin);

View File

@@ -138,6 +138,7 @@ protected:
GDVIRTUAL1(_set_window_layout, Ref<ConfigFile>)
GDVIRTUAL1(_get_window_layout, Ref<ConfigFile>)
GDVIRTUAL0R(bool, _build)
GDVIRTUAL2RC(Vector<String>, _run_scene, String, Vector<String>)
GDVIRTUAL0(_enable_plugin)
GDVIRTUAL0(_disable_plugin)
@@ -210,6 +211,7 @@ public:
virtual void get_window_layout(Ref<ConfigFile> p_layout);
virtual void edited_scene_changed() {} // if changes are pending in editor, apply them
virtual bool build(); // builds with external tools. Returns true if safe to continue running scene.
virtual void run_scene(const String &p_scene, Vector<String> &r_args);
EditorInterface *get_editor_interface();
ScriptCreateDialog *get_script_create_dialog();

View File

@@ -314,13 +314,17 @@ void EditorRunBar::_run_scene(const String &p_scene_path, const Vector<String> &
if (!EditorNode::get_singleton()->call_build()) {
return;
}
Vector<String> args = p_run_args;
EditorNode::get_singleton()->call_run_scene(run_filename, args);
// Use the existing URI, in case it is overridden by the CLI.
String uri = EditorDebuggerNode::get_singleton()->get_server_uri();
if (uri.is_empty()) {
uri = "tcp://";
}
EditorDebuggerNode::get_singleton()->start(uri);
Error error = editor_run.run(run_filename, write_movie_file, p_run_args);
Error error = editor_run.run(run_filename, write_movie_file, args);
if (error != OK) {
EditorDebuggerNode::get_singleton()->stop();
EditorNode::get_singleton()->show_accept(TTR("Could not start subprocess(es)!"), TTR("OK"));