]> Untitled Git - wolf-seeking-sheep.git/blob - addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/glossary_popup_layer.gd
Squashed commit of the following:
[wolf-seeking-sheep.git] / addons / dialogic / Modules / DefaultLayoutParts / Layer_Glossary / glossary_popup_layer.gd
1 @tool
2 extends DialogicLayoutLayer
3
4 ## Layer that provides a popup with glossary info,
5 ## when hovering a glossary entry on a text node.
6
7
8 @export_group('Text')
9 enum Alignment {LEFT, CENTER, RIGHT}
10 @export var title_alignment: Alignment = Alignment.LEFT
11 @export var text_alignment: Alignment = Alignment.LEFT
12 @export var extra_alignment: Alignment = Alignment.RIGHT
13
14 @export_subgroup("Colors")
15 enum TextColorModes {GLOBAL, ENTRY, CUSTOM}
16 @export var title_color_mode: TextColorModes = TextColorModes.ENTRY
17 @export var title_custom_color: Color = Color.WHITE
18 @export var text_color_mode: TextColorModes = TextColorModes.ENTRY
19 @export var text_custom_color: Color = Color.WHITE
20 @export var extra_color_mode: TextColorModes = TextColorModes.ENTRY
21 @export var extra_custom_color: Color = Color.WHITE
22
23
24 @export_group("Font")
25 @export var font_use_global: bool = true
26 @export_file('*.ttf', '*.tres') var font_custom: String = ""
27
28 @export_subgroup('Sizes')
29 @export var font_title_size: int = 18
30 @export var font_text_size: int = 17
31 @export var font_extra_size: int = 15
32
33
34 @export_group("Box")
35 @export_subgroup("Color")
36 enum ModulateModes {BASE_COLOR_ONLY, ENTRY_COLOR_ON_BOX, GLOBAL_BG_COLOR}
37 @export var box_modulate_mode: ModulateModes = ModulateModes.ENTRY_COLOR_ON_BOX
38 @export var box_base_modulate: Color = Color.WHITE
39 @export_subgroup("Size")
40 @export var box_width: int = 200
41
42 const MISSING_INDEX := -1
43 func get_pointer() -> Control:
44         return $Pointer
45
46
47 func get_title() -> Label:
48         return %Title
49
50
51 func get_text() -> RichTextLabel:
52         return %Text
53
54
55 func get_extra() -> RichTextLabel:
56         return %Extra
57
58
59 func get_panel() -> PanelContainer:
60         return %Panel
61
62
63 func get_panel_point() -> PanelContainer:
64         return %PanelPoint
65
66
67 func _ready() -> void:
68         if Engine.is_editor_hint():
69                 return
70
71         get_pointer().hide()
72         var text_system: Node = DialogicUtil.autoload().get(&'Text')
73         var _error: int = 0
74         _error = text_system.connect(&'animation_textbox_hide', get_pointer().hide)
75         _error = text_system.connect(&'meta_hover_started', _on_dialogic_display_dialog_text_meta_hover_started)
76         _error = text_system.connect(&'meta_hover_ended', _on_dialogic_display_dialog_text_meta_hover_ended)
77
78
79 ## Method that shows the bubble and fills in the info
80 func _on_dialogic_display_dialog_text_meta_hover_started(meta: String) -> void:
81         var entry_info := DialogicUtil.autoload().Glossary.get_entry(meta)
82
83         if entry_info.is_empty():
84                 return
85
86         get_pointer().show()
87         get_title().text = entry_info.title
88         get_text().text = entry_info.text
89         get_text().text = ['', '[center]', '[right]'][text_alignment] + get_text().text
90         get_extra().text = entry_info.extra
91         get_extra().text = ['', '[center]', '[right]'][extra_alignment] + get_extra().text
92         get_pointer().global_position = get_pointer().get_global_mouse_position()
93
94         if title_color_mode == TextColorModes.ENTRY:
95                 get_title().add_theme_color_override(&"font_color", entry_info.color)
96         if text_color_mode == TextColorModes.ENTRY:
97                 get_text().add_theme_color_override(&"default_color", entry_info.color)
98         if extra_color_mode == TextColorModes.ENTRY:
99                 get_extra().add_theme_color_override(&"default_color", entry_info.color)
100
101         match box_modulate_mode:
102                 ModulateModes.ENTRY_COLOR_ON_BOX:
103                         get_panel().self_modulate = entry_info.color
104                         get_panel_point().self_modulate = entry_info.color
105
106
107 ## Method that keeps the bubble at mouse position when visible
108 func _process(_delta: float) -> void:
109         if Engine.is_editor_hint():
110                 return
111
112         var pointer: Control = get_pointer()
113         if pointer.visible:
114                 pointer.global_position = pointer.get_global_mouse_position()
115
116
117 ## Method that hides the bubble
118 func _on_dialogic_display_dialog_text_meta_hover_ended(_meta:String) -> void:
119         get_pointer().hide()
120
121
122
123 func _apply_export_overrides() -> void:
124         # Apply fonts
125         var font: FontFile
126         var global_font_setting: String = get_global_setting(&"font", '')
127         if font_use_global and ResourceLoader.exists(global_font_setting):
128                 font = load(global_font_setting)
129         elif ResourceLoader.exists(font_custom):
130                 font = load(font_custom)
131
132         var title: Label = get_title()
133         if font:
134                 title.add_theme_font_override(&"font", font)
135         title.horizontal_alignment = title_alignment as HorizontalAlignment
136
137         # Apply font & sizes
138         title.add_theme_font_size_override(&"font_size", font_title_size)
139         var labels: Array[RichTextLabel] = [get_text(), get_extra()]
140         var sizes: PackedInt32Array = [font_text_size, font_extra_size]
141         for i : int in len(labels):
142                 if font:
143                         labels[i].add_theme_font_override(&'normal_font', font)
144
145                 labels[i].add_theme_font_size_override(&"normal_font_size", sizes[i])
146                 labels[i].add_theme_font_size_override(&"bold_font_size", sizes[i])
147                 labels[i].add_theme_font_size_override(&"italics_font_size", sizes[i])
148                 labels[i].add_theme_font_size_override(&"bold_italics_font_size", sizes[i])
149                 labels[i].add_theme_font_size_override(&"mono_font_size", sizes[i])
150
151
152         # Apply text colors
153         # this applies Global or Custom colors, entry colors are applied on hover
154         var controls: Array[Control] = [get_title(), get_text(), get_extra()]
155         var settings: Array[StringName] = [&'font_color', &'default_color', &'default_color']
156         var color_modes: Array[TextColorModes] = [title_color_mode, text_color_mode, extra_color_mode]
157         var custom_colors: PackedColorArray = [title_custom_color, text_custom_color, extra_custom_color]
158         for i : int in len(controls):
159                 match color_modes[i]:
160                         TextColorModes.GLOBAL:
161                                 controls[i].add_theme_color_override(settings[i], get_global_setting(&'font_color', custom_colors[i]) as Color)
162                         TextColorModes.CUSTOM:
163                                 controls[i].add_theme_color_override(settings[i], custom_colors[i])
164
165         # Apply box size
166         var panel: PanelContainer = get_panel()
167         panel.size.x = box_width
168         panel.position.x = -box_width/2.0
169
170         # Apply box coloring
171         match box_modulate_mode:
172                 ModulateModes.BASE_COLOR_ONLY:
173                         panel.self_modulate = box_base_modulate
174                         get_panel_point().self_modulate = box_base_modulate
175                 ModulateModes.GLOBAL_BG_COLOR:
176                         panel.self_modulate = get_global_setting(&'bg_color', box_base_modulate)
177                         get_panel_point().self_modulate = get_global_setting(&'bg_color', box_base_modulate)