You've already forked godot
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:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user