-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathnav_bar.gd
194 lines (149 loc) · 6.15 KB
/
nav_bar.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
tool
class_name NavBar, \
"res://addons/scaffolder/assets/images/editor_icons/nav_bar.png"
extends PanelContainer
const HEIGHT := 160.0
const SINGLE_ROW_WITH_LOGO_MIN_WIDTH_WIGGLE_ROOM := 32.0
const SINGLE_ROW_WITH_TEXT_MIN_WIDTH_WIGGLE_ROOM := 96.0
export var text := "" setget _set_text
export(String, "Xs", "S", "M", "L", "Xl") var font_size := "Xl" \
setget _set_font_size
export var shows_back := true setget _set_shows_back
export var shows_about := false setget _set_shows_about
export var shows_settings := false setget _set_shows_settings
export var shows_logo := false setget _set_shows_logo
var is_using_two_rows := false
var _is_ready := false
func _ready() -> void:
_is_ready = true
set_meta("sc_rect_min_size", Vector2(0.0, HEIGHT))
$MarginContainer/VBoxContainer/ButtonRow/RightContainer \
.set_meta("sc_rect_min_size", Vector2(HEIGHT, HEIGHT))
$MarginContainer/VBoxContainer/ButtonRow/LeftContainer \
.set_meta("sc_rect_min_size", Vector2(HEIGHT, HEIGHT))
$MarginContainer.set(
"custom_constants/margin_top",
Sc.device.get_safe_area_margin_top())
$MarginContainer.set(
"custom_constants/margin_left",
Sc.device.get_safe_area_margin_left())
$MarginContainer.set(
"custom_constants/margin_right",
Sc.device.get_safe_area_margin_right())
$MarginContainer/TopRow/Header \
.add_color_override("font_color", Sc.palette.get_color("header"))
$MarginContainer/VBoxContainer/BottomRow/Header \
.add_color_override("font_color", Sc.palette.get_color("header"))
$MarginContainer/TopRow/Logo \
.texture_scale = Vector2(
Sc.images.app_logo_scale,
Sc.images.app_logo_scale)
$MarginContainer/VBoxContainer/BottomRow/Logo \
.texture_scale = Vector2(
Sc.images.app_logo_scale,
Sc.images.app_logo_scale)
$MarginContainer/VBoxContainer/ButtonRow/RightContainer/BackButton \
.texture_scale = Vector2(8.0, 8.0)
$MarginContainer/VBoxContainer/ButtonRow/RightContainer/AboutButton \
.texture_scale = Vector2(4.0, 4.0)
$MarginContainer/VBoxContainer/ButtonRow/LeftContainer/SettingsButton \
.texture_scale = Vector2(4.0, 4.0)
_on_gui_scale_changed()
func _on_gui_scale_changed() -> bool:
_update_visiblity()
for child in get_children():
Sc.gui.scale_gui_recursively(child)
return true
func _update_visiblity() -> void:
if !_is_ready:
return
assert(text == "" or \
!shows_logo)
$MarginContainer/TopRow/Header \
.text = text
$MarginContainer/VBoxContainer/BottomRow/Header \
.text = text
$MarginContainer/TopRow/Header \
.font_size = font_size
$MarginContainer/VBoxContainer/BottomRow/Header \
.font_size = font_size
call_deferred("_update_visibility_after_setting_text")
func _update_visibility_after_setting_text() -> void:
var min_width_for_single_row: float
if shows_logo:
min_width_for_single_row = \
(Sc.images.app_logo.get_size().x * \
Sc.images.app_logo_scale + \
HEIGHT * 2) * Sc.gui.scale - \
SINGLE_ROW_WITH_LOGO_MIN_WIDTH_WIGGLE_ROOM * Sc.gui.scale
else:
min_width_for_single_row = \
$MarginContainer/TopRow/Header.rect_size.x + \
HEIGHT * 2 * Sc.gui.scale if \
shows_back or shows_about or shows_settings else \
-INF
min_width_for_single_row -= \
SINGLE_ROW_WITH_TEXT_MIN_WIDTH_WIGGLE_ROOM * Sc.gui.scale
is_using_two_rows = \
Sc.device.get_viewport_size().x < min_width_for_single_row
$MarginContainer/VBoxContainer/ButtonRow/RightContainer/BackButton \
.visible = shows_back
$MarginContainer/VBoxContainer/ButtonRow/RightContainer/AboutButton \
.visible = shows_about
$MarginContainer/VBoxContainer/ButtonRow/LeftContainer/SettingsButton \
.visible = shows_settings
$MarginContainer/TopRow \
.visible = !is_using_two_rows
$MarginContainer/VBoxContainer/BottomRow \
.visible = is_using_two_rows
$MarginContainer/VBoxContainer/Spacer \
.visible = is_using_two_rows
$MarginContainer/TopRow/Header \
.visible = !shows_logo
$MarginContainer/VBoxContainer/BottomRow/Header \
.visible = !shows_logo
$MarginContainer/TopRow/Logo \
.visible = shows_logo
$MarginContainer/VBoxContainer/BottomRow/Logo \
.visible = shows_logo
func _set_text(value: String) -> void:
text = value
_update_visiblity()
func _set_font_size(value: String) -> void:
font_size = value
_update_visiblity()
func _set_shows_back(value: bool) -> void:
shows_back = value
_update_visiblity()
func _set_shows_about(value: bool) -> void:
shows_about = value
_update_visiblity()
func _set_shows_settings(value: bool) -> void:
shows_settings = value
_update_visiblity()
func _set_shows_logo(value: bool) -> void:
shows_logo = value
_update_visiblity()
func _on_BackButton_pressed() -> void:
Sc.nav.close_current_screen()
func _on_AboutButton_pressed() -> void:
Sc.nav.open("about")
func _on_SettingsButton_pressed() -> void:
if Sc.level != null and \
Sc.metadata.must_restart_level_to_change_settings:
var description := (
"The level must be restarted in order to change settings." +
"\n\nAre you sure you want to restart the level?")
Sc.nav.open(
"notification",
ScreenTransition.DEFAULT,
{
header_text = "Reset level?",
is_back_button_shown = true,
body_text = description,
close_button_text = "Yes",
body_alignment = BoxContainer.ALIGN_BEGIN,
next_screen = "settings",
})
else:
Sc.nav.open("settings")