Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
67afd6bd59 | ||
|
|
012d0cf196 | ||
|
|
fe54f7b417 | ||
|
|
be2d542cb6 |
+5
-125
@@ -28,10 +28,7 @@ var sidebar_content: VBoxContainer
|
|||||||
var drawer_backdrop: ColorRect
|
var drawer_backdrop: ColorRect
|
||||||
var drawer_open := false
|
var drawer_open := false
|
||||||
var menu_button: Button
|
var menu_button: Button
|
||||||
var account_button: Button
|
|
||||||
var account_chevron_button: Button
|
|
||||||
var credits_badge: PanelContainer
|
var credits_badge: PanelContainer
|
||||||
var account_menu: PanelContainer
|
|
||||||
var nav_buttons: Dictionary = {}
|
var nav_buttons: Dictionary = {}
|
||||||
var current_nav_key := "home"
|
var current_nav_key := "home"
|
||||||
var compact_shell := false
|
var compact_shell := false
|
||||||
@@ -56,8 +53,6 @@ func _update_responsive_layout() -> void:
|
|||||||
_apply_screen_margins(current_screen_name)
|
_apply_screen_margins(current_screen_name)
|
||||||
if feedback_button != null:
|
if feedback_button != null:
|
||||||
feedback_button.visible = AuthState.is_logged_in and size.x >= 560.0
|
feedback_button.visible = AuthState.is_logged_in and size.x >= 560.0
|
||||||
if account_chevron_button != null:
|
|
||||||
account_chevron_button.visible = size.x >= 480.0
|
|
||||||
if drawer_open and not compact_shell:
|
if drawer_open and not compact_shell:
|
||||||
_close_drawer()
|
_close_drawer()
|
||||||
if app_menu != null:
|
if app_menu != null:
|
||||||
@@ -69,7 +64,6 @@ func _update_responsive_layout() -> void:
|
|||||||
|
|
||||||
func show_screen(screen_name: String, payload: Variant = null) -> void:
|
func show_screen(screen_name: String, payload: Variant = null) -> void:
|
||||||
_close_app_menu()
|
_close_app_menu()
|
||||||
_close_account_menu()
|
|
||||||
_close_drawer()
|
_close_drawer()
|
||||||
for child in screens_host.get_children():
|
for child in screens_host.get_children():
|
||||||
if child.visible and child.has_method("on_hide"):
|
if child.visible and child.has_method("on_hide"):
|
||||||
@@ -188,26 +182,10 @@ func _build_ui() -> void:
|
|||||||
header.add_child(theme_button)
|
header.add_child(theme_button)
|
||||||
_refresh_theme_button()
|
_refresh_theme_button()
|
||||||
|
|
||||||
account_button = Button.new()
|
|
||||||
account_button.tooltip_text = "Open account menu"
|
|
||||||
account_button.custom_minimum_size = Vector2(44, 44)
|
|
||||||
account_button.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
|
||||||
account_button.pressed.connect(_toggle_account_menu)
|
|
||||||
_style_account_avatar(account_button)
|
|
||||||
header.add_child(account_button)
|
|
||||||
|
|
||||||
account_chevron_button = Button.new()
|
|
||||||
account_chevron_button.icon = preload("res://assets/icons/lucide/chevron-down.svg")
|
|
||||||
account_chevron_button.tooltip_text = "Open account menu"
|
|
||||||
account_chevron_button.custom_minimum_size = Vector2(28, 44)
|
|
||||||
account_chevron_button.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
|
||||||
account_chevron_button.add_theme_constant_override("icon_max_width", 17)
|
|
||||||
account_chevron_button.pressed.connect(_toggle_account_menu)
|
|
||||||
_style_account_chevron(account_chevron_button)
|
|
||||||
header.add_child(account_chevron_button)
|
|
||||||
|
|
||||||
credits_badge = CreditsBadge.new()
|
credits_badge = CreditsBadge.new()
|
||||||
credits_badge.store_requested.connect(func(): show_screen("rz_store"))
|
credits_badge.store_requested.connect(func():
|
||||||
|
if Brand.is_uat_environment():
|
||||||
|
show_screen("rz_store"))
|
||||||
header.add_child(credits_badge)
|
header.add_child(credits_badge)
|
||||||
|
|
||||||
var screens_container := MarginContainer.new()
|
var screens_container := MarginContainer.new()
|
||||||
@@ -375,7 +353,6 @@ func _build_ui() -> void:
|
|||||||
legal_document_dialog = preload("res://scripts/ui/legal_document_dialog.gd").new()
|
legal_document_dialog = preload("res://scripts/ui/legal_document_dialog.gd").new()
|
||||||
legal_document_dialog.name = "LegalDocumentDialog"
|
legal_document_dialog.name = "LegalDocumentDialog"
|
||||||
add_child(legal_document_dialog)
|
add_child(legal_document_dialog)
|
||||||
_build_account_menu()
|
|
||||||
_build_drawer()
|
_build_drawer()
|
||||||
|
|
||||||
AuthState.auth_changed.connect(_on_auth_changed)
|
AuthState.auth_changed.connect(_on_auth_changed)
|
||||||
@@ -439,7 +416,7 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void
|
|||||||
container.add_child(HSeparator.new())
|
container.add_child(HSeparator.new())
|
||||||
_add_nav_button(container, "donations", "Support RanaZe", "heart-pulse", true)
|
_add_nav_button(container, "donations", "Support RanaZe", "heart-pulse", true)
|
||||||
_add_nav_button(container, "performance", "Profile", "user-round", true)
|
_add_nav_button(container, "performance", "Profile", "user-round", true)
|
||||||
_add_nav_button(container, "rz_store", "RZ Shop", "star", true)
|
_add_nav_button(container, "rz_store", "RZ Shop", "star", true, Brand.is_uat_environment())
|
||||||
_add_nav_button(container, "settings", "Settings", "settings", true)
|
_add_nav_button(container, "settings", "Settings", "settings", true)
|
||||||
_add_nav_button(container, "logout", "Log out", "log-out", true)
|
_add_nav_button(container, "logout", "Log out", "log-out", true)
|
||||||
|
|
||||||
@@ -508,27 +485,6 @@ func _update_header_title(screen_name: String) -> void:
|
|||||||
header_title.text = str(titles.get(screen_name, ""))
|
header_title.text = str(titles.get(screen_name, ""))
|
||||||
|
|
||||||
|
|
||||||
func _build_account_menu() -> void:
|
|
||||||
account_menu = PanelContainer.new()
|
|
||||||
account_menu.visible = false
|
|
||||||
account_menu.top_level = true
|
|
||||||
account_menu.custom_minimum_size = Vector2(230, 230)
|
|
||||||
account_menu.add_theme_stylebox_override("panel", Brand.panel_box(UIThemeService.is_dark_mode()))
|
|
||||||
add_child(account_menu)
|
|
||||||
var content := VBoxContainer.new()
|
|
||||||
content.add_theme_constant_override("separation", 8)
|
|
||||||
account_menu.add_child(content)
|
|
||||||
for spec in [["Profile", "user-round", "performance"], ["Settings", "settings", "settings"], ["Log out", "log-out", "logout"]]:
|
|
||||||
var button := Button.new()
|
|
||||||
button.text = spec[0]
|
|
||||||
button.icon = load("res://assets/icons/lucide/%s.svg" % spec[1])
|
|
||||||
button.add_theme_constant_override("icon_max_width", 22)
|
|
||||||
button.alignment = HORIZONTAL_ALIGNMENT_LEFT
|
|
||||||
button.custom_minimum_size = Vector2(0, 46)
|
|
||||||
button.pressed.connect(_on_navigation_pressed.bind(spec[2]))
|
|
||||||
content.add_child(button)
|
|
||||||
|
|
||||||
|
|
||||||
func _build_drawer() -> void:
|
func _build_drawer() -> void:
|
||||||
drawer_backdrop = ColorRect.new()
|
drawer_backdrop = ColorRect.new()
|
||||||
drawer_backdrop.visible = false
|
drawer_backdrop.visible = false
|
||||||
@@ -570,25 +526,6 @@ func _on_drawer_backdrop_input(event: InputEvent) -> void:
|
|||||||
_close_drawer()
|
_close_drawer()
|
||||||
|
|
||||||
|
|
||||||
func _toggle_account_menu() -> void:
|
|
||||||
if account_menu == null:
|
|
||||||
return
|
|
||||||
if account_menu.visible:
|
|
||||||
_close_account_menu()
|
|
||||||
return
|
|
||||||
account_menu.visible = true
|
|
||||||
account_menu.size = account_menu.custom_minimum_size
|
|
||||||
account_menu.position = Vector2(
|
|
||||||
get_viewport_rect().size.x - account_menu.size.x - 24,
|
|
||||||
82
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func _close_account_menu() -> void:
|
|
||||||
if account_menu != null:
|
|
||||||
account_menu.visible = false
|
|
||||||
|
|
||||||
|
|
||||||
func _screen_uses_shell(screen_name: String) -> bool:
|
func _screen_uses_shell(screen_name: String) -> bool:
|
||||||
return AuthState.is_logged_in and screen_name not in ["login", "legal_consent", "player", "ccs_player"]
|
return AuthState.is_logged_in and screen_name not in ["login", "legal_consent", "player", "ccs_player"]
|
||||||
|
|
||||||
@@ -680,32 +617,6 @@ func _style_header_feedback_button(button: Button) -> void:
|
|||||||
button.add_theme_color_override("icon_hover_color", Brand.SKY_BLUE)
|
button.add_theme_color_override("icon_hover_color", Brand.SKY_BLUE)
|
||||||
|
|
||||||
|
|
||||||
func _style_account_avatar(button: Button) -> void:
|
|
||||||
var dark := UIThemeService.is_dark_mode()
|
|
||||||
var normal := StyleBoxFlat.new()
|
|
||||||
normal.bg_color = Color("26324f") if dark else Color("dce5f5")
|
|
||||||
normal.corner_radius_top_left = 22
|
|
||||||
normal.corner_radius_top_right = 22
|
|
||||||
normal.corner_radius_bottom_left = 22
|
|
||||||
normal.corner_radius_bottom_right = 22
|
|
||||||
var hover := normal.duplicate() as StyleBoxFlat
|
|
||||||
hover.bg_color = Color("344465") if dark else Color("cad7ed")
|
|
||||||
button.add_theme_stylebox_override("normal", normal)
|
|
||||||
button.add_theme_stylebox_override("hover", hover)
|
|
||||||
button.add_theme_stylebox_override("pressed", hover)
|
|
||||||
button.add_theme_color_override("font_color", Color("f8fafc") if dark else Color("172033"))
|
|
||||||
button.add_theme_color_override("font_hover_color", Color("ffffff") if dark else Color("0f172a"))
|
|
||||||
|
|
||||||
|
|
||||||
func _style_account_chevron(button: Button) -> void:
|
|
||||||
var empty := StyleBoxEmpty.new()
|
|
||||||
button.add_theme_stylebox_override("normal", empty)
|
|
||||||
button.add_theme_stylebox_override("hover", empty)
|
|
||||||
button.add_theme_stylebox_override("pressed", empty)
|
|
||||||
button.add_theme_color_override("icon_normal_color", Style.MUTED)
|
|
||||||
button.add_theme_color_override("icon_hover_color", Style.TEXT)
|
|
||||||
|
|
||||||
|
|
||||||
func _style_shell_theme_button(button: Button) -> void:
|
func _style_shell_theme_button(button: Button) -> void:
|
||||||
var dark := UIThemeService.is_dark_mode()
|
var dark := UIThemeService.is_dark_mode()
|
||||||
var normal := StyleBoxFlat.new()
|
var normal := StyleBoxFlat.new()
|
||||||
@@ -737,36 +648,18 @@ func _input(event: InputEvent) -> void:
|
|||||||
_close_drawer()
|
_close_drawer()
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
return
|
return
|
||||||
if account_menu != null and account_menu.visible:
|
|
||||||
_close_account_menu()
|
|
||||||
get_viewport().set_input_as_handled()
|
|
||||||
return
|
|
||||||
if current_screen_name in ["player", "ccs_player", "flashcards_study"]:
|
if current_screen_name in ["player", "ccs_player", "flashcards_study"]:
|
||||||
_toggle_app_menu()
|
_toggle_app_menu()
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
|
|
||||||
|
|
||||||
func _refresh_header_controls() -> void:
|
func _refresh_header_controls() -> void:
|
||||||
if account_button != null:
|
|
||||||
account_button.text = _account_initials(AuthState.username)
|
|
||||||
if feedback_button != null:
|
if feedback_button != null:
|
||||||
feedback_button.visible = AuthState.is_logged_in and size.x >= 560.0
|
feedback_button.visible = AuthState.is_logged_in and size.x >= 560.0
|
||||||
feedback_button.icon = preload("res://assets/icons/lucide/message-square.svg")
|
feedback_button.icon = preload("res://assets/icons/lucide/message-square.svg")
|
||||||
feedback_button.add_theme_constant_override("icon_max_width", 21)
|
feedback_button.add_theme_constant_override("icon_max_width", 21)
|
||||||
|
|
||||||
|
|
||||||
func _account_initials(username: String) -> String:
|
|
||||||
var cleaned := ""
|
|
||||||
for character in username:
|
|
||||||
if character.to_lower() != character.to_upper():
|
|
||||||
cleaned += character
|
|
||||||
elif character.is_valid_int():
|
|
||||||
cleaned += character
|
|
||||||
if cleaned.length() >= 2:
|
|
||||||
break
|
|
||||||
return cleaned.to_upper() if not cleaned.is_empty() else "ME"
|
|
||||||
|
|
||||||
|
|
||||||
func open_feedback_dialog() -> void:
|
func open_feedback_dialog() -> void:
|
||||||
if not AuthState.is_logged_in or feedback_dialog == null:
|
if not AuthState.is_logged_in or feedback_dialog == null:
|
||||||
return
|
return
|
||||||
@@ -804,14 +697,8 @@ func _on_theme_changed(is_dark_mode: bool) -> void:
|
|||||||
if app_background != null:
|
if app_background != null:
|
||||||
app_background.color = Brand.background_color(is_dark_mode)
|
app_background.color = Brand.background_color(is_dark_mode)
|
||||||
app_background.material = Brand.background_material(is_dark_mode)
|
app_background.material = Brand.background_material(is_dark_mode)
|
||||||
if account_menu != null:
|
|
||||||
account_menu.add_theme_stylebox_override("panel", Brand.panel_box(is_dark_mode))
|
|
||||||
if feedback_button != null:
|
if feedback_button != null:
|
||||||
_style_header_feedback_button(feedback_button)
|
_style_header_feedback_button(feedback_button)
|
||||||
if account_button != null:
|
|
||||||
_style_account_avatar(account_button)
|
|
||||||
if account_chevron_button != null:
|
|
||||||
_style_account_chevron(account_chevron_button)
|
|
||||||
if credits_badge != null:
|
if credits_badge != null:
|
||||||
credits_badge.refresh_theme_controls()
|
credits_badge.refresh_theme_controls()
|
||||||
if sidebar != null:
|
if sidebar != null:
|
||||||
@@ -969,15 +856,8 @@ func exit_current_run() -> void:
|
|||||||
if current_screen_name == "flashcards_study":
|
if current_screen_name == "flashcards_study":
|
||||||
show_screen("flashcards_hub")
|
show_screen("flashcards_hub")
|
||||||
return
|
return
|
||||||
var was_core_run := BlockSessionService.session_kind == "core"
|
|
||||||
var was_review_run := BlockSessionService.session_kind == "review"
|
|
||||||
var was_dynamic_run := BlockSessionService.session_kind == "dynamic"
|
|
||||||
if BlockSessionService.block_started and BlockSessionService.session_kind != "simulation":
|
if BlockSessionService.block_started and BlockSessionService.session_kind != "simulation":
|
||||||
BlockSessionService.finish_block()
|
BlockSessionService.finish_block()
|
||||||
elif BlockSessionService.session_kind == "simulation":
|
elif BlockSessionService.session_kind == "simulation":
|
||||||
BlockSessionService.block_started = false
|
BlockSessionService.block_started = false
|
||||||
if was_review_run or was_dynamic_run:
|
show_screen("dashboard")
|
||||||
DashboardService.refresh()
|
|
||||||
show_screen("dashboard")
|
|
||||||
else:
|
|
||||||
show_screen("selection", "exam" if was_core_run else "step3")
|
|
||||||
|
|||||||
Reference in New Issue
Block a user