]> Untitled Git - wolf-seeking-sheep.git/blob - addons/dialogic/Editor/editor_main.gd
Adding import files
[wolf-seeking-sheep.git] / addons / dialogic / Editor / editor_main.gd
1 @tool
2 extends Control
3
4 ## Editor root node. Most editor functionality is handled by EditorsManager node!
5
6 var plugin_reference: EditorPlugin = null
7 var editors_manager: Control = null
8
9 var editor_file_dialog: EditorFileDialog
10
11 @onready var sidebar := %Sidebar as DialogicSidebar
12
13 func _ready() -> void:
14         if get_parent() is SubViewport:
15                 return
16
17         ## CONNECTIONS
18         sidebar.show_sidebar.connect(_on_sidebar_toggled)
19
20         ## REFERENCES
21         editors_manager = $EditorsManager
22         var button: Button = editors_manager.add_icon_button(
23                 get_theme_icon("MakeFloating", "EditorIcons"), "Make floating"
24         )
25         button.pressed.connect(toggle_floating_window)
26
27         # File dialog
28         editor_file_dialog = EditorFileDialog.new()
29         add_child(editor_file_dialog)
30
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)
36
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)
41
42
43 func _on_sidebar_toggled(sidebar_shown: bool) -> void:
44         var h_split := (%HSplit as HSplitContainer)
45         if sidebar_shown:
46                 h_split.dragger_visibility = SplitContainer.DRAGGER_VISIBLE
47                 h_split.split_offset = 150
48                 h_split.collapsed = false
49         else:
50                 h_split.dragger_visibility = SplitContainer.DRAGGER_HIDDEN_COLLAPSED
51                 h_split.split_offset = 0
52                 h_split.collapsed = true
53
54
55 func update_theme_additions() -> void:
56         add_theme_stylebox_override(
57                 "panel",
58                 (
59                         DCSS
60                         . inline(
61                                 {
62                                         "background": get_theme_color("base_color", "Editor"),
63                                         "padding":
64                                         [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()],
65                                 }
66                         )
67                 )
68         )
69         var holder_panel := (
70                 DCSS
71                 . inline(
72                         {
73                                 "border-radius": 5,
74                                 #'border': 2,
75                                 #'border-color': get_theme_color("base_color", "Editor"),
76                                 "background": get_theme_color("dark_color_2", "Editor"),
77                                 "padding":
78                                 [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()],
79                         }
80                 )
81         )
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)
85
86         if theme == null:
87                 theme = Theme.new()
88         theme.clear()
89
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"))
93         theme.set_color(
94                 "font_uneditable_color", "DialogicTitle", get_theme_color("warning_color", "Editor")
95         )
96         theme.set_color(
97                 "font_selected_color", "DialogicTitle", get_theme_color("warning_color", "Editor")
98         )
99         theme.set_font_size(
100                 "font_size", "DialogicTitle", get_theme_font_size("doc_size", "EditorFonts")
101         )
102
103         theme.set_type_variation("DialogicSubTitle", "Label")
104         theme.set_font("font", "DialogicSubTitle", get_theme_font("title", "EditorFonts"))
105         theme.set_font_size(
106                 "font_size", "DialogicSubTitle", get_theme_font_size("doc_size", "EditorFonts")
107         )
108         theme.set_color("font_color", "DialogicSubTitle", get_theme_color("accent_color", "Editor"))
109
110         theme.set_type_variation("DialogicPanelA", "PanelContainer")
111         var panel_style := (
112                 DCSS
113                 . inline(
114                         {
115                                 "border-radius": 10,
116                                 "background": get_theme_color("base_color", "Editor"),
117                                 "padding": [5, 5],
118                         }
119                 )
120         )
121         theme.set_stylebox("panel", "DialogicPanelA", panel_style)
122         theme.set_stylebox("normal", "DialogicPanelA", panel_style)
123
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)
127
128         var cornerless_panel := panel_style.duplicate()
129         cornerless_panel.corner_radius_top_left = 0
130         theme.set_stylebox("panel", "DialogicPanelA_cornerless", cornerless_panel)
131
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)
143
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
152         )
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)
158
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)
163
164         var hover_edit := edit_panel.duplicate()
165         hover_edit.border_color = get_theme_color("warning_color", "Editor")
166
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)
171
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"))
175
176         theme.set_type_variation("DialogicHintText2", "Label")
177         theme.set_color(
178                 "font_color", "DialogicHintText2", get_theme_color("property_color_w", "Editor")
179         )
180         theme.set_font("font", "DialogicHintText2", get_theme_font("doc_italic", "EditorFonts"))
181
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"))
185         theme.set_font_size(
186                 "font_size", "DialogicSection", get_theme_font_size("doc_size", "EditorFonts")
187         )
188
189         theme.set_type_variation("DialogicSettingsSection", "DialogicSection")
190         theme.set_font("font", "DialogicSettingsSection", get_theme_font("main_msdf", "EditorFonts"))
191         theme.set_color(
192                 "font_color", "DialogicSettingsSection", get_theme_color("property_color_z", "Editor")
193         )
194         theme.set_font_size(
195                 "font_size", "DialogicSettingsSection", get_theme_font_size("doc_size", "EditorFonts")
196         )
197
198         theme.set_type_variation("DialogicSectionBig", "DialogicSection")
199         theme.set_color("font_color", "DialogicSectionBig", get_theme_color("accent_color", "Editor"))
200         theme.set_font_size(
201                 "font_size", "DialogicSectionBig", get_theme_font_size("doc_title_size", "EditorFonts")
202         )
203
204         theme.set_type_variation("DialogicLink", "LinkButton")
205         theme.set_color("font_hover_color", "DialogicLink", get_theme_color("warning_color", "Editor"))
206
207         theme.set_type_variation("DialogicMegaSeparator", "HSeparator")
208         (
209                 theme
210                 . set_stylebox(
211                         "separator",
212                         "DialogicMegaSeparator",
213                         (
214                                 DCSS
215                                 . inline(
216                                         {
217                                                 "border-radius": 10,
218                                                 "border": 0,
219                                                 "background": get_theme_color("accent_color", "Editor"),
220                                                 "padding": [5, 5],
221                                         }
222                                 )
223                         )
224                 )
225         )
226         theme.set_constant("separation", "DialogicMegaSeparator", 50)
227
228         theme.set_type_variation("DialogicTextEventTextEdit", "CodeEdit")
229         var editor_settings := plugin_reference.get_editor_interface().get_editor_settings()
230         var text_panel := (
231                 DCSS
232                 . inline(
233                         {
234                                 "border-radius": 8,
235                                 "background":
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
238                                 ),
239                                 "padding": [8, 8],
240                         }
241                 )
242         )
243         text_panel.content_margin_bottom = 5
244         text_panel.content_margin_left = 13
245         theme.set_stylebox("normal", "DialogicTextEventTextEdit", text_panel)
246
247         var event_field_group_panel := DCSS.inline({
248                 'border-radius': 8,
249                 "border":1,
250                 "padding":2,
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)
255
256         theme.set_icon('Plugin', 'Dialogic', load("res://addons/dialogic/Editor/Images/plugin-icon.svg"))
257
258
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()
263         else:
264                 swap_to_floating_window()
265
266
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:
270                 return
271
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
281         window.size = size
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")
288
289
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:
294                 return
295
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)
300         window.queue_free()
301
302
303 func godot_file_dialog(
304         callable: Callable,
305         filter: String,
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
323         if extra_message:
324                 editor_file_dialog.get_meta("info_message_label").show()
325                 editor_file_dialog.get_meta("info_message_label").text = extra_message
326         else:
327                 editor_file_dialog.get_meta("info_message_label").hide()
328
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