Files
Dawn-Godot/addons/madtalk/components/DialogNodeItem_message.gd
2025-08-31 17:53:17 -05:00

243 lines
7.7 KiB
GDScript

@tool
extends Control
class_name DialogNodeItem_message
signal remove_requested(requester)
signal move_up_requested(requester)
signal move_down_requested(requester)
signal drag_started(requester)
signal drag_ended(requester)
@export var data: Resource
#@onready var popup_menu = get_node("PopupMenu")
#@onready var dialog_edit = get_node("DialogEdit")
var edit_speaker_id
var edit_speaker_var
var edit_voiceclip
var edit_message_editor
var edit_preview
var edit_previewtimer
var edit_previewbg
var edit_btn_hide_on_end
#@onready var dialog_voiceclip = get_node("VoiceClipDialog")
var template_VoiceClipDialog: PackedScene = preload("res://addons/madtalk/components/popups/Messages_VoiceClipDialog.tscn")
var dialog_voiceclip: FileDialog
var template_DialogEdit: PackedScene = preload("res://addons/madtalk/components/popups/Messages_DialogEdit.tscn")
var dialog_edit: Window
var template_PopupMenu: PackedScene = preload("res://addons/madtalk/components/popups/DialogNodeItem_PopupMenu.tscn")
var popup_menu: PopupMenu
enum PopupOptions {
Edit,
MoveUp,
MoveDown,
Remove
}
@onready var box_height_margins = size.y - get_node("Panel/MessageLabel").size.y
@onready var dragdrop_line := $DragDropLine
var sequence_node = null
var message_speakervarlabel = null
var message_speakerlabel = null
var message_voicelabel = null
var message_msglabel = null
var message_hideonendlabel = null
var message_locale_list = null
func _ready():
if data:
set_data(data)
func set_data(new_data):
data = new_data
message_speakerlabel = get_node("SpeakerNameLabel")
message_speakervarlabel = get_node("SpeakerVariantLabel")
message_voicelabel = get_node("VoiceFileLabel")
message_msglabel = get_node("Panel/MessageLabel")
message_hideonendlabel = get_node("HideOnEndLabel")
message_locale_list = get_node("LocalesLabel")
update_from_data()
func update_height():
if is_inside_tree():
custom_minimum_size.y = min(
box_height_margins + message_msglabel.get_content_height(),
120
)
func update_from_data():
if data:
message_speakerlabel.text = data.message_speaker_id
message_speakervarlabel.text = data.message_speaker_variant
message_voicelabel.text = data.message_voice_clip
if data.message_voice_clip_locales.size() > 0:
message_voicelabel.text += " (" + (",".join(data.message_voice_clip_locales.keys())) + ")"
if message_voicelabel.text.length() > 40:
message_voicelabel.text = "..." + message_voicelabel.text.right(40)
message_msglabel.text = data.message_text
message_hideonendlabel.visible = (data.message_hide_on_end != 0)
if data.message_text_locales.size() == 0:
message_locale_list.text = ""
else:
message_locale_list.text = ",".join(data.message_text_locales.keys())
var variant_title = get_node("SpeakerVarLabel")
variant_title.visible = (data.message_speaker_variant != "")
var panel = get_node("Panel")
if message_voicelabel.text != "":
panel.offset_top = 40
else:
panel.offset_top = 28
update_height()
func create_dialog_edit():
if not dialog_edit:
dialog_edit = template_DialogEdit.instantiate() as Window
add_child(dialog_edit)
dialog_edit.get_node("Panel/MessageEditor").tab_changed.connect(_on_DialogEdit_MessageEdit_text_changed)
dialog_edit.get_node("Panel/MessageEditor").voice_clip_dialog_requested.connect(_on_BtnSelectClip_pressed)
dialog_edit.get_node("Panel/MessageEditor/MessageEdit").text_changed.connect(_on_DialogEdit_MessageEdit_text_changed)
dialog_edit.get_node("Panel/BtnTextColor").color_changed.connect(_on_DialogEdit_BtnTextColor_color_changed)
dialog_edit.get_node("Panel/BtnBGColor").color_changed.connect(_on_DialogEdit_BtnBGColor_color_changed)
dialog_edit.get_node("Panel/PreviewBox/PreviewTimer").timeout.connect(_on_DialogEdit_PreviewTimer_timeout)
dialog_edit.get_node("Panel/BottomBar/BtnSave").pressed.connect(_on_DialogEdit_BtnSave_pressed)
dialog_edit.get_node("Panel/BottomBar/BtnCancel").pressed.connect(_on_DialogEdit_BtnCancel_pressed)
edit_speaker_id = dialog_edit.get_node("Panel/SpeakerEdit")
edit_speaker_var = dialog_edit.get_node("Panel/VariantEdit")
#edit_voiceclip = dialog_edit.get_node("Panel/VoiceEdit")
edit_message_editor = dialog_edit.get_node("Panel/MessageEditor")
edit_preview = dialog_edit.get_node("Panel/PreviewBox/PreviewLabel")
edit_previewtimer = dialog_edit.get_node("Panel/PreviewBox/PreviewTimer")
edit_previewbg = dialog_edit.get_node("Panel/PreviewBox")
edit_btn_hide_on_end = dialog_edit.get_node("Panel/BtnHideOnEnd")
func dispose_dialog_edit():
if dialog_edit:
dialog_edit.queue_free()
dialog_edit = null
func create_voice_clip_dialog():
if not dialog_voiceclip:
dialog_voiceclip = template_VoiceClipDialog.instantiate()
add_child(dialog_voiceclip)
dialog_voiceclip.file_selected.connect(_on_FileDialog_voiceclip_selected)
func dispose_voice_clip_dialog():
if dialog_voiceclip:
dialog_voiceclip.queue_free()
dialog_voiceclip = null
func create_popup_menu():
if not popup_menu:
popup_menu = template_PopupMenu.instantiate() as PopupMenu
add_child(popup_menu)
popup_menu.id_pressed.connect(_on_PopupMenu_id_pressed)
func dispose_popup_menu():
if popup_menu:
popup_menu.queue_free()
popup_menu = null
func _on_DialogNodeItem_gui_input(event):
if (event is InputEventMouseButton):
if (event.pressed):
if (event.button_index == MOUSE_BUTTON_LEFT):
if event.double_click:
_on_PopupMenu_id_pressed(PopupOptions.Edit)
else:
drag_started.emit(self)
if (event.button_index == MOUSE_BUTTON_RIGHT):
var cursor_position = get_viewport().get_mouse_position() if get_viewport().gui_embed_subwindows else DisplayServer.mouse_get_position()
create_popup_menu()
popup_menu.popup(Rect2(cursor_position,Vector2(10,10)))
else:
if (event.button_index == MOUSE_BUTTON_LEFT):
drag_ended.emit(self)
func _on_PopupMenu_id_pressed(id):
dispose_popup_menu() # Handles null gracefully
match id:
PopupOptions.Edit:
create_dialog_edit()
edit_speaker_id.text = data.message_speaker_id
edit_speaker_var.text = data.message_speaker_variant
edit_message_editor.setup(data.message_text, data.message_text_locales, data.message_voice_clip, data.message_voice_clip_locales)
edit_btn_hide_on_end.button_pressed = (data.message_hide_on_end != 0)
_on_DialogEdit_PreviewTimer_timeout()
dialog_edit.popup_centered()
PopupOptions.MoveUp:
emit_signal("move_up_requested", self)
PopupOptions.MoveDown:
emit_signal("move_down_requested", self)
PopupOptions.Remove:
emit_signal("remove_requested", self)
func _on_DialogEdit_BtnCancel_pressed():
dispose_dialog_edit()
func _on_DialogEdit_BtnSave_pressed():
data.message_speaker_id = edit_speaker_id.text
data.message_speaker_variant = edit_speaker_var.text
edit_message_editor.finalize_editor()
data.message_text = edit_message_editor.get_default_locale_message()
data.message_text_locales = edit_message_editor.get_locale_messages_without_default()
data.message_voice_clip = edit_message_editor.get_default_locale_voiceclip()
data.message_voice_clip_locales = edit_message_editor.get_locale_voiceclips_without_default()
data.message_hide_on_end = 1 if edit_btn_hide_on_end.button_pressed else 0
update_from_data()
dispose_dialog_edit()
func _on_DialogEdit_PreviewTimer_timeout():
edit_preview.text = edit_message_editor.message_edit.text
func _on_DialogEdit_MessageEdit_text_changed():
edit_previewtimer.start(1.0)
func _on_DialogEdit_BtnTextColor_color_changed(color):
edit_preview.set("theme_override_colors/default_color", color)
func _on_DialogEdit_BtnBGColor_color_changed(color):
edit_previewbg.color = color
func _on_BtnSelectClip_pressed():
create_voice_clip_dialog()
dialog_voiceclip.popup_centered()
func _on_FileDialog_voiceclip_selected(path):
edit_message_editor.set_voice_clip(path)
dispose_voice_clip_dialog()