You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
9.8 KiB

6 months ago
@tool
extends Control
## Editor root node. Most editor functionality is handled by EditorsManager node!
var plugin_reference: EditorPlugin = null
var editors_manager: Control = null
var editor_file_dialog: EditorFileDialog
## Styling
@export var editor_tab_bg := StyleBoxFlat.new()
func _ready() -> void:
if get_parent() is SubViewport:
return
## REFERENCES
editors_manager = $Margin/EditorsManager
var button :Button = editors_manager.add_icon_button(get_theme_icon("MakeFloating", "EditorIcons"), 'Make floating')
button.pressed.connect(toggle_floating_window)
## STYLING
$BG.color = get_theme_color("base_color", "Editor")
editor_tab_bg.border_color = get_theme_color("base_color", "Editor")
editor_tab_bg.bg_color = get_theme_color("dark_color_2", "Editor")
$Margin/EditorsManager.editors_holder.add_theme_stylebox_override('panel', editor_tab_bg)
$Margin.set("theme_override_constants/margin_right", get_theme_constant("base_margin", "Editor") * DialogicUtil.get_editor_scale())
$Margin.set("theme_override_constants/margin_bottom", get_theme_constant("base_margin", "Editor") * DialogicUtil.get_editor_scale())
# File dialog
editor_file_dialog = EditorFileDialog.new()
add_child(editor_file_dialog)
var info_message := Label.new()
info_message.add_theme_color_override('font_color', get_theme_color("warning_color", "Editor"))
editor_file_dialog.get_line_edit().get_parent().add_sibling(info_message)
info_message.get_parent().move_child(info_message, info_message.get_index()-1)
editor_file_dialog.set_meta('info_message_label', info_message)
$SaveConfirmationDialog.add_button('No Saving Please!', true, 'nosave')
$SaveConfirmationDialog.hide()
update_theme_additions()
func update_theme_additions():
if theme == null:
theme = Theme.new()
theme.clear()
theme.set_type_variation('DialogicTitle', 'Label')
theme.set_font('font', 'DialogicTitle', get_theme_font("title", "EditorFonts"))
theme.set_color('font_color', 'DialogicTitle', get_theme_color('warning_color', 'Editor'))
theme.set_color('font_uneditable_color', 'DialogicTitle', get_theme_color('warning_color', 'Editor'))
theme.set_color('font_selected_color', 'DialogicTitle', get_theme_color('warning_color', 'Editor'))
theme.set_font_size('font_size', 'DialogicTitle', get_theme_font_size("doc_size", "EditorFonts"))
theme.set_type_variation('DialogicSubTitle', 'Label')
theme.set_font('font', 'DialogicSubTitle', get_theme_font("title", "EditorFonts"))
theme.set_font_size('font_size', 'DialogicSubTitle', get_theme_font_size("doc_size", "EditorFonts"))
theme.set_color('font_color', 'DialogicSubTitle', get_theme_color('accent_color', 'Editor'))
theme.set_type_variation('DialogicPanelA', 'PanelContainer')
var panel_style := DCSS.inline({
'border-radius': 10,
'border': 0,
'border_color':get_theme_color("dark_color_3", "Editor"),
'background': get_theme_color("base_color", "Editor"),
'padding': [5, 5],
})
theme.set_stylebox('panel', 'DialogicPanelA', panel_style)
theme.set_stylebox('normal', 'DialogicPanelA', panel_style)
var dark_panel := panel_style.duplicate()
dark_panel.bg_color = get_theme_color("dark_color_3", "Editor")
theme.set_stylebox('panel', 'DialogicPanelDarkA', dark_panel)
var cornerless_panel := panel_style.duplicate()
cornerless_panel.corner_radius_top_left = 0
theme.set_stylebox('panel', 'DialogicPanelA_cornerless', cornerless_panel)
# panel used for example for portrait previews in character editor
theme.set_type_variation('DialogicPanelB', 'PanelContainer')
var side_panel :StyleBoxFlat= panel_style.duplicate()
side_panel.corner_radius_top_left = 0
side_panel.corner_radius_bottom_left = 0
side_panel.expand_margin_left = 8
side_panel.bg_color = get_theme_color("dark_color_2", "Editor")
side_panel.set_border_width_all(1)
side_panel.border_width_left = 0
side_panel.border_color = get_theme_color("contrast_color_2", "Editor")
theme.set_stylebox('panel', 'DialogicPanelB', side_panel)
theme.set_type_variation('DialogicEventEdit', 'Control')
var edit_panel := StyleBoxFlat.new()
edit_panel.draw_center = true
edit_panel.bg_color = get_theme_color("accent_color", "Editor")
edit_panel.bg_color.a = 0.05
edit_panel.border_width_bottom = 2
edit_panel.border_color = get_theme_color("accent_color", "Editor").lerp(get_theme_color("dark_color_2", "Editor"), 0.4)
edit_panel.content_margin_left = 5
edit_panel.content_margin_right = 5
edit_panel.set_corner_radius_all(1)
theme.set_stylebox('panel', 'DialogicEventEdit', edit_panel)
theme.set_stylebox('normal', 'DialogicEventEdit', edit_panel)
var focus_edit := edit_panel.duplicate()
focus_edit.border_color = get_theme_color("property_color_z", "Editor")
focus_edit.draw_center = false
theme.set_stylebox('focus', 'DialogicEventEdit', focus_edit)
var hover_edit := edit_panel.duplicate()
hover_edit.border_color = get_theme_color("warning_color", "Editor")
theme.set_stylebox('hover', 'DialogicEventEdit', hover_edit)
var disabled_edit := edit_panel.duplicate()
disabled_edit.border_color = get_theme_color("property_color", "Editor")
theme.set_stylebox('disabled', 'DialogicEventEdit', disabled_edit)
theme.set_type_variation('DialogicHintText', 'Label')
theme.set_color('font_color', 'DialogicHintText', get_theme_color("readonly_color", "Editor"))
theme.set_font('font', 'DialogicHintText', get_theme_font("doc_italic", "EditorFonts"))
theme.set_type_variation('DialogicHintText2', 'Label')
theme.set_color('font_color', 'DialogicHintText2', get_theme_color("property_color_w", "Editor"))
theme.set_font('font', 'DialogicHintText2', get_theme_font("doc_italic", "EditorFonts"))
theme.set_type_variation('DialogicSection', 'Label')
theme.set_font('font', 'DialogicSection', get_theme_font("main_msdf", "EditorFonts"))
theme.set_color('font_color', 'DialogicSection', get_theme_color("property_color_z", "Editor"))
theme.set_font_size('font_size', 'DialogicSection', get_theme_font_size("doc_size", "EditorFonts"))
theme.set_type_variation('DialogicSettingsSection', 'DialogicSection')
theme.set_font('font', 'DialogicSettingsSection', get_theme_font("main_msdf", "EditorFonts"))
theme.set_color('font_color', 'DialogicSettingsSection', get_theme_color("property_color_z", "Editor"))
theme.set_font_size('font_size', 'DialogicSettingsSection', get_theme_font_size("doc_size", "EditorFonts"))
theme.set_type_variation('DialogicSectionBig', 'DialogicSection')
theme.set_color('font_color', 'DialogicSectionBig', get_theme_color("accent_color", "Editor"))
theme.set_font_size('font_size', 'DialogicSectionBig', get_theme_font_size("doc_title_size", "EditorFonts"))
theme.set_type_variation('DialogicLink', 'LinkButton')
theme.set_color('font_hover_color', 'DialogicLink', get_theme_color("warning_color", "Editor"))
theme.set_type_variation('DialogicMegaSeparator', 'HSeparator')
theme.set_stylebox('separator', 'DialogicMegaSeparator', DCSS.inline({
'border-radius': 10,
'border': 0,
'background': get_theme_color("accent_color", "Editor"),
'padding': [5, 5],
}))
theme.set_constant('separation', 'DialogicMegaSeparator', 50)
theme.set_icon('Plugin', 'Dialogic', load("res://addons/dialogic/Editor/Images/plugin-icon.svg"))
## Switches from floating window mode to embedded mode based on current mode
func toggle_floating_window():
if get_parent() is Window:
swap_to_embedded_editor()
else:
swap_to_floating_window()
## Removes the main control from it's parent and adds it to a new Window node
func swap_to_floating_window():
if get_parent() is Window:
return
var parent := get_parent()
get_parent().remove_child(self)
var window := Window.new()
parent.add_child(window)
window.add_child(self)
window.title = "Dialogic"
window.close_requested.connect(swap_to_embedded_editor)
window.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS
window.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_EXPAND
window.size = size
window.min_size = Vector2(500, 500)
set_anchors_preset(Control.PRESET_FULL_RECT)
window.disable_3d = true
window.wrap_controls = true
window.popup_centered()
plugin_reference.get_editor_interface().set_main_screen_editor('2D')
## Removes the main control from the window node and adds it to it's grandparent
## which is the original owner.
func swap_to_embedded_editor():
if not get_parent() is Window:
return
var window := get_parent()
get_parent().remove_child(self)
plugin_reference.get_editor_interface().set_main_screen_editor('Dialogic')
window.get_parent().add_child(self)
window.queue_free()
func godot_file_dialog(callable:Callable, filter:String, mode := EditorFileDialog.FILE_MODE_OPEN_FILE, window_title := "Save", current_file_name := 'New_File', saving_something := false, extra_message:String = "") -> EditorFileDialog:
for connection in editor_file_dialog.file_selected.get_connections():
editor_file_dialog.file_selected.disconnect(connection.callable)
for connection in editor_file_dialog.dir_selected.get_connections():
editor_file_dialog.dir_selected.disconnect(connection.callable)
editor_file_dialog.file_mode = mode
editor_file_dialog.clear_filters()
editor_file_dialog.popup_centered_ratio(0.6)
editor_file_dialog.add_filter(filter)
editor_file_dialog.title = window_title
editor_file_dialog.current_file = current_file_name
editor_file_dialog.disable_overwrite_warning = !saving_something
if extra_message:
editor_file_dialog.get_meta('info_message_label').show()
editor_file_dialog.get_meta('info_message_label').text = extra_message
else:
editor_file_dialog.get_meta('info_message_label').hide()
if mode == EditorFileDialog.FILE_MODE_OPEN_FILE or mode == EditorFileDialog.FILE_MODE_SAVE_FILE:
editor_file_dialog.file_selected.connect(callable)
elif mode == EditorFileDialog.FILE_MODE_OPEN_DIR:
editor_file_dialog.dir_selected.connect(callable)
elif mode == EditorFileDialog.FILE_MODE_OPEN_ANY:
editor_file_dialog.dir_selected.connect(callable)
editor_file_dialog.file_selected.connect(callable)
return editor_file_dialog