You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.0 KiB
106 lines
4.0 KiB
""" |
|
Profile Stats Screen |
|
Display detailed statistics for the active user profile |
|
""" |
|
|
|
from .base_screen import BaseScreen |
|
|
|
|
|
class ProfileStatsScreen(BaseScreen): |
|
"""Profile statistics display screen implementation""" |
|
|
|
def render(self) -> None: |
|
"""Render detailed profile statistics""" |
|
if not self.data_manager.active_profile: |
|
self.screen_manager.set_screen("main_menu") |
|
return |
|
|
|
stats_data = self.data_manager.get_profile_stats(self.data_manager.active_profile) |
|
if not stats_data: |
|
self.screen_manager.set_screen("main_menu") |
|
return |
|
|
|
profile = stats_data['profile'] |
|
|
|
# Header |
|
self.ui_renderer.draw_header(f"Stats: {profile.name}") |
|
|
|
# Stats panel |
|
self.ui_renderer.draw_panel(50, 90, 540, 260, 'dark_gray', 'gray') |
|
|
|
# Render statistics content |
|
self._render_local_statistics(stats_data, profile) |
|
self._render_server_status(stats_data) |
|
self._render_settings_summary(profile) |
|
|
|
# Back button |
|
back_selected = (self.selected_index == 0) |
|
self.ui_renderer.draw_button("← Back", 270, 370, 100, 30, back_selected) |
|
|
|
self.ui_renderer.draw_footer_help(self.get_help_text()) |
|
|
|
def _render_local_statistics(self, stats_data, profile) -> None: |
|
"""Render local profile statistics""" |
|
y = 110 |
|
self.ui_renderer.draw_text("Local Statistics:", 60, y, 'light_blue', 'medium') |
|
y += 25 |
|
|
|
stats = [ |
|
f"Games Played: {profile.games_played}", |
|
f"Best Score: {profile.best_score}", |
|
f"Total Score: {profile.total_score}", |
|
f"Achievements: {len(profile.achievements)}", |
|
f"Created: {stats_data['created_formatted']}", |
|
f"Last Played: {stats_data['last_played_formatted']}" |
|
] |
|
|
|
for stat in stats: |
|
self.ui_renderer.draw_text(stat, 70, y, 'light_gray', 'small') |
|
y += 20 |
|
|
|
def _render_server_status(self, stats_data) -> None: |
|
"""Render server connection and sync status""" |
|
y = 250 |
|
|
|
if stats_data['api_enabled']: |
|
self.ui_renderer.draw_text("Server Status:", 60, y, 'light_green', 'medium') |
|
y += 20 |
|
integration_info = stats_data['integration_info'] |
|
device_id = integration_info.get('device_id', 'Unknown') |
|
self.ui_renderer.draw_text(f"Device ID: {device_id}", 70, y, 'light_gray', 'small') |
|
y += 20 |
|
self.ui_renderer.draw_text("✓ Profile synced with server", 70, y, 'light_green', 'small') |
|
else: |
|
self.ui_renderer.draw_text("Server Status:", 60, y, 'red', 'medium') |
|
y += 20 |
|
self.ui_renderer.draw_text("✗ Server offline", 70, y, 'red', 'small') |
|
|
|
def _render_settings_summary(self, profile) -> None: |
|
"""Render current profile settings summary""" |
|
settings_x = 350 |
|
y = 110 |
|
self.ui_renderer.draw_text("Current Settings:", settings_x, y, 'light_blue', 'medium') |
|
y += 25 |
|
|
|
settings_display = [ |
|
f"Difficulty: {profile.settings.get('difficulty', 'normal').title()}", |
|
f"Sound Volume: {profile.settings.get('sound_volume', 50)}%", |
|
f"Music Volume: {profile.settings.get('music_volume', 50)}%", |
|
f"Screen Shake: {'On' if profile.settings.get('screen_shake', True) else 'Off'}" |
|
] |
|
|
|
for setting in settings_display: |
|
self.ui_renderer.draw_text(setting, settings_x + 10, y, 'light_gray', 'small') |
|
y += 20 |
|
|
|
def handle_input(self, action: str) -> bool: |
|
"""Handle profile stats input""" |
|
if action == 'confirm' or action == 'back': |
|
self.handle_back() |
|
return True |
|
|
|
return False |
|
|
|
def get_help_text(self) -> str: |
|
"""Get help text for profile stats""" |
|
return "Enter: Back • Escape: Back to Main Menu"
|
|
|