4 ## Editor root node. Most editor functionality is handled by EditorsManager node!
6 var plugin_reference: EditorPlugin = null
7 var editors_manager: Control = null
9 var editor_file_dialog: EditorFileDialog
11 @onready var sidebar := %Sidebar as DialogicSidebar
13 func _ready() -> void:
14 if get_parent() is SubViewport:
18 sidebar.show_sidebar.connect(_on_sidebar_toggled)
21 editors_manager = $EditorsManager
22 var button: Button = editors_manager.add_icon_button(
23 get_theme_icon("MakeFloating", "EditorIcons"), "Make floating"
25 button.pressed.connect(toggle_floating_window)
28 editor_file_dialog = EditorFileDialog.new()
29 add_child(editor_file_dialog)
31 var info_message := Label.new()
32 info_message.add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"))
33 editor_file_dialog.get_line_edit().get_parent().add_sibling(info_message)
34 info_message.get_parent().move_child(info_message, info_message.get_index() - 1)
35 editor_file_dialog.set_meta("info_message_label", info_message)
37 $SaveConfirmationDialog.add_button("No Saving Please!", true, "nosave")
38 $SaveConfirmationDialog.hide()
39 update_theme_additions()
40 EditorInterface.get_base_control().theme_changed.connect(update_theme_additions)
43 func _on_sidebar_toggled(sidebar_shown: bool) -> void:
44 var h_split := (%HSplit as HSplitContainer)
46 h_split.dragger_visibility = SplitContainer.DRAGGER_VISIBLE
47 h_split.split_offset = 150
48 h_split.collapsed = false
50 h_split.dragger_visibility = SplitContainer.DRAGGER_HIDDEN_COLLAPSED
51 h_split.split_offset = 0
52 h_split.collapsed = true
55 func update_theme_additions() -> void:
56 add_theme_stylebox_override(
62 "background": get_theme_color("base_color", "Editor"),
64 [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()],
75 #'border-color': get_theme_color("base_color", "Editor"),
76 "background": get_theme_color("dark_color_2", "Editor"),
78 [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()],
82 holder_panel.border_width_top = 0
83 holder_panel.corner_radius_top_left = 0
84 editors_manager.editors_holder.add_theme_stylebox_override("panel", holder_panel)
90 theme.set_type_variation("DialogicTitle", "Label")
91 theme.set_font("font", "DialogicTitle", get_theme_font("title", "EditorFonts"))
92 theme.set_color("font_color", "DialogicTitle", get_theme_color("warning_color", "Editor"))
94 "font_uneditable_color", "DialogicTitle", get_theme_color("warning_color", "Editor")
97 "font_selected_color", "DialogicTitle", get_theme_color("warning_color", "Editor")
100 "font_size", "DialogicTitle", get_theme_font_size("doc_size", "EditorFonts")
103 theme.set_type_variation("DialogicSubTitle", "Label")
104 theme.set_font("font", "DialogicSubTitle", get_theme_font("title", "EditorFonts"))
106 "font_size", "DialogicSubTitle", get_theme_font_size("doc_size", "EditorFonts")
108 theme.set_color("font_color", "DialogicSubTitle", get_theme_color("accent_color", "Editor"))
110 theme.set_type_variation("DialogicPanelA", "PanelContainer")
116 "background": get_theme_color("base_color", "Editor"),
121 theme.set_stylebox("panel", "DialogicPanelA", panel_style)
122 theme.set_stylebox("normal", "DialogicPanelA", panel_style)
124 var dark_panel := panel_style.duplicate()
125 dark_panel.bg_color = get_theme_color("dark_color_3", "Editor")
126 theme.set_stylebox("panel", "DialogicPanelDarkA", dark_panel)
128 var cornerless_panel := panel_style.duplicate()
129 cornerless_panel.corner_radius_top_left = 0
130 theme.set_stylebox("panel", "DialogicPanelA_cornerless", cornerless_panel)
132 # panel used for example for portrait previews in character editor
133 theme.set_type_variation("DialogicPanelB", "PanelContainer")
134 var side_panel: StyleBoxFlat = panel_style.duplicate()
135 side_panel.corner_radius_top_left = 0
136 side_panel.corner_radius_bottom_left = 0
137 side_panel.expand_margin_left = get_theme_constant("separation", "SplitContainer")
138 side_panel.bg_color = get_theme_color("dark_color_2", "Editor")
139 side_panel.set_border_width_all(1)
140 side_panel.border_width_left = 0
141 side_panel.border_color = get_theme_color("contrast_color_2", "Editor")
142 theme.set_stylebox("panel", "DialogicPanelB", side_panel)
144 theme.set_type_variation("DialogicEventEdit", "Control")
145 var edit_panel := StyleBoxFlat.new()
146 edit_panel.draw_center = true
147 edit_panel.bg_color = get_theme_color("accent_color", "Editor")
148 edit_panel.bg_color.a = 0.05
149 edit_panel.border_width_bottom = 2
150 edit_panel.border_color = get_theme_color("accent_color", "Editor").lerp(
151 get_theme_color("dark_color_2", "Editor"), 0.4
153 edit_panel.content_margin_left = 5
154 edit_panel.content_margin_right = 5
155 edit_panel.set_corner_radius_all(1)
156 theme.set_stylebox("panel", "DialogicEventEdit", edit_panel)
157 theme.set_stylebox("normal", "DialogicEventEdit", edit_panel)
159 var focus_edit := edit_panel.duplicate()
160 focus_edit.border_color = get_theme_color("property_color_z", "Editor")
161 focus_edit.draw_center = false
162 theme.set_stylebox("focus", "DialogicEventEdit", focus_edit)
164 var hover_edit := edit_panel.duplicate()
165 hover_edit.border_color = get_theme_color("warning_color", "Editor")
167 theme.set_stylebox("hover", "DialogicEventEdit", hover_edit)
168 var disabled_edit := edit_panel.duplicate()
169 disabled_edit.border_color = get_theme_color("property_color", "Editor")
170 theme.set_stylebox("disabled", "DialogicEventEdit", disabled_edit)
172 theme.set_type_variation("DialogicHintText", "Label")
173 theme.set_color("font_color", "DialogicHintText", get_theme_color("readonly_color", "Editor"))
174 theme.set_font("font", "DialogicHintText", get_theme_font("doc_italic", "EditorFonts"))
176 theme.set_type_variation("DialogicHintText2", "Label")
178 "font_color", "DialogicHintText2", get_theme_color("property_color_w", "Editor")
180 theme.set_font("font", "DialogicHintText2", get_theme_font("doc_italic", "EditorFonts"))
182 theme.set_type_variation("DialogicSection", "Label")
183 theme.set_font("font", "DialogicSection", get_theme_font("main_msdf", "EditorFonts"))
184 theme.set_color("font_color", "DialogicSection", get_theme_color("property_color_z", "Editor"))
186 "font_size", "DialogicSection", get_theme_font_size("doc_size", "EditorFonts")
189 theme.set_type_variation("DialogicSettingsSection", "DialogicSection")
190 theme.set_font("font", "DialogicSettingsSection", get_theme_font("main_msdf", "EditorFonts"))
192 "font_color", "DialogicSettingsSection", get_theme_color("property_color_z", "Editor")
195 "font_size", "DialogicSettingsSection", get_theme_font_size("doc_size", "EditorFonts")
198 theme.set_type_variation("DialogicSectionBig", "DialogicSection")
199 theme.set_color("font_color", "DialogicSectionBig", get_theme_color("accent_color", "Editor"))
201 "font_size", "DialogicSectionBig", get_theme_font_size("doc_title_size", "EditorFonts")
204 theme.set_type_variation("DialogicLink", "LinkButton")
205 theme.set_color("font_hover_color", "DialogicLink", get_theme_color("warning_color", "Editor"))
207 theme.set_type_variation("DialogicMegaSeparator", "HSeparator")
212 "DialogicMegaSeparator",
219 "background": get_theme_color("accent_color", "Editor"),
226 theme.set_constant("separation", "DialogicMegaSeparator", 50)
228 theme.set_type_variation("DialogicTextEventTextEdit", "CodeEdit")
229 var editor_settings := plugin_reference.get_editor_interface().get_editor_settings()
236 editor_settings.get_setting("text_editor/theme/highlighting/background_color").lerp(
237 editor_settings.get_setting("text_editor/theme/highlighting/text_color"), 0.05
243 text_panel.content_margin_bottom = 5
244 text_panel.content_margin_left = 13
245 theme.set_stylebox("normal", "DialogicTextEventTextEdit", text_panel)
247 var event_field_group_panel := DCSS.inline({
251 "boder-color": get_theme_color("property_color", "Editor"),
252 "background":"none"})
253 theme.set_type_variation("DialogicEventEditGroup", "PanelContainer")
254 theme.set_stylebox("panel", "DialogicEventEditGroup", event_field_group_panel)
256 theme.set_icon('Plugin', 'Dialogic', load("res://addons/dialogic/Editor/Images/plugin-icon.svg"))
259 ## Switches from floating window mode to embedded mode based on current mode
260 func toggle_floating_window() -> void:
261 if get_parent() is Window:
262 swap_to_embedded_editor()
264 swap_to_floating_window()
267 ## Removes the main control from it's parent and adds it to a new Window node
268 func swap_to_floating_window() -> void:
269 if get_parent() is Window:
272 var parent := get_parent()
273 get_parent().remove_child(self)
274 var window := Window.new()
275 parent.add_child(window)
276 window.add_child(self)
277 window.title = "Dialogic"
278 window.close_requested.connect(swap_to_embedded_editor)
279 window.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS
280 window.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_EXPAND
282 window.min_size = Vector2(500, 500)
283 set_anchors_preset(Control.PRESET_FULL_RECT)
284 window.disable_3d = true
285 window.wrap_controls = true
286 window.popup_centered()
287 plugin_reference.get_editor_interface().set_main_screen_editor("2D")
290 ## Removes the main control from the window node and adds it to it's grandparent
291 ## which is the original owner.
292 func swap_to_embedded_editor() -> void:
293 if not get_parent() is Window:
296 var window := get_parent()
297 get_parent().remove_child(self)
298 plugin_reference.get_editor_interface().set_main_screen_editor("Dialogic")
299 window.get_parent().add_child(self)
303 func godot_file_dialog(
306 mode := EditorFileDialog.FILE_MODE_OPEN_FILE,
307 window_title := "Save",
308 current_file_name := "New_File",
309 saving_something := false,
310 extra_message: String = ""
311 ) -> EditorFileDialog:
312 for connection in editor_file_dialog.file_selected.get_connections():
313 editor_file_dialog.file_selected.disconnect(connection.callable)
314 for connection in editor_file_dialog.dir_selected.get_connections():
315 editor_file_dialog.dir_selected.disconnect(connection.callable)
316 editor_file_dialog.file_mode = mode
317 editor_file_dialog.clear_filters()
318 editor_file_dialog.popup_centered_ratio(0.6)
319 editor_file_dialog.add_filter(filter)
320 editor_file_dialog.title = window_title
321 editor_file_dialog.current_file = current_file_name
322 editor_file_dialog.disable_overwrite_warning = !saving_something
324 editor_file_dialog.get_meta("info_message_label").show()
325 editor_file_dialog.get_meta("info_message_label").text = extra_message
327 editor_file_dialog.get_meta("info_message_label").hide()
329 if mode == EditorFileDialog.FILE_MODE_OPEN_FILE or mode == EditorFileDialog.FILE_MODE_SAVE_FILE:
330 editor_file_dialog.file_selected.connect(callable)
331 elif mode == EditorFileDialog.FILE_MODE_OPEN_DIR:
332 editor_file_dialog.dir_selected.connect(callable)
333 elif mode == EditorFileDialog.FILE_MODE_OPEN_ANY:
334 editor_file_dialog.dir_selected.connect(callable)
335 editor_file_dialog.file_selected.connect(callable)
336 return editor_file_dialog