RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
pause_overlay_controller.gd
Go to the documentation of this file.
1extends RefCounted
2
3
6
7var layout_manager = preload("res://scripts/systems/layoutManager/layout_manager.gd").new()
8var ui_flow_manager = preload("res://scripts/systems/uiFlowManager/ui_flow_manager.gd").new()
9const SettingsManagerScript = preload("res://scripts/systems/settingsManager/settings_manager.gd")
10var popup:PopupPanel
11var owner:Node
12var submenu_popups := []
13var suppress_submenu_return := false
14var last_pause_size := Vector2i(360, 520)
15var settings_manager_fallback
16
17
18
19func bind(owner_node:Node, actions:Dictionary) -> PopupPanel:
20 owner = owner_node
21 layout_manager.load_theme_file("res://data/themes/default.json")
22 popup = layout_manager.create_pause_overlay(actions)
23 owner.add_child(popup)
24 var settings_manager = _settings_manager()
25 if not settings_manager.settings_changed.is_connected(_on_settings_changed):
26 settings_manager.settings_changed.connect(_on_settings_changed)
27 _apply_current_theme()
28 return popup
29
30
31
32func show(size:Vector2i = Vector2i(360, 520)) -> void:
33 if not _popup_valid():
34 return
35 last_pause_size = size
36 _apply_current_theme()
37 if _owner_valid() and owner is Control and owner.is_inside_tree():
38 layout_manager.popup_centered_standard(popup, owner.get_viewport_rect().size, {"size": size, "minimum": Vector2i(280, 180)})
39 else:
40 popup.size = size
41 if popup.is_inside_tree():
42 popup.popup_centered(size)
43 call_deferred("_focus_first_button")
44
45
46
47func hide() -> void:
48 if _popup_valid():
49 popup.hide()
50
51
52
53func show_submenu_popup(submenu:PopupPanel, size:Vector2i = Vector2i.ZERO) -> void:
54 if submenu == null or not is_instance_valid(submenu):
55 return
56 hide()
57 if not submenu_popups.has(submenu):
58 submenu_popups.append(submenu)
59 if not submenu.popup_hide.is_connected(_on_submenu_hidden):
60 submenu.popup_hide.connect(_on_submenu_hidden)
61 var popup_size = size
62 if popup_size == Vector2i.ZERO:
63 popup_size = _default_submenu_size()
64 if _owner_valid() and owner is Control and owner.is_inside_tree():
65 _apply_current_theme_to(submenu)
66 layout_manager.popup_centered_standard(submenu, owner.get_viewport_rect().size, {"size": popup_size, "minimum": Vector2i(280, 180)})
67 else:
68 submenu.size = popup_size
69 if submenu.is_inside_tree():
70 submenu.popup_centered(popup_size)
71 call_deferred("_focus_submenu", submenu)
72
73
74
75func hide_submenu_popup(submenu:PopupPanel) -> void:
76 if submenu == null or not is_instance_valid(submenu):
77 return
78 suppress_submenu_return = true
79 submenu.hide()
80 suppress_submenu_return = false
81
82
83
84func return_from_submenu() -> void:
85 if suppress_submenu_return:
86 return
87 if not _owner_valid() or not _popup_valid():
88 return
89 call_deferred("show", last_pause_size)
90
91
92func _focus_first_button() -> void:
93 if not _popup_valid():
94 return
95 ui_flow_manager.focus_first(popup)
96
97
98func _focus_submenu(submenu:PopupPanel) -> void:
99 if submenu == null or not is_instance_valid(submenu):
100 return
101 ui_flow_manager.focus_first(submenu)
102
103
104func _on_submenu_hidden() -> void:
105 return_from_submenu()
106
107
108func _on_settings_changed(_settings:Dictionary) -> void:
109 if not _owner_valid() or not _popup_valid():
110 return
111 _apply_current_theme()
112
113
114func _apply_current_theme() -> void:
115 if not _popup_valid():
116 return
117 var theme_id := str(_settings_manager().get_settings().get("theme", "dark"))
118 _apply_current_theme_to(popup, theme_id)
119 for submenu in submenu_popups:
120 _apply_current_theme_to(submenu, theme_id)
121
122
123func _apply_current_theme_to(target:PopupPanel, theme_id:String = "") -> void:
124 if target == null or not is_instance_valid(target):
125 return
126 var settings_manager = _settings_manager()
127 var resolved_theme := theme_id if theme_id != "" else str(settings_manager.get_settings().get("theme", "dark"))
128 layout_manager.apply_theme(target, resolved_theme)
129 settings_manager.apply_text_size(target)
130
131
132func _default_submenu_size() -> Vector2i:
133 if _owner_valid() and owner is Control:
134 var viewport_size = owner.get_viewport_rect().size
135 return Vector2i(
136 min(420, max(300, int(viewport_size.x) - 24)),
137 min(560, max(340, int(viewport_size.y) - 24))
138 )
139 return Vector2i(360, 520)
140
141
142func _get_autoload(name:String):
143 var loop = Engine.get_main_loop()
144 if loop is SceneTree:
145 return loop.root.get_node_or_null(name)
146 return null
147
148
149func _settings_manager():
150 var manager = _get_autoload("SettingsManager")
151 if manager != null:
152 return manager
153 if settings_manager_fallback == null:
154 settings_manager_fallback = SettingsManagerScript.new()
155 return settings_manager_fallback
156
157
158
159func dispose() -> void:
160 var settings_manager = _settings_manager()
161 if settings_manager.settings_changed.is_connected(_on_settings_changed):
162 settings_manager.settings_changed.disconnect(_on_settings_changed)
163 if _popup_valid():
164 popup.hide()
165 for submenu in submenu_popups:
166 if submenu != null and is_instance_valid(submenu) and submenu.popup_hide.is_connected(_on_submenu_hidden):
167 submenu.popup_hide.disconnect(_on_submenu_hidden)
168 submenu_popups.clear()
169 popup = null
170 owner = null
171
172
173func _owner_valid() -> bool:
174 return owner != null and is_instance_valid(owner)
175
176
177func _popup_valid() -> bool:
178 return popup != null and is_instance_valid(popup)
Vector2i
Show the overlay with current theme and text settings applied.