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.
141 lines
5.5 KiB
141 lines
5.5 KiB
""" |
|
Create Profile Screen |
|
Virtual keyboard interface for creating new user profiles |
|
""" |
|
|
|
from .base_screen import BaseScreen |
|
|
|
|
|
class CreateProfileScreen(BaseScreen): |
|
"""Profile creation screen with virtual keyboard""" |
|
|
|
def __init__(self, data_manager, ui_renderer, screen_manager): |
|
super().__init__(data_manager, ui_renderer, screen_manager) |
|
|
|
# Virtual keyboard layout |
|
self.virtual_keyboard = [ |
|
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], |
|
['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'], |
|
['U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3'], |
|
['4', '5', '6', '7', '8', '9', ' ', '.', '-', '_'], |
|
['<DEL', 'SPACE', 'DONE', 'CANCEL'] |
|
] |
|
|
|
# Screen state |
|
self.input_text = "" |
|
self.input_active = False |
|
self.vk_cursor_x = 0 |
|
self.vk_cursor_y = 0 |
|
|
|
def render(self) -> None: |
|
"""Render profile creation screen""" |
|
self.ui_renderer.draw_header("Create Profile") |
|
|
|
# Input field |
|
placeholder = "Profile Name" if not self.input_text else "" |
|
self.ui_renderer.draw_input_field(self.input_text, 120, 90, 400, 30, |
|
self.input_active, placeholder) |
|
|
|
if self.input_active: |
|
# Virtual keyboard |
|
self.ui_renderer.draw_virtual_keyboard(self.virtual_keyboard, |
|
self.vk_cursor_x, self.vk_cursor_y) |
|
help_text = "Arrows: Navigate • Enter: Select • Escape: Cancel" |
|
else: |
|
self.ui_renderer.draw_text("Press Enter to start typing", 320, 150, |
|
'yellow', 'medium', center=True) |
|
self.ui_renderer.draw_button("← Back", 270, 200, 100, 30, True) |
|
help_text = "Enter: Start Input • Escape: Back" |
|
|
|
self.ui_renderer.draw_footer_help(help_text) |
|
|
|
def handle_input(self, action: str) -> bool: |
|
"""Handle create profile input""" |
|
if self.input_active: |
|
# Virtual keyboard navigation |
|
if action == 'up': |
|
self.vk_cursor_y = max(0, self.vk_cursor_y - 1) |
|
max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 |
|
self.vk_cursor_x = min(self.vk_cursor_x, max_x) |
|
return True |
|
elif action == 'down': |
|
max_y = len(self.virtual_keyboard) - 1 |
|
self.vk_cursor_y = min(max_y, self.vk_cursor_y + 1) |
|
max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 |
|
self.vk_cursor_x = min(self.vk_cursor_x, max_x) |
|
return True |
|
elif action == 'left': |
|
self.vk_cursor_x = max(0, self.vk_cursor_x - 1) |
|
return True |
|
elif action == 'right': |
|
max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 |
|
self.vk_cursor_x = min(max_x, self.vk_cursor_x + 1) |
|
return True |
|
elif action == 'confirm': |
|
self.handle_virtual_keyboard_input() |
|
return True |
|
elif action == 'back': |
|
self.input_active = False |
|
return True |
|
else: |
|
# Initial screen navigation |
|
if action == 'confirm': |
|
self.input_active = True |
|
self.vk_cursor_x = 0 |
|
self.vk_cursor_y = 0 |
|
return True |
|
elif action == 'back': |
|
self.handle_back() |
|
return True |
|
elif action == 'delete' and self.input_text: |
|
self.input_text = self.input_text[:-1] |
|
return True |
|
|
|
return False |
|
|
|
def handle_virtual_keyboard_input(self) -> None: |
|
"""Handle virtual keyboard character selection""" |
|
if (self.vk_cursor_y >= len(self.virtual_keyboard) or |
|
self.vk_cursor_x >= len(self.virtual_keyboard[self.vk_cursor_y])): |
|
return |
|
|
|
selected_char = self.virtual_keyboard[self.vk_cursor_y][self.vk_cursor_x] |
|
|
|
if selected_char == '<DEL': |
|
if self.input_text: |
|
self.input_text = self.input_text[:-1] |
|
elif selected_char == 'SPACE': |
|
if len(self.input_text) < 20: |
|
self.input_text += ' ' |
|
elif selected_char == 'DONE': |
|
if self.input_text.strip(): |
|
success, message = self.data_manager.create_profile(self.input_text) |
|
if success: |
|
self.screen_manager.set_screen("main_menu") |
|
self.input_active = False |
|
self.input_text = "" |
|
else: |
|
self.show_error(message) |
|
else: |
|
self.show_error("Profile name cannot be empty!") |
|
elif selected_char == 'CANCEL': |
|
self.input_text = "" |
|
self.input_active = False |
|
else: |
|
if len(self.input_text) < 20: |
|
self.input_text += selected_char |
|
|
|
def reset_state(self) -> None: |
|
"""Reset screen state when entering""" |
|
super().reset_state() |
|
self.input_text = "" |
|
self.input_active = False |
|
self.vk_cursor_x = 0 |
|
self.vk_cursor_y = 0 |
|
|
|
def get_help_text(self) -> str: |
|
"""Get help text for create profile""" |
|
if self.input_active: |
|
return "Arrows: Navigate • Enter: Select • Escape: Cancel" |
|
else: |
|
return "Enter: Start Input • Escape: Back"
|
|
|