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.

241 lines
9.0 KiB

6 months ago
@tool
extends DialogicSettingsPage
var autopause_sets := {}
const _SETTING_LETTER_SPEED := 'dialogic/text/letter_speed'
const _SETTING_INPUT_ACTION := 'dialogic/text/input_action'
const _SETTING_TEXT_REVEAL_SKIPPABLE := 'dialogic/text/initial_text_reveal_skippable'
const _SETTING_TEXT_REVEAL_SKIPPABLE_DELAY := 'dialogic/text/text_reveal_skip_delay'
const _SETTING_TEXT_ADVANCE_DELAY := 'dialogic/text/advance_delay'
const _SETTING_AUTOCOLOR_NAMES := 'dialogic/text/autocolor_names'
const _SETTING_SPLIT_AT_NEW_LINES := 'dialogic/text/split_at_new_lines'
const _SETTING_SPLIT_AT_NEW_LINES_AS := 'dialogic/text/split_at_new_lines_as'
const _SETTING_AUTOSKIP_TIME_PER_EVENT := 'dialogic/text/autoskip_time_per_event'
const _SETTING_AUTOADVANCE_ENABLED := 'dialogic/text/autoadvance_enabled'
const _SETTING_AUTOADVANCE_FIXED_DELAY := 'dialogic/text/autoadvance_fixed_delay'
const _SETTING_AUTOADVANCE_WORD_DELAY := 'dialogic/text/autoadvance_per_word_delay'
const _SETTING_AUTOADVANCE_CHARACTER_DELAY := 'dialogic/text/autoadvance_per_character_delay'
const _SETTING_AUTOADVANCE_IGNORED_CHARACTERS_ENABLED := 'dialogic/text/autoadvance_ignored_characters_enabled'
const _SETTING_AUTOADVANCE_IGNORED_CHARACTERS := 'dialogic/text/autoadvance_ignored_characters'
const _SETTING_ABSOLUTE_AUTOPAUSES := 'dialogic/text/absolute_autopauses'
const _SETTING_AUTOPAUSES := 'dialogic/text/autopauses'
func _get_priority() -> int:
return 98
func _get_title() -> String:
return "Text"
func _ready() -> void:
%DefaultSpeed.value_changed.connect(_on_float_set.bind(_SETTING_LETTER_SPEED))
%Skippable.toggled.connect(_on_bool_set.bind(_SETTING_TEXT_REVEAL_SKIPPABLE))
%SkippableDelay.value_changed.connect(_on_float_set.bind(_SETTING_TEXT_REVEAL_SKIPPABLE_DELAY))
%AdvanceDelay.value_changed.connect(_on_float_set.bind(_SETTING_TEXT_ADVANCE_DELAY))
%AutocolorNames.toggled.connect(_on_bool_set.bind(_SETTING_AUTOCOLOR_NAMES))
%NewEvents.toggled.connect(_on_bool_set.bind(_SETTING_SPLIT_AT_NEW_LINES))
%AutoAdvance.toggled.connect(_on_bool_set.bind(_SETTING_AUTOADVANCE_ENABLED))
%FixedDelay.value_changed.connect(_on_float_set.bind(_SETTING_AUTOADVANCE_FIXED_DELAY))
%IgnoredCharactersEnabled.toggled.connect(_on_bool_set.bind(_SETTING_AUTOADVANCE_IGNORED_CHARACTERS_ENABLED))
%AutoskipTimePerEvent.value_changed.connect(_on_float_set.bind(_SETTING_AUTOSKIP_TIME_PER_EVENT))
%AutoPausesAbsolute.toggled.connect(_on_bool_set.bind(_SETTING_ABSOLUTE_AUTOPAUSES))
func _refresh() -> void:
## BEHAVIOUR
%DefaultSpeed.value = ProjectSettings.get_setting(_SETTING_LETTER_SPEED, 0.01)
%InputAction.resource_icon = get_theme_icon(&"Mouse", &"EditorIcons")
%InputAction.set_value(ProjectSettings.get_setting(_SETTING_INPUT_ACTION, &'dialogic_default_action'))
%InputAction.get_suggestions_func = suggest_actions
%Skippable.button_pressed = ProjectSettings.get_setting(_SETTING_TEXT_REVEAL_SKIPPABLE, true)
%SkippableDelay.value = ProjectSettings.get_setting(_SETTING_TEXT_REVEAL_SKIPPABLE_DELAY, 0.1)
%AdvanceDelay.value = ProjectSettings.get_setting(_SETTING_TEXT_ADVANCE_DELAY, 0.1)
%AutocolorNames.button_pressed = ProjectSettings.get_setting(_SETTING_AUTOCOLOR_NAMES, false)
%NewEvents.button_pressed = ProjectSettings.get_setting(_SETTING_SPLIT_AT_NEW_LINES, false)
%NewEventOption.select(ProjectSettings.get_setting(_SETTING_SPLIT_AT_NEW_LINES_AS, 0))
## AUTO-ADVANCE
%AutoAdvance.button_pressed = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_ENABLED, false)
%FixedDelay.value = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_FIXED_DELAY, 1)
var per_character_delay: float = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, 0.1)
var per_word_delay: float = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_WORD_DELAY, 0)
if per_character_delay == 0 and per_word_delay == 0:
_on_additional_delay_mode_item_selected(0)
elif per_word_delay == 0:
_on_additional_delay_mode_item_selected(2, per_character_delay)
else:
_on_additional_delay_mode_item_selected(1, per_word_delay)
%IgnoredCharactersEnabled.button_pressed = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_IGNORED_CHARACTERS_ENABLED, true)
var ignored_characters: String = ''
var ignored_characters_dict: Dictionary = ProjectSettings.get_setting(_SETTING_AUTOADVANCE_IGNORED_CHARACTERS, {})
for ignored_character in ignored_characters_dict.keys():
ignored_characters += ignored_character
%IgnoredCharacters.text = ignored_characters
## AUTO-SKIP
%AutoskipTimePerEvent.value = ProjectSettings.get_setting(_SETTING_AUTOSKIP_TIME_PER_EVENT, 0.1)
## AUTO-PAUSES
%AutoPausesAbsolute.button_pressed = ProjectSettings.get_setting(_SETTING_ABSOLUTE_AUTOPAUSES, false)
load_autopauses(ProjectSettings.get_setting(_SETTING_AUTOPAUSES, {}))
func _about_to_close() -> void:
save_autopauses()
func _on_bool_set(button_pressed:bool, setting:String) -> void:
ProjectSettings.set_setting(setting, button_pressed)
ProjectSettings.save()
func _on_float_set(value:float, setting:String) -> void:
ProjectSettings.set_setting(setting, value)
ProjectSettings.save()
#region BEHAVIOUR
################################################################################
func _on_InputAction_value_changed(property_name:String, value:String) -> void:
ProjectSettings.set_setting(_SETTING_INPUT_ACTION, value)
ProjectSettings.save()
func suggest_actions(search:String) -> Dictionary:
var suggs := {}
for prop in ProjectSettings.get_property_list():
if prop.name.begins_with('input/') and not prop.name.begins_with('input/ui_') :
suggs[prop.name.trim_prefix('input/')] = {'value':prop.name.trim_prefix('input/')}
return suggs
func _on_new_event_option_item_selected(index:int) -> void:
ProjectSettings.set_setting(_SETTING_SPLIT_AT_NEW_LINES_AS, index)
ProjectSettings.save()
#endregion
#region AUTO-ADVANCE
################################################################################
func _on_additional_delay_mode_item_selected(index:int, delay:float=-1) -> void:
%AdditionalDelayMode.selected = index
match index:
0: # NONE
%AdditionalDelay.hide()
%AutoadvanceIgnoreCharacters.hide()
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_WORD_DELAY, 0)
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, 0)
1: # PER WORD
%AdditionalDelay.show()
%AutoadvanceIgnoreCharacters.hide()
if delay != -1:
%AdditionalDelay.value = delay
else:
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_WORD_DELAY, %AdditionalDelay.value)
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, 0)
2: # PER CHARACTER
%AdditionalDelay.show()
%AutoadvanceIgnoreCharacters.show()
if delay != -1:
%AdditionalDelay.value = delay
else:
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, %AdditionalDelay.value)
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_WORD_DELAY, 0)
ProjectSettings.save()
func _on_additional_delay_value_changed(value:float) -> void:
match %AdditionalDelayMode.selected:
0: # NONE
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, 0)
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_WORD_DELAY, 0)
1: # PER WORD
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_WORD_DELAY, value)
2: # PER CHARACTER
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_CHARACTER_DELAY, value)
ProjectSettings.save()
func _on_IgnoredCharacters_text_changed(text_input):
ProjectSettings.set_setting(_SETTING_AUTOADVANCE_IGNORED_CHARACTERS, DialogicUtil.str_to_hash_set(text_input))
ProjectSettings.save()
#endregion
## AUTO-PAUSES
################################################################################
func load_autopauses(dictionary:Dictionary) -> void:
for i in %AutoPauseSets.get_children():
i.queue_free()
for i in dictionary.keys():
add_autopause_set(i, dictionary[i])
func save_autopauses() -> void:
var dictionary := {}
for i in autopause_sets:
if is_instance_valid(autopause_sets[i].time):
dictionary[autopause_sets[i].text.text] = autopause_sets[i].time.value
ProjectSettings.set_setting(_SETTING_AUTOPAUSES, dictionary)
ProjectSettings.save()
func _on_add_autopauses_set_pressed() -> void:
add_autopause_set('', 0.1)
func add_autopause_set(text: String, time: float) -> void:
var info := {}
var line_edit := LineEdit.new()
line_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL
line_edit.placeholder_text = 'e.g. "?!.,;:"'
line_edit.text = text
info['text'] = line_edit
%AutoPauseSets.add_child(line_edit)
var spin_box := SpinBox.new()
spin_box.min_value = 0.1
spin_box.step = 0.01
spin_box.value = time
info['time'] = spin_box
%AutoPauseSets.add_child(spin_box)
var remove_btn := Button.new()
remove_btn.icon = get_theme_icon(&'Remove', &'EditorIcons')
remove_btn.pressed.connect(_on_remove_autopauses_set_pressed.bind(len(autopause_sets)))
info['delete'] = remove_btn
%AutoPauseSets.add_child(remove_btn)
autopause_sets[len(autopause_sets)] = info
func _on_remove_autopauses_set_pressed(index: int) -> void:
for key in autopause_sets[index]:
autopause_sets[index][key].queue_free()
autopause_sets.erase(index)