Center login panel content, pin legal links to the bottom

Making the auth panel a fixed height (to kill the scrollbar) left the
shorter views (login, reset) stranded at the top with dead space below.
Split panel_content into a main_column (header, message, mode views -
expand-fill, center-aligned) and the legal footer as a sibling that
stays pinned to the panel's bottom edge regardless of which view is
showing or how tall its content is.

Verified headlessly: top/bottom whitespace above and below the active
view's content is now equal (e.g. login 174/174, steam 2/2), and the
footer's position doesn't move between modes.
This commit is contained in:
hz
2026-07-25 09:10:19 -05:00
parent ce4db7cec8
commit 854c887a1a
+15 -4
View File
@@ -196,16 +196,27 @@ func _build_ui() -> void:
auth_panel.add_child(scroll) auth_panel.add_child(scroll)
panel_gutter = MarginContainer.new() panel_gutter = MarginContainer.new()
panel_gutter.size_flags_horizontal = Control.SIZE_EXPAND_FILL panel_gutter.size_flags_horizontal = Control.SIZE_EXPAND_FILL
panel_gutter.size_flags_vertical = Control.SIZE_EXPAND_FILL
panel_gutter.add_theme_constant_override("margin_right", 28) panel_gutter.add_theme_constant_override("margin_right", 28)
scroll.add_child(panel_gutter) scroll.add_child(panel_gutter)
panel_content = VBoxContainer.new() panel_content = VBoxContainer.new()
panel_content.size_flags_horizontal = Control.SIZE_EXPAND_FILL panel_content.size_flags_horizontal = Control.SIZE_EXPAND_FILL
panel_content.add_theme_constant_override("separation", 16) panel_content.size_flags_vertical = Control.SIZE_EXPAND_FILL
panel_content.add_theme_constant_override("separation", 24)
panel_gutter.add_child(panel_content) panel_gutter.add_child(panel_content)
# main_column holds everything except the legal footer and is the part
# that should center vertically when a view (e.g. login) is shorter than
# the panel - the footer stays pinned to the very bottom either way.
var main_column := VBoxContainer.new()
main_column.size_flags_vertical = Control.SIZE_EXPAND_FILL
main_column.alignment = BoxContainer.ALIGNMENT_CENTER
main_column.add_theme_constant_override("separation", 16)
panel_content.add_child(main_column)
var panel_header := HBoxContainer.new() var panel_header := HBoxContainer.new()
panel_header.add_theme_constant_override("separation", 18) panel_header.add_theme_constant_override("separation", 18)
panel_content.add_child(panel_header) main_column.add_child(panel_header)
var small_icon := TextureRect.new() var small_icon := TextureRect.new()
small_icon.texture = Brand.ranaze_mark_texture() small_icon.texture = Brand.ranaze_mark_texture()
small_icon.custom_minimum_size = Vector2(72, 72) small_icon.custom_minimum_size = Vector2(72, 72)
@@ -229,14 +240,14 @@ func _build_ui() -> void:
reset_view = _build_reset_view() reset_view = _build_reset_view()
steam_view = _build_steam_view() steam_view = _build_steam_view()
for view in [login_view, register_view, reset_view, steam_view]: for view in [login_view, register_view, reset_view, steam_view]:
panel_content.add_child(view) main_column.add_child(view)
message_label = Label.new() message_label = Label.new()
message_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART message_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
message_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER message_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
message_label.add_theme_font_size_override("font_size", 14) message_label.add_theme_font_size_override("font_size", 14)
message_label.add_theme_font_override("font", Brand.font) message_label.add_theme_font_override("font", Brand.font)
panel_content.add_child(message_label) main_column.add_child(message_label)
var legal_footer := HBoxContainer.new() var legal_footer := HBoxContainer.new()
legal_footer.alignment = BoxContainer.ALIGNMENT_CENTER legal_footer.alignment = BoxContainer.ALIGNMENT_CENTER
legal_footer.add_theme_constant_override("separation", 12) legal_footer.add_theme_constant_override("separation", 12)