// src/modes/handlers/mode_manager.rs use crate::state::state::AppState; use crate::modes::handlers::event::EventHandler; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum AppMode { General, // For intro and admin screens ReadOnly, // Canvas read-only mode Edit, // Canvas edit mode Command, // Command mode overlay } pub struct ModeManager; impl ModeManager { // Determine current mode based on app state pub fn derive_mode(app_state: &AppState, event_handler: &EventHandler) -> AppMode { if event_handler.command_mode { return AppMode::Command; } if app_state.ui.show_login { // NEW: Check auth visibility if event_handler.is_edit_mode { AppMode::Edit } else { AppMode::ReadOnly } } else if app_state.ui.show_form { if event_handler.is_edit_mode { AppMode::Edit } else { AppMode::ReadOnly } } else { AppMode::General } } // Mode transition rules pub fn can_enter_command_mode(current_mode: AppMode) -> bool { !matches!(current_mode, AppMode::Edit) // Can't enter from Edit mode } pub fn can_enter_edit_mode(current_mode: AppMode) -> bool { matches!(current_mode, AppMode::ReadOnly) // Only from ReadOnly } pub fn can_enter_read_only_mode(current_mode: AppMode) -> bool { matches!(current_mode, AppMode::Edit | AppMode::Command) } }