3679e4dbc4
Reported directly by the user playtesting the exported exe: Play was permanently disabled and there was no way to log in or register. Root cause: main_menu.tscn wired Play and Quit, but nothing was ever connected to _on_login_button_pressed()/_on_register_button_pressed() -- the AuthPanel, its form, and all its backend-calling logic were fully correct, just completely unreachable. The script's own top comment even said "(the existing Play/Quit buttons)" as if Play/Quit somehow doubled as login triggers, which they never did -- a sign nobody ever actually clicked through the running scene, only checked things at the API level. Fix: added a real AuthButtonsRow (LoginButton, RegisterButton) wired to the existing handlers, which now hide themselves once auth succeeds. Also fixed grab_focus() targeting the AuthPanel (which can't accept focus, just a background warning) to focus the username field instead. Verified via two new smoke tests (smoke_test_main_menu_ui.gd, smoke_test_main_menu_full_flow.gd) using a *real signal emission* on the buttons, not a direct method call -- that distinction is exactly what would have caught the original bug. Full click-through confirmed against a real backend: open register form, fill it, submit, Play actually becomes enabled, welcome message shows, auth buttons hide. Also documents a real headless-testing gotcha found while verifying this: a synthetic Button.pressed.emit() on an await-using handler doesn't reliably get driven forward in --script/SceneTree mode the way real GUI input dispatch does -- confirmed by comparing direct-call vs emit() behavior side by side. Not a bug in the actual click-driven flow, a test-harness quirk to route around (call the handler directly, awaited, instead of emitting the signal). Full checkpoint suite re-verified clean on this branch: migrations, 68/68 pytest, all 6 Godot smoke tests (including the 2 new ones, picked up automatically by run_checkpoint_tests.py's glob). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
132 lines
4.9 KiB
Plaintext
132 lines
4.9 KiB
Plaintext
[gd_scene load_steps=2 format=3 uid="uid://main_menu_scene"]
|
|
|
|
[ext_resource type="Script" path="res://scripts/main_menu.gd" id="1_main"]
|
|
|
|
[node name="MainMenu" type="Control"]
|
|
anchors_preset = 15
|
|
anchor_right = 1.0
|
|
anchor_bottom = 1.0
|
|
grow_horizontal = 2
|
|
grow_vertical = 2
|
|
script = ExtResource("1_main")
|
|
|
|
[node name="CenterContainer" type="CenterContainer" parent="."]
|
|
layout_mode = 3
|
|
anchors_preset = 15
|
|
anchor_right = 1.0
|
|
anchor_bottom = 1.0
|
|
grow_horizontal = 2
|
|
grow_vertical = 2
|
|
|
|
[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"]
|
|
layout_mode = 1
|
|
theme_override_constants/separation = 16
|
|
size_flags_horizontal = 4
|
|
|
|
[node name="TitleLabel" type="Label" parent="CenterContainer/VBoxContainer"]
|
|
layout_mode = 1
|
|
text = "AGP Game"
|
|
horizontal_alignment = 1
|
|
theme_override_font_sizes/font_size = 72
|
|
|
|
[node name="AuthButtonsRow" type="HBoxContainer" parent="CenterContainer/VBoxContainer"]
|
|
layout_mode = 1
|
|
theme_override_constants/separation = 16
|
|
alignment = 1
|
|
|
|
[node name="LoginButton" type="Button" parent="CenterContainer/VBoxContainer/AuthButtonsRow"]
|
|
layout_mode = 1
|
|
text = "Login"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="RegisterButton" type="Button" parent="CenterContainer/VBoxContainer/AuthButtonsRow"]
|
|
layout_mode = 1
|
|
text = "Register"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="AuthPanel" type="PanelContainer" parent="CenterContainer/VBoxContainer"]
|
|
layout_mode = 1
|
|
visible = false
|
|
|
|
[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/VBoxContainer/AuthPanel"]
|
|
layout_mode = 1
|
|
theme_override_constants/margin_left = 24
|
|
theme_override_constants/margin_top = 24
|
|
theme_override_constants/margin_right = 24
|
|
theme_override_constants/margin_bottom = 24
|
|
|
|
[node name="AuthVBox" type="VBoxContainer" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer"]
|
|
layout_mode = 1
|
|
theme_override_constants/separation = 8
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="AuthModeLabel" type="Label" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
text = "Login"
|
|
horizontal_alignment = 1
|
|
theme_override_font_sizes/font_size = 24
|
|
|
|
[node name="UsernameEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
placeholder_text = "Username"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="PasswordEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
placeholder_text = "Password"
|
|
size_flags_horizontal = 3
|
|
echo_password = true
|
|
|
|
[node name="EmailEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
visible = false
|
|
placeholder_text = "Email"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="DOBEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
visible = false
|
|
placeholder_text = "Date of Birth (YYYY-MM-DD)"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="ModeToggle" type="CheckButton" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
text = "Register"
|
|
|
|
[node name="AuthButton" type="Button" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
text = "Login"
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="AuthStatusLabel" type="Label" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
text = ""
|
|
horizontal_alignment = 1
|
|
autowrap_mode = 2
|
|
visible = false
|
|
|
|
[node name="WelcomeLabel" type="Label" parent="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox"]
|
|
layout_mode = 1
|
|
visible = false
|
|
text = ""
|
|
horizontal_alignment = 1
|
|
|
|
[node name="PlayButton" type="Button" parent="CenterContainer/VBoxContainer"]
|
|
layout_mode = 1
|
|
text = "Play"
|
|
size_flags_horizontal = 4
|
|
|
|
[node name="QuitButton" type="Button" parent="CenterContainer/VBoxContainer"]
|
|
layout_mode = 1
|
|
text = "Quit"
|
|
size_flags_horizontal = 4
|
|
|
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/AuthButtonsRow/LoginButton" to="." method="_on_login_button_pressed"]
|
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/AuthButtonsRow/RegisterButton" to="." method="_on_register_button_pressed"]
|
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/PlayButton" to="." method="_on_play_button_pressed"]
|
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"]
|
|
[connection signal="toggled" from="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox/ModeToggle" to="." method="_on_mode_toggle_toggled"]
|
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox/AuthButton" to="." method="_on_auth_button_pressed"]
|
|
[connection signal="text_submitted" from="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox/UsernameEdit" to="." method="_on_auth_button_pressed"]
|
|
[connection signal="text_submitted" from="CenterContainer/VBoxContainer/AuthPanel/MarginContainer/AuthVBox/PasswordEdit" to="." method="_on_auth_button_pressed"]
|