2 extends DialogicLayoutLayer
4 ## This layout won't do anything on its own
7 @export_subgroup("Text")
8 @export var text_size: int = 15
9 @export var text_color: Color = Color.BLACK
10 @export_file('*.ttf') var normal_font: String = ""
11 @export_file('*.ttf') var bold_font: String = ""
12 @export_file('*.ttf') var italic_font: String = ""
13 @export_file('*.ttf') var bold_italic_font: String = ""
14 @export var text_max_width: int = 300
16 @export_subgroup('Box')
17 @export var box_modulate: Color = Color.WHITE
18 @export var box_modulate_by_character_color: bool = false
19 @export var box_padding: Vector2 = Vector2(10,10)
20 @export_range(1, 999) var box_corner_radius: int = 25
21 @export_range(0.1, 5) var box_wobble_speed: float = 1
22 @export_range(0, 1) var box_wobble_amount: float = 0.5
23 @export_range(0, 1) var box_wobble_detail: float = 0.2
25 @export_subgroup('Behaviour')
26 @export var behaviour_distance: int = 50
27 @export var behaviour_direction: Vector2 = Vector2(1, -1)
29 @export_group('Name Label')
30 @export_subgroup("Name Label")
31 @export var name_label_enabled: bool = true
32 @export var name_label_font_size: int = 15
33 @export_file('*.ttf') var name_label_font: String = ""
34 @export var name_label_use_character_color: bool = true
35 @export var name_label_color: Color = Color.BLACK
36 @export_subgroup("Name Label Box")
37 @export var name_label_box_modulate: Color = Color.WHITE
38 @export var name_label_box_modulate_use_character_color: bool = false
39 @export var name_label_padding: Vector2 = Vector2(5,0)
40 @export var name_label_offset: Vector2 = Vector2(0,0)
41 @export var name_label_alignment := HBoxContainer.ALIGNMENT_BEGIN
44 @export_group('Choices')
45 @export_subgroup('Choices Text')
46 @export var choices_text_size: int = 15
47 @export_file('*.ttf') var choices_text_font: String = ""
48 @export var choices_text_color: Color = Color.DARK_SLATE_GRAY
49 @export var choices_text_color_hover: Color = Color.DARK_MAGENTA
50 @export var choices_text_color_focus: Color = Color.DARK_MAGENTA
51 @export var choices_text_color_disabled: Color = Color.DARK_GRAY
53 @export_subgroup('Choices Layout')
54 @export var choices_layout_alignment := FlowContainer.ALIGNMENT_END
55 @export var choices_layout_force_lines: bool = false
56 @export_file('*.tres', "*.res") var choices_base_theme: String = ""
58 const TextBubble := preload("res://addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gd")
60 var bubbles: Array[TextBubble] = []
61 var fallback_bubble: TextBubble = null
63 const textbubble_scene: PackedScene = preload("res://addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.tscn")
66 func add_bubble() -> TextBubble:
67 var new_bubble: TextBubble = textbubble_scene.instantiate()
69 bubbles.append(new_bubble)
73 ## Called by dialogic whenever export overrides might change
74 func _apply_export_overrides() -> void:
79 ## Called by the base layer before opening the bubble
80 func bubble_apply_overrides(bubble:TextBubble) -> void:
81 ## TEXT FONT AND COLOR
82 var rtl: RichTextLabel = bubble.text
83 rtl.add_theme_font_size_override(&'normal_font', text_size)
84 rtl.add_theme_font_size_override(&"normal_font_size", text_size)
85 rtl.add_theme_font_size_override(&"bold_font_size", text_size)
86 rtl.add_theme_font_size_override(&"italics_font_size", text_size)
87 rtl.add_theme_font_size_override(&"bold_italics_font_size", text_size)
89 rtl.add_theme_color_override(&"default_color", text_color)
91 if !normal_font.is_empty():
92 rtl.add_theme_font_override(&"normal_font", load(normal_font) as Font)
93 if !bold_font.is_empty():
94 rtl.add_theme_font_override(&"bold_font", load(bold_font) as Font)
95 if !italic_font.is_empty():
96 rtl.add_theme_font_override(&"italitc_font", load(italic_font) as Font)
97 if !bold_italic_font.is_empty():
98 rtl.add_theme_font_override(&"bold_italics_font", load(bold_italic_font) as Font)
99 bubble.set(&'max_width', text_max_width)
103 var tail_and_bg_group := (bubble.get_node("Group") as CanvasGroup)
104 tail_and_bg_group.self_modulate = box_modulate
105 if box_modulate_by_character_color and bubble.current_character != null:
106 tail_and_bg_group.self_modulate = bubble.current_character.color
108 var background := (bubble.get_node('%Background') as ColorRect)
109 var bg_material: ShaderMaterial = (background.material as ShaderMaterial)
110 bg_material.set_shader_parameter(&'radius', box_corner_radius)
111 bg_material.set_shader_parameter(&'wobble_amount', box_wobble_amount)
112 bg_material.set_shader_parameter(&'wobble_speed', box_wobble_speed)
113 bg_material.set_shader_parameter(&'wobble_detail', box_wobble_detail)
115 bubble.padding = box_padding
119 bubble.safe_zone = behaviour_distance
120 bubble.base_direction = behaviour_direction
123 ## NAME LABEL SETTINGS
124 var nl: DialogicNode_NameLabel = bubble.name_label
125 nl.add_theme_font_size_override(&"font_size", name_label_font_size)
127 if !name_label_font.is_empty():
128 nl.add_theme_font_override(&'font', load(name_label_font) as Font)
131 if name_label_use_character_color and bubble.current_character:
132 nl.add_theme_color_override(&"font_color", bubble.current_character.color)
134 nl.add_theme_color_override(&"font_color", name_label_color)
136 var nlp: PanelContainer = bubble.name_label_box
137 nlp.self_modulate = name_label_box_modulate
138 if name_label_box_modulate_use_character_color and bubble.current_character:
139 nlp.self_modulate = bubble.current_character.color
140 nlp.get_theme_stylebox(&'panel').content_margin_left = name_label_padding.x
141 nlp.get_theme_stylebox(&'panel').content_margin_right = name_label_padding.x
142 nlp.get_theme_stylebox(&'panel').content_margin_top = name_label_padding.y
143 nlp.get_theme_stylebox(&'panel').content_margin_bottom = name_label_padding.y
144 bubble.name_label_offset = name_label_offset
145 bubble.name_label_alignment = name_label_alignment
147 nlp.get_parent().visible = name_label_enabled
150 if choices_layout_force_lines:
151 bubble.add_choice_container(VBoxContainer.new(), choices_layout_alignment)
153 bubble.add_choice_container(HFlowContainer.new(), choices_layout_alignment)
155 var choice_theme: Theme = null
156 if choices_base_theme.is_empty() or not ResourceLoader.exists(choices_base_theme):
157 choice_theme = Theme.new()
158 var base_style := StyleBoxFlat.new()
159 base_style.draw_center = false
160 base_style.border_width_bottom = 2
161 base_style.border_color = choices_text_color
162 choice_theme.set_stylebox(&'normal', &'Button', base_style)
163 var focus_style := (base_style.duplicate() as StyleBoxFlat)
164 focus_style.border_color = choices_text_color_focus
165 choice_theme.set_stylebox(&'focus', &'Button', focus_style)
166 var hover_style := (base_style.duplicate() as StyleBoxFlat)
167 hover_style.border_color = choices_text_color_hover
168 choice_theme.set_stylebox(&'hover', &'Button', hover_style)
169 var disabled_style := (base_style.duplicate() as StyleBoxFlat)
170 disabled_style.border_color = choices_text_color_disabled
171 choice_theme.set_stylebox(&'disabled', &'Button', disabled_style)
172 choice_theme.set_stylebox(&'pressed', &'Button', base_style)
174 choice_theme = (load(choices_base_theme) as Theme)
176 if !choices_text_font.is_empty():
177 choice_theme.default_font = (load(choices_text_font) as Font)
179 choice_theme.set_font_size(&'font_size', &'Button', choices_text_size)
180 choice_theme.set_color(&'font_color', &'Button', choices_text_color)
181 choice_theme.set_color(&'font_pressed_color', &'Button', choices_text_color)
182 choice_theme.set_color(&'font_hover_color', &'Button', choices_text_color_hover)
183 choice_theme.set_color(&'font_focus_color', &'Button', choices_text_color_focus)
184 choice_theme.set_color(&'font_disabled_color', &'Button', choices_text_color_disabled)
185 bubble.choice_container.theme = choice_theme