312 lines
11 KiB
GDScript3
312 lines
11 KiB
GDScript3
|
tool
|
||
|
extends Control
|
||
|
|
||
|
|
||
|
export(PackedScene) var HistoryRow = load("res://addons/dialogic/Example Assets/History/HistoryRow.tscn")
|
||
|
export(PackedScene) var HistoryDefaultBackground = load("res://addons/dialogic/Example Assets/History/HistoryBackground.tscn")
|
||
|
export(PackedScene) var HistoryOpenButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn")
|
||
|
export(PackedScene) var HistoryCloseButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn")
|
||
|
export(int) var Vertical_Separation = 16
|
||
|
|
||
|
onready var HistoryTimeline = $HistoryPopup/ScrollHistoryContainer/MarginContainer/HistoryTimeline
|
||
|
onready var scrollbar = $HistoryPopup/ScrollHistoryContainer.get_v_scrollbar()
|
||
|
onready var ScrollHistoryContainer = $HistoryPopup/ScrollHistoryContainer
|
||
|
onready var HistoryPopup = $HistoryPopup
|
||
|
onready var HistoryAudio = $HistoryPopup/HistoryAudio
|
||
|
|
||
|
var HistoryButton
|
||
|
var CloseButton
|
||
|
var HistoryBackground
|
||
|
|
||
|
var is_history_open = false
|
||
|
var is_mouse_on_button = false
|
||
|
var block_dialog_advance = false setget , history_advance_block
|
||
|
|
||
|
var lastQuestionNode = null
|
||
|
var curTheme = null
|
||
|
var prevState
|
||
|
|
||
|
var eventsToLog = ['dialogic_001', 'dialogic_010']
|
||
|
var logArrivals = false
|
||
|
var logExits = false
|
||
|
|
||
|
var scrollToBottom = true
|
||
|
var reverseTimeline = false
|
||
|
var characterNameColorOn = true
|
||
|
var lineBreakAfterName = true
|
||
|
|
||
|
var scrollToggle = false
|
||
|
|
||
|
func _ready():
|
||
|
var testHistoryRow = HistoryRow.instance()
|
||
|
assert(testHistoryRow.has_method('add_history'), 'HistoryRow Scene must implement add_history(string, string) method.')
|
||
|
testHistoryRow.queue_free()
|
||
|
|
||
|
HistoryBackground = HistoryDefaultBackground.instance()
|
||
|
HistoryPopup.add_child(HistoryBackground)
|
||
|
HistoryPopup.move_child(HistoryBackground, 0)
|
||
|
|
||
|
#Scrollbar only updates when visible, so need it to be handled
|
||
|
scrollbar.connect("changed",self,"handle_scrollbar_changed")
|
||
|
|
||
|
func handle_scrollbar_changed():
|
||
|
#It's firing every frame, we only want to check it once on opening
|
||
|
if(scrollToggle):
|
||
|
scrollToggle = false
|
||
|
if (scrollToBottom):
|
||
|
ScrollHistoryContainer.scroll_vertical = scrollbar.max_value
|
||
|
else:
|
||
|
ScrollHistoryContainer.scroll_vertical = 0
|
||
|
|
||
|
|
||
|
func initalize_history():
|
||
|
if get_parent().settings.get_value('history', 'enable_open_button', true):
|
||
|
HistoryButton = HistoryOpenButton.instance()
|
||
|
add_child(HistoryButton)
|
||
|
HistoryButton.connect("pressed", self, '_on_toggle_history')
|
||
|
HistoryButton.connect("mouse_entered", self, '_on_HistoryButton_mouse_entered')
|
||
|
HistoryButton.connect("mouse_exited", self, '_on_HistoryButton_mouse_exited')
|
||
|
HistoryButton.disabled = false
|
||
|
HistoryButton.show()
|
||
|
|
||
|
if get_parent().settings.get_value('history', 'enable_close_button', true):
|
||
|
CloseButton = HistoryCloseButton.instance()
|
||
|
add_child(CloseButton)
|
||
|
CloseButton.connect("pressed", self, '_on_toggle_history')
|
||
|
CloseButton.disabled = true
|
||
|
CloseButton.hide()
|
||
|
|
||
|
# See if we're logging arrivals and exits
|
||
|
logArrivals = get_parent().settings.get_value('history', 'log_arrivals', true)
|
||
|
logExits = get_parent().settings.get_value('history', 'log_exits', true)
|
||
|
if logExits or logArrivals:
|
||
|
eventsToLog.push_back('dialogic_002')
|
||
|
|
||
|
# Set the other selectable settings options
|
||
|
scrollToBottom = get_parent().settings.get_value('history', 'history_scroll_to_bottom', true)
|
||
|
reverseTimeline = get_parent().settings.get_value('history', 'history_reverse_timeline', false)
|
||
|
characterNameColorOn = get_parent().settings.get_value('history', 'history_name_color_on', true)
|
||
|
lineBreakAfterName = get_parent().settings.get_value('history', 'history_break_after_name', false)
|
||
|
|
||
|
|
||
|
# Grab some settings and make the boxes up right
|
||
|
var button_anchor = int(get_parent().settings.get_value('history', 'history_button_position', 2))
|
||
|
var screen_margin_x = get_parent().settings.get_value('history', 'history_screen_margin_x', 0)
|
||
|
var screen_margin_y = get_parent().settings.get_value('history', 'history_screen_margin_y', 0)
|
||
|
var container_margin_X = get_parent().settings.get_value('history', 'history_container_margin_x', 0)
|
||
|
var container_margin_y = get_parent().settings.get_value('history', 'history_container_margin_y', 0)
|
||
|
|
||
|
HistoryPopup.margin_left = screen_margin_x
|
||
|
HistoryPopup.margin_right = -screen_margin_x
|
||
|
HistoryPopup.margin_top = screen_margin_y
|
||
|
HistoryPopup.margin_bottom = -screen_margin_y
|
||
|
|
||
|
ScrollHistoryContainer.margin_left = container_margin_X
|
||
|
ScrollHistoryContainer.margin_right = -container_margin_X
|
||
|
ScrollHistoryContainer.margin_top = container_margin_y
|
||
|
ScrollHistoryContainer.margin_bottom = -container_margin_y
|
||
|
|
||
|
for button in [HistoryButton, CloseButton]:
|
||
|
if button == null:
|
||
|
continue
|
||
|
|
||
|
var reference = button.get_parent().rect_size
|
||
|
|
||
|
# Adding audio when focused or hovered
|
||
|
button.connect('focus_entered', get_parent(), '_on_option_hovered', [button])
|
||
|
button.connect('mouse_entered', get_parent(), '_on_option_focused')
|
||
|
|
||
|
# Button positioning
|
||
|
var anchor_values = [0,0,1,1]
|
||
|
var position_offset = Vector2(0,0)
|
||
|
|
||
|
# Top Left
|
||
|
if button_anchor == 0:
|
||
|
anchor_values = [0, 0, 0, 0]
|
||
|
position_offset.x = 0
|
||
|
position_offset.y = 0
|
||
|
# Top Center
|
||
|
elif button_anchor == 1:
|
||
|
anchor_values = [.5, 0, .5, 0]
|
||
|
position_offset.x = reference.x/2 - button.rect_size.x
|
||
|
position_offset.y = 0
|
||
|
# Top Right
|
||
|
elif button_anchor == 2:
|
||
|
anchor_values = [1, 0, 1, 0]
|
||
|
position_offset.x = reference.x - button.rect_size.x
|
||
|
position_offset.y = 0
|
||
|
# 3 - Number skip because of the separator
|
||
|
# Center Left
|
||
|
elif button_anchor == 4:
|
||
|
anchor_values = [0, .5, 0, .5]
|
||
|
position_offset.x = 0
|
||
|
position_offset.y = reference.y/2 - button.rect_size.y
|
||
|
# True Center
|
||
|
elif button_anchor == 5:
|
||
|
anchor_values = [.5, .5, .5, .5]
|
||
|
position_offset.x = reference.x/2 - button.rect_size.x
|
||
|
position_offset.y = reference.y/2 - button.rect_size.y
|
||
|
# Center Right
|
||
|
elif button_anchor == 6:
|
||
|
anchor_values = [1, .5, 1, .5]
|
||
|
position_offset.x = reference.x - button.rect_size.x
|
||
|
position_offset.y = reference.y/2 - button.rect_size.y
|
||
|
# Number skip because of the separator
|
||
|
elif button_anchor == 8:
|
||
|
anchor_values = [0, 1, 0, 1]
|
||
|
position_offset.x = 0
|
||
|
position_offset.y = reference.y - button.rect_size.y
|
||
|
elif button_anchor == 9:
|
||
|
anchor_values = [.5, 1, .5, 1]
|
||
|
position_offset.x = reference.x/2 - button.rect_size.x
|
||
|
position_offset.y = reference.y - button.rect_size.y
|
||
|
elif button_anchor == 10:
|
||
|
anchor_values = [1, 1, 1, 1]
|
||
|
position_offset.x = reference.x - button.rect_size.x
|
||
|
position_offset.y = reference.y - button.rect_size.y
|
||
|
|
||
|
button.anchor_left = anchor_values[0]
|
||
|
button.anchor_top = anchor_values[1]
|
||
|
button.anchor_right = anchor_values[2]
|
||
|
button.anchor_bottom = anchor_values[3]
|
||
|
|
||
|
button.rect_global_position = button.get_parent().rect_global_position + position_offset
|
||
|
|
||
|
|
||
|
# Add history based on the passed event, using some logic to get it right
|
||
|
func add_history_row_event(eventData):
|
||
|
# Abort if we aren't logging the event, or if its a character event of type update
|
||
|
if !eventsToLog.has(eventData.event_id) or (eventData.event_id == 'dialogic_002' and eventData.get('type') == 2 ):
|
||
|
return
|
||
|
# Abort if we aren't logging arrivals and its a character event of type arrival
|
||
|
if eventData.event_id == 'dialogic_002' and eventData.get('type') == 0 and !logArrivals:
|
||
|
return
|
||
|
# Abort if we aren't logging exits and its a character event of type exit
|
||
|
if eventData.event_id == 'dialogic_002' and eventData.get('type') == 1 and !logExits:
|
||
|
return
|
||
|
|
||
|
var newHistoryRow = HistoryRow.instance()
|
||
|
HistoryTimeline.add_child(newHistoryRow)
|
||
|
if(reverseTimeline):
|
||
|
HistoryTimeline.move_child(newHistoryRow,0)
|
||
|
if newHistoryRow.has_method('load_theme') and get_parent().settings.get_value('history', 'enable_dynamic_theme', false) == true:
|
||
|
newHistoryRow.load_theme(curTheme)
|
||
|
|
||
|
var characterPrefix = ''
|
||
|
if eventData.has('character') and eventData.character != '':
|
||
|
var characterData = DialogicUtil.get_character(eventData.character)
|
||
|
var characterName = characterData.get('name', '')
|
||
|
if eventData.has('character') and eventData.character == '[All]':
|
||
|
characterPrefix = str('Everyone')
|
||
|
elif characterData.data.get('display_name_bool', false) == true:
|
||
|
characterName = characterData.data.get('display_name', '')
|
||
|
|
||
|
if characterName != '':
|
||
|
var charDelimiter = get_parent().settings.get_value('history', 'history_character_delimiter', '')
|
||
|
var parsed_name = DialogicParser.parse_definitions(get_parent(), characterName, true, false)
|
||
|
var characterColor = characterData.data.get('color', Color.white)
|
||
|
if (!characterNameColorOn):
|
||
|
characterColor = Color.white
|
||
|
var lineBreak = ''
|
||
|
if (lineBreakAfterName):
|
||
|
lineBreak = '\n'
|
||
|
characterPrefix = str("[color=",characterColor,"]", parsed_name, "[/color]", charDelimiter, ' ', lineBreak)
|
||
|
|
||
|
var audioData = ''
|
||
|
if eventData.has('voice_data'):
|
||
|
if eventData['voice_data'].has('0'):
|
||
|
audioData = eventData['voice_data']['0'].file
|
||
|
newHistoryRow.AudioButton.connect('pressed', self, '_on_audio_trigger', [audioData])
|
||
|
|
||
|
|
||
|
# event logging handled here
|
||
|
# Text Events
|
||
|
if eventData.event_id == 'dialogic_001':
|
||
|
newHistoryRow.add_history(str(characterPrefix, eventData.text), audioData)
|
||
|
# Character Arrivals
|
||
|
elif eventData.event_id == 'dialogic_002':
|
||
|
var logText = get_parent().settings.get_value('history', 'text_arrivals', 'has arrived')
|
||
|
if eventData.get('type') == 1:
|
||
|
logText = get_parent().settings.get_value('history', 'text_exits', 'has left')
|
||
|
newHistoryRow.add_history(str(characterPrefix, ' ', logText), audioData)
|
||
|
# List Choices
|
||
|
elif eventData.event_id == 'dialogic_010':
|
||
|
newHistoryRow.add_history(str(characterPrefix, eventData.question), audioData)
|
||
|
if eventData.has('options') and get_parent().settings.get_value('history', 'log_choices', true):
|
||
|
var choiceString = "\n\t"
|
||
|
for choice in eventData['options']:
|
||
|
choiceString = str(choiceString, '[', choice.label, ']\t')
|
||
|
newHistoryRow.add_history(choiceString, audioData)
|
||
|
lastQuestionNode = newHistoryRow
|
||
|
|
||
|
|
||
|
func add_answer_to_question(stringData):
|
||
|
if lastQuestionNode != null:
|
||
|
lastQuestionNode.add_history(str('\n\t', stringData), lastQuestionNode.audioPath)
|
||
|
lastQuestionNode = null
|
||
|
|
||
|
|
||
|
func change_theme(newTheme: ConfigFile):
|
||
|
if get_parent().settings.get_value('history', 'enable_dynamic_theme', false):
|
||
|
curTheme = newTheme
|
||
|
|
||
|
|
||
|
func load_theme(theme: ConfigFile):
|
||
|
curTheme = theme
|
||
|
|
||
|
|
||
|
func _on_audio_trigger(audioFilepath):
|
||
|
HistoryAudio.stream = load(audioFilepath)
|
||
|
HistoryAudio.play()
|
||
|
|
||
|
|
||
|
func _on_HistoryPopup_popup_hide():
|
||
|
HistoryAudio.stop()
|
||
|
|
||
|
|
||
|
func _on_HistoryPopup_about_to_show():
|
||
|
if HistoryButton != null:
|
||
|
scrollToggle = true
|
||
|
HistoryButton.show()
|
||
|
|
||
|
|
||
|
|
||
|
func _on_HistoryButton_mouse_entered():
|
||
|
is_mouse_on_button = true
|
||
|
|
||
|
|
||
|
func _on_HistoryButton_mouse_exited():
|
||
|
is_mouse_on_button = false
|
||
|
|
||
|
|
||
|
func history_advance_block() -> bool:
|
||
|
return is_mouse_on_button or is_history_open
|
||
|
|
||
|
# Used to manually toggle the history visibility on or off
|
||
|
# This is most useful when you wish to make your own custom controls
|
||
|
func _on_toggle_history():
|
||
|
if HistoryPopup.visible == false:
|
||
|
_on_HistoryPopup_about_to_show()
|
||
|
HistoryPopup.show()
|
||
|
if HistoryButton != null:
|
||
|
HistoryButton.hide()
|
||
|
HistoryButton.disabled = true
|
||
|
if CloseButton != null:
|
||
|
CloseButton.disabled = false
|
||
|
CloseButton.show()
|
||
|
is_history_open = true
|
||
|
is_mouse_on_button = false
|
||
|
else:
|
||
|
_on_HistoryPopup_popup_hide()
|
||
|
HistoryPopup.hide()
|
||
|
if HistoryButton != null:
|
||
|
HistoryButton.show()
|
||
|
HistoryButton.disabled = false
|
||
|
if CloseButton != null:
|
||
|
CloseButton.disabled = true
|
||
|
CloseButton.hide()
|
||
|
is_history_open = false
|
||
|
is_mouse_on_button = false
|
||
|
|
||
|
|