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