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
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
|
||
|
|