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.

170 lines
5.0 KiB

6 months ago
@tool
extends DialogicEditor
## Editor that contains all settings
var button_group := ButtonGroup.new()
var registered_sections :Array[DialogicSettingsPage] = []
func _get_title() -> String:
return "Settings"
func _get_icon() -> Texture:
return get_theme_icon("PluginScript", "EditorIcons")
func _register():
editors_manager.register_simple_editor(self)
self.alternative_text = "Customize dialogic and it's behaviour"
func _ready():
if get_parent() is SubViewport:
return
register_settings_section("res://addons/dialogic/Editor/Settings/settings_general.tscn")
register_settings_section("res://addons/dialogic/Editor/Settings/settings_translation.tscn")
register_settings_section("res://addons/dialogic/Editor/Settings/settings_modules.tscn")
for indexer in DialogicUtil.get_indexers():
for settings_page in indexer._get_settings_pages():
register_settings_section(settings_page)
add_registered_sections()
%SettingsTabs.get_child(0).button_pressed = true
%SettingsContent.get_child(0).show()
func register_settings_section(path:String) -> void:
var section :Control = load(path).instantiate()
registered_sections.append(section)
func add_registered_sections() -> void:
for i in %SettingsTabs.get_children():
i.queue_free()
for i in %FeatureTabs.get_children():
i.queue_free()
for i in %SettingsContent.get_children():
i.queue_free()
registered_sections.sort_custom(section_sort)
for section in registered_sections:
section.name = section._get_title()
var vbox := VBoxContainer.new()
vbox.set_meta('section', section)
vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL
vbox.name = section.name
var hbox := HBoxContainer.new()
var title := Label.new()
title.text = section.name
title.theme_type_variation = 'DialogicSectionBig'
hbox.add_child(title)
vbox.add_child(hbox)
if !section.short_info.is_empty():
var tooltip_hint :Control = load("res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn").instantiate()
tooltip_hint.hint_text = section.short_info
hbox.add_child(tooltip_hint)
var scroll := ScrollContainer.new()
scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL
scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL
var inner_vbox := VBoxContainer.new()
inner_vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL
inner_vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL
scroll.add_child(inner_vbox)
var panel := PanelContainer.new()
panel.theme_type_variation = "DialogicPanelA"
panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
if section.size_flags_vertical == Control.SIZE_EXPAND_FILL:
panel.size_flags_vertical = Control.SIZE_EXPAND_FILL
inner_vbox.add_child(panel)
var info_section :Control = section._get_info_section()
if info_section != null:
inner_vbox.add_child(Control.new())
inner_vbox.get_child(-1).custom_minimum_size.y = 50
inner_vbox.add_child(title.duplicate())
inner_vbox.get_child(-1).text = "Information"
var info_panel := panel.duplicate()
info_panel.theme_type_variation = "DialogicPanelDarkA"
inner_vbox.add_child(info_panel)
info_section.get_parent().remove_child(info_section)
info_panel.add_child(info_section)
panel.add_child(section)
vbox.add_child(scroll)
var button := Button.new()
button.text = " "+section.name
button.tooltip_text = section.name
button.toggle_mode = true
button.button_group = button_group
button.expand_icon = true
button.alignment = HORIZONTAL_ALIGNMENT_LEFT
button.flat = true
button.add_theme_color_override('font_pressed_color', get_theme_color("property_color_z", "Editor"))
button.add_theme_color_override('font_hover_color', get_theme_color('warning_color', 'Editor'))
button.add_theme_color_override('font_focus_color', get_theme_color('warning_color', 'Editor'))
button.add_theme_stylebox_override('focus', StyleBoxEmpty.new())
button.pressed.connect(open_tab.bind(vbox))
if section._is_feature_tab():
%FeatureTabs.add_child(button)
else:
%SettingsTabs.add_child(button)
vbox.hide()
# if section.has_method('_get_icon'):
# icon.texture = section._get_icon()
%SettingsContent.add_child(vbox)
func open_tab(tab_to_show:Control) -> void:
for tab in %SettingsContent.get_children():
tab.hide()
tab_to_show.show()
func section_sort(item1:DialogicSettingsPage, item2:DialogicSettingsPage) -> bool:
if !item1._is_feature_tab() and item2._is_feature_tab():
return true
if item1._get_priority() > item2._get_priority():
return true
return false
func _open(extra_information:Variant = null) -> void:
refresh()
if typeof(extra_information) == TYPE_STRING:
if %SettingsContent.has_node(extra_information):
open_tab(%SettingsContent.get_node(extra_information))
func _close():
for child in %SettingsContent.get_children():
if child.get_meta('section').has_method('_about_to_close'):
child.get_meta('section')._about_to_close()
func refresh():
for child in %SettingsContent.get_children():
if child.get_meta('section').has_method('_refresh'):
child.get_meta('section')._refresh()