1/**************************************************************************/
2/* editor_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#ifndef EDITOR_PLUGIN_H
32#define EDITOR_PLUGIN_H
33
34#include "core/io/config_file.h"
35#include "scene/3d/camera_3d.h"
36#include "scene/gui/control.h"
37
38class Node3D;
39class Button;
40class PopupMenu;
41class EditorDebuggerPlugin;
42class EditorExport;
43class EditorExportPlugin;
44class EditorImportPlugin;
45class EditorInspectorPlugin;
46class EditorInterface;
47class EditorNode3DGizmoPlugin;
48class EditorResourceConversionPlugin;
49class EditorSceneFormatImporter;
50class EditorScenePostImportPlugin;
51class EditorToolAddons;
52class EditorTranslationParserPlugin;
53class EditorUndoRedoManager;
54class ScriptCreateDialog;
55
56class EditorPlugin : public Node {
57 GDCLASS(EditorPlugin, Node);
58 friend class EditorData;
59
60 bool input_event_forwarding_always_enabled = false;
61 bool force_draw_over_forwarding_enabled = false;
62
63 String last_main_screen_name;
64 String plugin_version;
65
66#ifndef DISABLE_DEPRECATED
67 void _editor_project_settings_changed();
68#endif
69
70protected:
71 void _notification(int p_what);
72
73 static void _bind_methods();
74 EditorUndoRedoManager *get_undo_redo();
75
76 void add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon);
77 void remove_custom_type(const String &p_type);
78
79 GDVIRTUAL1R(bool, _forward_canvas_gui_input, Ref<InputEvent>)
80 GDVIRTUAL1(_forward_canvas_draw_over_viewport, Control *)
81 GDVIRTUAL1(_forward_canvas_force_draw_over_viewport, Control *)
82 GDVIRTUAL2R(int, _forward_3d_gui_input, Camera3D *, Ref<InputEvent>)
83 GDVIRTUAL1(_forward_3d_draw_over_viewport, Control *)
84 GDVIRTUAL1(_forward_3d_force_draw_over_viewport, Control *)
85 GDVIRTUAL0RC(String, _get_plugin_name)
86 GDVIRTUAL0RC(Ref<Texture2D>, _get_plugin_icon)
87 GDVIRTUAL0RC(bool, _has_main_screen)
88 GDVIRTUAL1(_make_visible, bool)
89 GDVIRTUAL1(_edit, Object *)
90 GDVIRTUAL1RC(bool, _handles, Object *)
91 GDVIRTUAL0RC(Dictionary, _get_state)
92 GDVIRTUAL1(_set_state, Dictionary)
93 GDVIRTUAL0(_clear)
94 GDVIRTUAL1RC(String, _get_unsaved_status, String)
95 GDVIRTUAL0(_save_external_data)
96 GDVIRTUAL0(_apply_changes)
97 GDVIRTUAL0RC(Vector<String>, _get_breakpoints)
98 GDVIRTUAL1(_set_window_layout, Ref<ConfigFile>)
99 GDVIRTUAL1(_get_window_layout, Ref<ConfigFile>)
100 GDVIRTUAL0R(bool, _build)
101 GDVIRTUAL0(_enable_plugin)
102 GDVIRTUAL0(_disable_plugin)
103
104public:
105 enum CustomControlContainer {
106 CONTAINER_TOOLBAR,
107 CONTAINER_SPATIAL_EDITOR_MENU,
108 CONTAINER_SPATIAL_EDITOR_SIDE_LEFT,
109 CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT,
110 CONTAINER_SPATIAL_EDITOR_BOTTOM,
111 CONTAINER_CANVAS_EDITOR_MENU,
112 CONTAINER_CANVAS_EDITOR_SIDE_LEFT,
113 CONTAINER_CANVAS_EDITOR_SIDE_RIGHT,
114 CONTAINER_CANVAS_EDITOR_BOTTOM,
115 CONTAINER_INSPECTOR_BOTTOM,
116 CONTAINER_PROJECT_SETTING_TAB_LEFT,
117 CONTAINER_PROJECT_SETTING_TAB_RIGHT,
118 };
119
120 enum DockSlot {
121 DOCK_SLOT_LEFT_UL,
122 DOCK_SLOT_LEFT_BL,
123 DOCK_SLOT_LEFT_UR,
124 DOCK_SLOT_LEFT_BR,
125 DOCK_SLOT_RIGHT_UL,
126 DOCK_SLOT_RIGHT_BL,
127 DOCK_SLOT_RIGHT_UR,
128 DOCK_SLOT_RIGHT_BR,
129 DOCK_SLOT_MAX
130 };
131
132 enum AfterGUIInput {
133 AFTER_GUI_INPUT_PASS,
134 AFTER_GUI_INPUT_STOP,
135 AFTER_GUI_INPUT_CUSTOM
136 };
137
138 //TODO: send a resource for editing to the editor node?
139
140 void add_control_to_container(CustomControlContainer p_location, Control *p_control);
141 void remove_control_from_container(CustomControlContainer p_location, Control *p_control);
142 Button *add_control_to_bottom_panel(Control *p_control, const String &p_title);
143 void add_control_to_dock(DockSlot p_slot, Control *p_control);
144 void remove_control_from_docks(Control *p_control);
145 void remove_control_from_bottom_panel(Control *p_control);
146
147 void add_tool_menu_item(const String &p_name, const Callable &p_callable);
148 void add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu);
149 void remove_tool_menu_item(const String &p_name);
150
151 PopupMenu *get_export_as_menu();
152
153 void set_input_event_forwarding_always_enabled();
154 bool is_input_event_forwarding_always_enabled() { return input_event_forwarding_always_enabled; }
155
156 void set_force_draw_over_forwarding_enabled();
157 bool is_force_draw_over_forwarding_enabled() { return force_draw_over_forwarding_enabled; }
158
159 void notify_main_screen_changed(const String &screen_name);
160 void notify_scene_changed(const Node *scn_root);
161 void notify_scene_closed(const String &scene_filepath);
162 void notify_resource_saved(const Ref<Resource> &p_resource);
163
164 virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event);
165 virtual void forward_canvas_draw_over_viewport(Control *p_overlay);
166 virtual void forward_canvas_force_draw_over_viewport(Control *p_overlay);
167
168 virtual EditorPlugin::AfterGUIInput forward_3d_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event);
169 virtual void forward_3d_draw_over_viewport(Control *p_overlay);
170 virtual void forward_3d_force_draw_over_viewport(Control *p_overlay);
171
172 virtual String get_name() const;
173 virtual const Ref<Texture2D> get_icon() const;
174 virtual String get_plugin_version() const;
175 virtual void set_plugin_version(const String &p_version);
176 virtual bool has_main_screen() const;
177 virtual void make_visible(bool p_visible);
178 virtual void selected_notify() {} //notify that it was raised by the user, not the editor
179 virtual void edit(Object *p_object);
180 virtual bool handles(Object *p_object) const;
181 virtual Dictionary get_state() const; //save editor state so it can't be reloaded when reloading scene
182 virtual void set_state(const Dictionary &p_state); //restore editor state (likely was saved with the scene)
183 virtual void clear(); // clear any temporary data in the editor, reset it (likely new scene or load another scene)
184 virtual String get_unsaved_status(const String &p_for_scene = "") const;
185 virtual void save_external_data(); // if editor references external resources/scenes, save them
186 virtual void apply_changes(); // if changes are pending in editor, apply them
187 virtual void get_breakpoints(List<String> *p_breakpoints);
188 virtual bool get_remove_list(List<Node *> *p_list);
189 virtual void set_window_layout(Ref<ConfigFile> p_layout);
190 virtual void get_window_layout(Ref<ConfigFile> p_layout);
191 virtual void edited_scene_changed() {} // if changes are pending in editor, apply them
192 virtual bool build(); // builds with external tools. Returns true if safe to continue running scene.
193
194 EditorInterface *get_editor_interface();
195 ScriptCreateDialog *get_script_create_dialog();
196
197 void add_undo_redo_inspector_hook_callback(Callable p_callable);
198 void remove_undo_redo_inspector_hook_callback(Callable p_callable);
199
200 int update_overlays() const;
201
202 void queue_save_layout();
203
204 void make_bottom_panel_item_visible(Control *p_item);
205 void hide_bottom_panel();
206
207 void add_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser);
208 void remove_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser);
209
210 void add_import_plugin(const Ref<EditorImportPlugin> &p_importer, bool p_first_priority = false);
211 void remove_import_plugin(const Ref<EditorImportPlugin> &p_importer);
212
213 void add_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
214 void remove_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
215
216 void add_node_3d_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin);
217 void remove_node_3d_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin);
218
219 void add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
220 void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
221
222 void add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer, bool p_first_priority = false);
223 void remove_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer);
224
225 void add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer, bool p_first_priority = false);
226 void remove_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer);
227
228 void add_autoload_singleton(const String &p_name, const String &p_path);
229 void remove_autoload_singleton(const String &p_name);
230
231 void add_debugger_plugin(const Ref<EditorDebuggerPlugin> &p_plugin);
232 void remove_debugger_plugin(const Ref<EditorDebuggerPlugin> &p_plugin);
233
234 void add_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin);
235 void remove_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin);
236
237 void enable_plugin();
238 void disable_plugin();
239
240 EditorPlugin() {}
241 virtual ~EditorPlugin() {}
242};
243
244VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer);
245VARIANT_ENUM_CAST(EditorPlugin::DockSlot);
246VARIANT_ENUM_CAST(EditorPlugin::AfterGUIInput);
247
248typedef EditorPlugin *(*EditorPluginCreateFunc)();
249
250class EditorPlugins {
251 enum {
252 MAX_CREATE_FUNCS = 128
253 };
254
255 static EditorPluginCreateFunc creation_funcs[MAX_CREATE_FUNCS];
256 static int creation_func_count;
257
258 template <class T>
259 static EditorPlugin *creator() {
260 return memnew(T);
261 }
262
263public:
264 static int get_plugin_count() { return creation_func_count; }
265 static EditorPlugin *create(int p_idx) {
266 ERR_FAIL_INDEX_V(p_idx, creation_func_count, nullptr);
267 return creation_funcs[p_idx]();
268 }
269
270 template <class T>
271 static void add_by_type() {
272 add_create_func(creator<T>);
273 }
274
275 static void add_create_func(EditorPluginCreateFunc p_func) {
276 ERR_FAIL_COND(creation_func_count >= MAX_CREATE_FUNCS);
277 creation_funcs[creation_func_count++] = p_func;
278 }
279};
280
281#endif // EDITOR_PLUGIN_H
282