52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
// 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)
|
|
}
|
|
}
|