Skip to content

Commit 3d20e90

Browse files
committed
Merge pull request #99318 from HolonProduction/editor-script-palette
Editor: Add named `EditorScript`s to the command palette
2 parents aad8f57 + c2f33db commit 3d20e90

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed

doc/classes/EditorScript.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
</brief_description>
66
<description>
77
Scripts extending this class and implementing its [method _run] method can be executed from the Script Editor's [b]File &gt; Run[/b] menu option (or by pressing [kbd]Ctrl + Shift + X[/kbd]) while the editor is running. This is useful for adding custom in-editor functionality to Godot. For more complex additions, consider using [EditorPlugin]s instead.
8+
If a script extending this class also has a global class name, it will be included in the editor's command palette.
89
[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.
910
[b]Example:[/b] Running the following script prints "Hello from the Godot Editor!":
1011
[codeblocks]
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**************************************************************************/
2+
/* editor_script_plugin.cpp */
3+
/**************************************************************************/
4+
/* This file is part of: */
5+
/* GODOT ENGINE */
6+
/* https://godotengine.org */
7+
/**************************************************************************/
8+
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9+
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10+
/* */
11+
/* Permission is hereby granted, free of charge, to any person obtaining */
12+
/* a copy of this software and associated documentation files (the */
13+
/* "Software"), to deal in the Software without restriction, including */
14+
/* without limitation the rights to use, copy, modify, merge, publish, */
15+
/* distribute, sublicense, and/or sell copies of the Software, and to */
16+
/* permit persons to whom the Software is furnished to do so, subject to */
17+
/* the following conditions: */
18+
/* */
19+
/* The above copyright notice and this permission notice shall be */
20+
/* included in all copies or substantial portions of the Software. */
21+
/* */
22+
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23+
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24+
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25+
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26+
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27+
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28+
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29+
/**************************************************************************/
30+
31+
#include "editor_script_plugin.h"
32+
33+
#include "editor/editor_command_palette.h"
34+
#include "editor/editor_interface.h"
35+
#include "editor/editor_script.h"
36+
37+
Ref<EditorScript> create_instance(const StringName &p_name) {
38+
Ref<EditorScript> es;
39+
es.instantiate();
40+
Ref<Script> scr = ResourceLoader::load(ScriptServer::get_global_class_path(p_name), "Script", ResourceFormatLoader::CACHE_MODE_REUSE);
41+
if (scr.is_valid()) {
42+
es->set_script(scr);
43+
}
44+
return es;
45+
}
46+
47+
void EditorScriptPlugin::run_command(const StringName &p_name) {
48+
create_instance(p_name)->run();
49+
}
50+
51+
void EditorScriptPlugin::command_palette_about_to_popup() {
52+
for (const StringName &command : commands) {
53+
EditorInterface::get_singleton()->get_command_palette()->remove_command("editor_scripts/" + command);
54+
}
55+
commands.clear();
56+
ScriptServer::get_inheriters_list(SNAME("EditorScript"), &commands);
57+
for (const StringName &command : commands) {
58+
EditorInterface::get_singleton()->get_command_palette()->add_command(String(command).capitalize(), "editor_scripts/" + command, callable_mp(this, &EditorScriptPlugin::run_command), varray(command), nullptr);
59+
}
60+
}
61+
62+
EditorScriptPlugin::EditorScriptPlugin() {
63+
EditorInterface::get_singleton()->get_command_palette()->connect("about_to_popup", callable_mp(this, &EditorScriptPlugin::command_palette_about_to_popup));
64+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**************************************************************************/
2+
/* editor_script_plugin.h */
3+
/**************************************************************************/
4+
/* This file is part of: */
5+
/* GODOT ENGINE */
6+
/* https://godotengine.org */
7+
/**************************************************************************/
8+
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9+
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10+
/* */
11+
/* Permission is hereby granted, free of charge, to any person obtaining */
12+
/* a copy of this software and associated documentation files (the */
13+
/* "Software"), to deal in the Software without restriction, including */
14+
/* without limitation the rights to use, copy, modify, merge, publish, */
15+
/* distribute, sublicense, and/or sell copies of the Software, and to */
16+
/* permit persons to whom the Software is furnished to do so, subject to */
17+
/* the following conditions: */
18+
/* */
19+
/* The above copyright notice and this permission notice shall be */
20+
/* included in all copies or substantial portions of the Software. */
21+
/* */
22+
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23+
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24+
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25+
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26+
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27+
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28+
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29+
/**************************************************************************/
30+
31+
#pragma once
32+
33+
#include "editor/plugins/editor_plugin.h"
34+
35+
class EditorScriptPlugin : public EditorPlugin {
36+
GDCLASS(EditorScriptPlugin, EditorPlugin);
37+
38+
private:
39+
List<StringName> commands;
40+
41+
void run_command(const StringName &p_name);
42+
void command_palette_about_to_popup();
43+
44+
public:
45+
EditorScriptPlugin();
46+
47+
virtual String get_plugin_name() const override { return "EditorScript"; }
48+
};

editor/register_editor_types.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#include "editor/plugins/editor_context_menu_plugin.h"
8585
#include "editor/plugins/editor_debugger_plugin.h"
8686
#include "editor/plugins/editor_resource_tooltip_plugins.h"
87+
#include "editor/plugins/editor_script_plugin.h"
8788
#include "editor/plugins/font_config_plugin.h"
8889
#include "editor/plugins/gpu_particles_collision_sdf_editor_plugin.h"
8990
#include "editor/plugins/gradient_editor_plugin.h"
@@ -218,6 +219,7 @@ void register_editor_types() {
218219
if (!Engine::get_singleton()->is_recovery_mode_hint()) {
219220
EditorPlugins::add_by_type<DebugAdapterServer>();
220221
}
222+
EditorPlugins::add_by_type<EditorScriptPlugin>();
221223
EditorPlugins::add_by_type<FontEditorPlugin>();
222224
EditorPlugins::add_by_type<GPUParticles3DEditorPlugin>();
223225
EditorPlugins::add_by_type<GPUParticlesCollisionSDF3DEditorPlugin>();

0 commit comments

Comments
 (0)