Skip to content

Commit 48d3830

Browse files
committed
Implement selecting custom emulators per game
1 parent b65a225 commit 48d3830

13 files changed

+512
-86
lines changed

github_media/.gdignore

Whitespace-only changes.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
extends Control
2+
3+
signal change_ocurred
4+
5+
@onready var n_intro_lbl := %IntroLabel
6+
@onready var n_override_emulator := %OverrideEmulator
7+
@onready var n_emulator_options := %EmulatorOptions
8+
9+
var game_data : RetroHubGameData: set = set_game_data
10+
11+
@export var disable_edits := false
12+
13+
func _ready():
14+
#warning-ignore:return_value_discarded
15+
RetroHubConfig.game_data_updated.connect(_on_game_data_updated)
16+
17+
n_emulator_options.get_popup().max_size.y = RetroHubUI.max_popupmenu_height
18+
19+
func _on_game_data_updated(_game_data: RetroHubGameData):
20+
if game_data == _game_data:
21+
discard_changes()
22+
23+
func set_game_data(_game_data: RetroHubGameData) -> void:
24+
game_data = _game_data
25+
update_emulator_options()
26+
for idx in n_emulator_options.item_count:
27+
if n_emulator_options.get_item_metadata(idx) == game_data.emulator:
28+
n_emulator_options.selected = idx
29+
break
30+
discard_changes()
31+
32+
func update_emulator_options() -> void:
33+
n_emulator_options.clear()
34+
35+
var system_emulators : Array = RetroHubConfig._systems_raw[game_data.system.name]["emulator"]
36+
for system_emulator in system_emulators:
37+
var emu_short_name : String
38+
if system_emulator is Dictionary:
39+
emu_short_name = system_emulator.keys()[0]
40+
else:
41+
emu_short_name = system_emulator
42+
if RetroHubConfig.emulators_map.has(emu_short_name):
43+
var emu_logo := load("res://assets/emulators/%s.png" % emu_short_name)
44+
n_emulator_options.add_icon_item(emu_logo, RetroHubConfig.emulators_map[emu_short_name]["fullname"])
45+
else:
46+
n_emulator_options.add_item(emu_short_name)
47+
n_emulator_options.set_item_metadata(n_emulator_options.item_count-1, emu_short_name)
48+
49+
func discard_changes():
50+
if game_data:
51+
n_override_emulator.button_pressed = !game_data.emulator.is_empty()
52+
else:
53+
n_override_emulator.button_pressed = false
54+
55+
56+
func save_changes():
57+
if game_data:
58+
if n_override_emulator.button_pressed:
59+
game_data.emulator = n_emulator_options.get_selected_metadata()
60+
else:
61+
game_data.emulator = ""
62+
63+
func grab_focus():
64+
if RetroHubConfig.config.accessibility_screen_reader_enabled:
65+
n_intro_lbl.grab_focus()
66+
else:
67+
n_override_emulator.grab_focus()
68+
_on_override_emulator_toggled(n_override_emulator.button_pressed)
69+
if n_emulator_options.item_count == 0:
70+
update_emulator_options()
71+
72+
func _on_change_ocurred(_tmp = null):
73+
emit_signal("change_ocurred")
74+
75+
76+
func _on_override_emulator_toggled(button_pressed):
77+
n_emulator_options.disabled = !button_pressed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[gd_scene load_steps=4 format=3 uid="uid://d7nikimq3mtl"]
2+
3+
[ext_resource type="Script" path="res://scenes/config/GameEmulatorEditor.gd" id="1_l1abn"]
4+
[ext_resource type="Script" path="res://scenes/ui_nodes/AccessibilityFocus.gd" id="2_1c0xs"]
5+
[ext_resource type="Script" path="res://source/utils/ScrollHandler.gd" id="4_cjldn"]
6+
7+
[node name="Emulator" type="Control"]
8+
layout_mode = 3
9+
anchors_preset = 15
10+
anchor_right = 1.0
11+
anchor_bottom = 1.0
12+
grow_horizontal = 2
13+
grow_vertical = 2
14+
script = ExtResource("1_l1abn")
15+
16+
[node name="ScrollContainer" type="ScrollContainer" parent="."]
17+
layout_mode = 1
18+
anchors_preset = 15
19+
anchor_right = 1.0
20+
anchor_bottom = 1.0
21+
grow_horizontal = 2
22+
grow_vertical = 2
23+
24+
[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"]
25+
layout_mode = 2
26+
size_flags_horizontal = 3
27+
size_flags_vertical = 3
28+
29+
[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/VBoxContainer"]
30+
layout_mode = 2
31+
32+
[node name="IntroLabel" type="Label" parent="ScrollContainer/VBoxContainer/HBoxContainer"]
33+
unique_name_in_owner = true
34+
layout_mode = 2
35+
size_flags_horizontal = 3
36+
size_flags_vertical = 0
37+
text = "Override default emulator?"
38+
39+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer/IntroLabel"]
40+
script = ExtResource("2_1c0xs")
41+
42+
[node name="OverrideEmulator" type="CheckButton" parent="ScrollContainer/VBoxContainer/HBoxContainer"]
43+
unique_name_in_owner = true
44+
layout_mode = 2
45+
46+
[node name="HSeparator" type="HSeparator" parent="ScrollContainer/VBoxContainer"]
47+
layout_mode = 2
48+
49+
[node name="HBoxContainer2" type="HBoxContainer" parent="ScrollContainer/VBoxContainer"]
50+
layout_mode = 2
51+
52+
[node name="Label" type="Label" parent="ScrollContainer/VBoxContainer/HBoxContainer2"]
53+
layout_mode = 2
54+
size_flags_horizontal = 3
55+
size_flags_vertical = 0
56+
text = "Emulator:"
57+
58+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer2/Label"]
59+
script = ExtResource("2_1c0xs")
60+
61+
[node name="EmulatorOptions" type="OptionButton" parent="ScrollContainer/VBoxContainer/HBoxContainer2"]
62+
unique_name_in_owner = true
63+
custom_minimum_size = Vector2(256, 64)
64+
layout_mode = 2
65+
expand_icon = true
66+
67+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer2/EmulatorOptions"]
68+
script = ExtResource("2_1c0xs")
69+
next = NodePath("../../../DisclaimerLabel")
70+
71+
[node name="DisclaimerLabel" type="Label" parent="ScrollContainer/VBoxContainer"]
72+
layout_mode = 2
73+
text = "RetroHub will try all these emulators in order until one launches successfully. By overriding this, RetroHub will begin with the chosen emulator, and default to the remaining emulators if it fails."
74+
autowrap_mode = 2
75+
76+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/DisclaimerLabel"]
77+
script = ExtResource("2_1c0xs")
78+
79+
[node name="ScrollHandler" type="Control" parent="ScrollContainer"]
80+
layout_mode = 2
81+
script = ExtResource("4_cjldn")
82+
83+
[connection signal="pressed" from="ScrollContainer/VBoxContainer/HBoxContainer/OverrideEmulator" to="." method="_on_change_ocurred"]
84+
[connection signal="toggled" from="ScrollContainer/VBoxContainer/HBoxContainer/OverrideEmulator" to="." method="_on_override_emulator_toggled"]
85+
[connection signal="item_selected" from="ScrollContainer/VBoxContainer/HBoxContainer2/EmulatorOptions" to="." method="_on_change_ocurred"]

scenes/config/GameInfoEditor.gd

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
extends Control
2+
3+
signal change_ocurred
4+
5+
@onready var n_intro_lbl := %IntroLabel
6+
@onready var n_favorite := %Favorite
7+
@onready var n_num_times_played := %NumTimesPlayed
8+
9+
var game_data : RetroHubGameData: set = set_game_data
10+
11+
@export var disable_edits := false
12+
13+
func _ready():
14+
#warning-ignore:return_value_discarded
15+
RetroHubConfig.game_data_updated.connect(_on_game_data_updated)
16+
17+
func _on_game_data_updated(_game_data: RetroHubGameData):
18+
if game_data == _game_data:
19+
discard_changes()
20+
21+
func set_game_data(_game_data: RetroHubGameData) -> void:
22+
game_data = _game_data
23+
discard_changes()
24+
25+
func discard_changes():
26+
if game_data:
27+
set_edit_nodes_enabled(true)
28+
n_favorite.set_pressed_no_signal(game_data.favorite)
29+
n_num_times_played.value = game_data.play_count
30+
else:
31+
set_edit_nodes_enabled(false)
32+
n_favorite.set_pressed_no_signal(false)
33+
n_num_times_played.value = 0
34+
35+
func set_edit_nodes_enabled(enabled: bool):
36+
if disable_edits:
37+
enabled = false
38+
n_favorite.disabled = !enabled
39+
n_num_times_played.editable = enabled
40+
41+
func save_changes():
42+
if game_data:
43+
game_data.favorite = n_favorite.button_pressed
44+
game_data.play_count = n_num_times_played.value
45+
46+
func grab_focus():
47+
if RetroHubConfig.config.accessibility_screen_reader_enabled:
48+
n_intro_lbl.grab_focus()
49+
else:
50+
n_favorite.grab_focus()
51+
52+
func _on_change_ocurred(_tmp = null):
53+
emit_signal("change_ocurred")

scenes/config/GameInfoEditor.tscn

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
[gd_scene load_steps=5 format=3 uid="uid://dl6wrbha57kyf"]
2+
3+
[ext_resource type="Script" path="res://scenes/config/GameInfoEditor.gd" id="1_6huq3"]
4+
[ext_resource type="Script" path="res://scenes/ui_nodes/AccessibilityFocus.gd" id="1_g3g03"]
5+
[ext_resource type="Script" path="res://source/utils/SpinBoxHandler.gd" id="2_xpxl6"]
6+
[ext_resource type="Script" path="res://source/utils/ScrollHandler.gd" id="3_e7sx0"]
7+
8+
[node name="Info" type="Control"]
9+
layout_mode = 3
10+
anchors_preset = 15
11+
anchor_right = 1.0
12+
anchor_bottom = 1.0
13+
grow_horizontal = 2
14+
grow_vertical = 2
15+
script = ExtResource("1_6huq3")
16+
17+
[node name="ScrollContainer" type="ScrollContainer" parent="."]
18+
layout_mode = 1
19+
anchors_preset = 15
20+
anchor_right = 1.0
21+
anchor_bottom = 1.0
22+
grow_horizontal = 2
23+
grow_vertical = 2
24+
25+
[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"]
26+
layout_mode = 2
27+
size_flags_horizontal = 3
28+
size_flags_vertical = 3
29+
30+
[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/VBoxContainer"]
31+
layout_mode = 2
32+
33+
[node name="IntroLabel" type="Label" parent="ScrollContainer/VBoxContainer/HBoxContainer"]
34+
unique_name_in_owner = true
35+
layout_mode = 2
36+
size_flags_horizontal = 3
37+
size_flags_vertical = 0
38+
text = "Favorite?"
39+
40+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer/IntroLabel"]
41+
script = ExtResource("1_g3g03")
42+
43+
[node name="Favorite" type="CheckButton" parent="ScrollContainer/VBoxContainer/HBoxContainer"]
44+
unique_name_in_owner = true
45+
layout_mode = 2
46+
47+
[node name="HBoxContainer2" type="HBoxContainer" parent="ScrollContainer/VBoxContainer"]
48+
layout_mode = 2
49+
50+
[node name="Label" type="Label" parent="ScrollContainer/VBoxContainer/HBoxContainer2"]
51+
layout_mode = 2
52+
size_flags_horizontal = 3
53+
size_flags_vertical = 0
54+
text = "Number of times played:"
55+
56+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer2/Label"]
57+
script = ExtResource("1_g3g03")
58+
59+
[node name="NumTimesPlayed" type="SpinBox" parent="ScrollContainer/VBoxContainer/HBoxContainer2"]
60+
unique_name_in_owner = true
61+
layout_mode = 2
62+
allow_greater = true
63+
64+
[node name="SpinBoxHandler" type="Control" parent="ScrollContainer/VBoxContainer/HBoxContainer2/NumTimesPlayed"]
65+
anchors_preset = 0
66+
offset_right = 40.0
67+
offset_bottom = 40.0
68+
script = ExtResource("2_xpxl6")
69+
70+
[node name="AccessibilityFocus" type="Node" parent="ScrollContainer/VBoxContainer/HBoxContainer2/NumTimesPlayed"]
71+
script = ExtResource("1_g3g03")
72+
next = NodePath("../../../HBoxContainer/IntroLabel")
73+
74+
[node name="ScrollHandler" type="Control" parent="ScrollContainer"]
75+
layout_mode = 2
76+
script = ExtResource("3_e7sx0")
77+
78+
[connection signal="pressed" from="ScrollContainer/VBoxContainer/HBoxContainer/Favorite" to="." method="_on_change_ocurred"]
79+
[connection signal="value_changed" from="ScrollContainer/VBoxContainer/HBoxContainer2/NumTimesPlayed" to="." method="_on_change_ocurred"]

scenes/config/GameMetadataEditor.gd

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
extends Control
22

33
signal change_ocurred
4-
signal reset_state
54

65
@onready var n_intro_lbl := %IntroLabel
76
@onready var n_name := %Name
@@ -18,8 +17,6 @@ signal reset_state
1817
@onready var n_variable_players := %VariablePlayers
1918
@onready var n_variable_players_min := %VariablePlayersMin
2019
@onready var n_variable_players_max := %VariablePlayersMax
21-
@onready var n_favorite := %Favorite
22-
@onready var n_num_times_played := %NumTimesPlayed
2320

2421
var game_data : RetroHubGameData: set = set_game_data
2522

@@ -113,8 +110,6 @@ func discard_changes():
113110
n_variable_players.set_pressed_no_signal(false)
114111
n_variable_players_min.value = 1
115112
n_variable_players_max.value = 2
116-
n_favorite.set_pressed_no_signal(game_data.favorite)
117-
n_num_times_played.value = game_data.play_count
118113
else:
119114
set_edit_nodes_enabled(false)
120115
n_name.text = ""
@@ -131,9 +126,6 @@ func discard_changes():
131126
n_variable_players.set_pressed_no_signal(false)
132127
n_variable_players_min.value = 1
133128
n_variable_players_max.value = 2
134-
n_favorite.set_pressed_no_signal(false)
135-
n_num_times_played.value = 0
136-
emit_signal("reset_state")
137129

138130
func set_edit_nodes_enabled(enabled: bool):
139131
if disable_edits:
@@ -151,8 +143,6 @@ func set_edit_nodes_enabled(enabled: bool):
151143
n_variable_players.disabled = !enabled
152144
n_variable_players_min.editable = enabled
153145
n_variable_players_max.editable = enabled
154-
n_favorite.disabled = !enabled
155-
n_num_times_played.editable = enabled
156146

157147
func save_changes():
158148
if game_data:
@@ -177,10 +167,6 @@ func save_changes():
177167
game_data.num_players = "%d-%d" % [n_fixed_players_num.value, n_fixed_players_num.value]
178168
else:
179169
game_data.num_players = "%d-%d" % [n_variable_players_min.value, n_variable_players_max.value]
180-
game_data.favorite = n_favorite.button_pressed
181-
game_data.play_count = n_num_times_played.value
182-
if RetroHubConfig.save_game_data(game_data):
183-
emit_signal("reset_state")
184170

185171
func grab_focus():
186172
if RetroHubConfig.config.accessibility_screen_reader_enabled:

0 commit comments

Comments
 (0)