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.
142 lines
4.7 KiB
142 lines
4.7 KiB
""" |
|
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
|
|
|