143 lines
4.7 KiB
Python
143 lines
4.7 KiB
Python
"""
|
|
Screen Manager Module
|
|
Manages individual screen modules and navigation between them
|
|
"""
|
|
|
|
from typing import Dict, Optional
|
|
from screens import (
|
|
BaseScreen,
|
|
MainMenuScreen,
|
|
ProfileListScreen,
|
|
CreateProfileScreen,
|
|
EditProfileScreen,
|
|
LeaderboardScreen,
|
|
ProfileStatsScreen
|
|
)
|
|
|
|
|
|
class ModularScreenManager:
|
|
"""Manages individual screen modules and navigation"""
|
|
|
|
def __init__(self, data_manager, ui_renderer):
|
|
"""
|
|
Initialize screen manager with all screen modules
|
|
|
|
Args:
|
|
data_manager: ProfileDataManager instance
|
|
ui_renderer: UIRenderer instance
|
|
"""
|
|
self.data_manager = data_manager
|
|
self.ui_renderer = ui_renderer
|
|
|
|
# Current screen state
|
|
self.current_screen_name = "main_menu"
|
|
self.screens: Dict[str, BaseScreen] = {}
|
|
|
|
# Initialize all screen modules
|
|
self._initialize_screens()
|
|
|
|
# Error state
|
|
self.show_error = False
|
|
self.error_message = ""
|
|
self.error_timer = 0
|
|
|
|
def _initialize_screens(self) -> None:
|
|
"""Initialize all screen module instances"""
|
|
self.screens = {
|
|
"main_menu": MainMenuScreen(self.data_manager, self.ui_renderer, self),
|
|
"profile_list": ProfileListScreen(self.data_manager, self.ui_renderer, self),
|
|
"create_profile": CreateProfileScreen(self.data_manager, self.ui_renderer, self),
|
|
"edit_profile": EditProfileScreen(self.data_manager, self.ui_renderer, self),
|
|
"leaderboard": LeaderboardScreen(self.data_manager, self.ui_renderer, self),
|
|
"profile_stats": ProfileStatsScreen(self.data_manager, self.ui_renderer, self)
|
|
}
|
|
|
|
def set_screen(self, screen_name: str) -> None:
|
|
"""
|
|
Switch to a different screen
|
|
|
|
Args:
|
|
screen_name: Name of the screen to switch to
|
|
"""
|
|
if screen_name in self.screens:
|
|
self.current_screen_name = screen_name
|
|
# Reset state when entering new screen
|
|
self.screens[screen_name].reset_state()
|
|
else:
|
|
print(f"Warning: Unknown screen '{screen_name}'")
|
|
|
|
def get_current_screen(self) -> Optional[BaseScreen]:
|
|
"""Get the current active screen module"""
|
|
return self.screens.get(self.current_screen_name)
|
|
|
|
def handle_input(self, action: str) -> bool:
|
|
"""
|
|
Handle input by delegating to current screen
|
|
|
|
Args:
|
|
action: Input action string
|
|
|
|
Returns:
|
|
bool: True if input was handled and app should continue, False to exit
|
|
"""
|
|
# Dismiss error dialog on any input
|
|
if self.show_error:
|
|
self.show_error = False
|
|
return True
|
|
|
|
current_screen = self.get_current_screen()
|
|
if current_screen:
|
|
result = current_screen.handle_input(action)
|
|
|
|
# Handle special case for main menu exit
|
|
if self.current_screen_name == "main_menu" and action == 'back':
|
|
return False # Exit application
|
|
|
|
return result if result is not None else True
|
|
|
|
return True
|
|
|
|
def render(self) -> None:
|
|
"""Render current screen and any overlays"""
|
|
current_screen = self.get_current_screen()
|
|
if current_screen:
|
|
current_screen.render()
|
|
|
|
# Render error dialog if active
|
|
if self.show_error:
|
|
import time
|
|
self.ui_renderer.draw_error_dialog(self.error_message)
|
|
# Auto-dismiss after timer
|
|
if time.time() > self.error_timer:
|
|
self.show_error = False
|
|
|
|
def show_error_dialog(self, message: str) -> None:
|
|
"""
|
|
Show an error dialog overlay
|
|
|
|
Args:
|
|
message: Error message to display
|
|
"""
|
|
import time
|
|
self.show_error = True
|
|
self.error_message = message
|
|
self.error_timer = time.time() + 3.0
|
|
|
|
@property
|
|
def current_screen(self) -> str:
|
|
"""Get current screen name (for compatibility)"""
|
|
return self.current_screen_name
|
|
|
|
@property
|
|
def selected_index(self) -> int:
|
|
"""Get selected index from current screen (for compatibility)"""
|
|
current_screen = self.get_current_screen()
|
|
return current_screen.selected_index if current_screen else 0
|
|
|
|
@selected_index.setter
|
|
def selected_index(self, value: int) -> None:
|
|
"""Set selected index on current screen (for compatibility)"""
|
|
current_screen = self.get_current_screen()
|
|
if current_screen:
|
|
current_screen.selected_index = value
|