Implement main menu, profile list, and profile stats screens; add screen manager and user profile integration
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
"""
|
||||
Edit Profile Screen
|
||||
Interface for editing profile settings and configurations
|
||||
"""
|
||||
|
||||
from .base_screen import BaseScreen
|
||||
from profile_data import SettingsManager
|
||||
|
||||
|
||||
class EditProfileScreen(BaseScreen):
|
||||
"""Profile editing screen implementation"""
|
||||
|
||||
def __init__(self, data_manager, ui_renderer, screen_manager):
|
||||
super().__init__(data_manager, ui_renderer, screen_manager)
|
||||
|
||||
# Settings configuration
|
||||
self.settings = [
|
||||
("Difficulty", "difficulty"),
|
||||
("Sound Vol", "sound_volume"),
|
||||
("Music Vol", "music_volume"),
|
||||
("Screen Shake", "screen_shake"),
|
||||
]
|
||||
self.max_index = len(self.settings) + 1 # +1 for save/back buttons
|
||||
|
||||
def render(self) -> None:
|
||||
"""Render profile editing screen"""
|
||||
active_profile = self.data_manager.get_active_profile()
|
||||
if not active_profile:
|
||||
self.screen_manager.set_screen("main_menu")
|
||||
return
|
||||
|
||||
# Header with profile info
|
||||
subtitle = f"Games: {active_profile.games_played} • Score: {active_profile.best_score}"
|
||||
self.ui_renderer.draw_header(f"Edit: {active_profile.name}", subtitle)
|
||||
|
||||
# Settings panel
|
||||
self.ui_renderer.draw_panel(60, 90, 520, 280, 'dark_gray', 'gray')
|
||||
self.ui_renderer.draw_text("Settings", 320, 105, 'white', 'large', center=True)
|
||||
|
||||
# Settings items
|
||||
for i, (label, setting_key) in enumerate(self.settings):
|
||||
item_y = 130 + i * 35
|
||||
selected = (i == self.selected_index)
|
||||
|
||||
if selected:
|
||||
self.ui_renderer.draw_panel(80, item_y, 480, 25, 'blue', 'light_blue')
|
||||
text_color = 'white'
|
||||
value_color = 'light_green'
|
||||
# Navigation arrows
|
||||
self.ui_renderer.draw_text("◄", 70, item_y + 5, 'white', 'small')
|
||||
self.ui_renderer.draw_text("►", 570, item_y + 5, 'white', 'small')
|
||||
else:
|
||||
text_color = 'light_gray'
|
||||
value_color = 'yellow'
|
||||
|
||||
# Setting label and value
|
||||
self.ui_renderer.draw_text(label, 90, item_y + 5, text_color, 'medium')
|
||||
|
||||
value = active_profile.settings[setting_key]
|
||||
display_value = SettingsManager.get_setting_display_value(setting_key, value)
|
||||
self.ui_renderer.draw_text(display_value, 500, item_y + 5, value_color, 'medium')
|
||||
|
||||
# Action buttons
|
||||
save_selected = (self.selected_index == len(self.settings))
|
||||
back_selected = (self.selected_index == len(self.settings) + 1)
|
||||
|
||||
self.ui_renderer.draw_button("Save", 200, 310, 80, 30, save_selected)
|
||||
self.ui_renderer.draw_button("← Back", 320, 310, 80, 30, back_selected)
|
||||
|
||||
self.ui_renderer.draw_footer_help(self.get_help_text())
|
||||
|
||||
def handle_input(self, action: str) -> bool:
|
||||
"""Handle edit profile input"""
|
||||
max_index = len(self.settings) + 1 # settings + save + back
|
||||
|
||||
if action == 'up':
|
||||
self.navigate_up()
|
||||
return True
|
||||
elif action == 'down':
|
||||
self.navigate_down(max_index)
|
||||
return True
|
||||
elif action == 'left':
|
||||
self.adjust_setting(-1)
|
||||
return True
|
||||
elif action == 'right':
|
||||
self.adjust_setting(1)
|
||||
return True
|
||||
elif action == 'confirm':
|
||||
self.handle_confirm()
|
||||
return True
|
||||
elif action == 'back':
|
||||
self.handle_back()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def adjust_setting(self, direction: int) -> None:
|
||||
"""Adjust setting value left/right"""
|
||||
if not self.data_manager.active_profile or self.selected_index >= len(self.settings):
|
||||
return
|
||||
|
||||
profile = self.data_manager.get_active_profile()
|
||||
if not profile:
|
||||
return
|
||||
|
||||
setting_label, setting_name = self.settings[self.selected_index]
|
||||
current_value = profile.settings[setting_name]
|
||||
|
||||
# Adjust based on setting type
|
||||
if setting_name == "difficulty":
|
||||
new_value = SettingsManager.adjust_difficulty(current_value, direction)
|
||||
elif setting_name in ["sound_volume", "music_volume"]:
|
||||
new_value = SettingsManager.adjust_volume(current_value, direction)
|
||||
elif setting_name == "screen_shake":
|
||||
new_value = SettingsManager.toggle_boolean(current_value)
|
||||
else:
|
||||
return
|
||||
|
||||
# Update the setting
|
||||
success, message = self.data_manager.update_profile_settings(
|
||||
self.data_manager.active_profile, setting_name, new_value
|
||||
)
|
||||
|
||||
if not success:
|
||||
self.show_error(message)
|
||||
|
||||
def handle_confirm(self) -> None:
|
||||
"""Handle profile editing confirmation"""
|
||||
if self.selected_index == len(self.settings): # Save
|
||||
self.screen_manager.set_screen("main_menu")
|
||||
elif self.selected_index == len(self.settings) + 1: # Back
|
||||
self.screen_manager.set_screen("main_menu")
|
||||
|
||||
def get_help_text(self) -> str:
|
||||
"""Get help text for edit profile"""
|
||||
return "Left/Right: Adjust • Enter: Save/Back • Escape: Cancel"
|
||||
Reference in New Issue
Block a user