101 lines
3.1 KiB
Rust
101 lines
3.1 KiB
Rust
// src/modes/handlers/mode_manager.rs
|
|
use crate::state::app::state::AppState;
|
|
use crate::modes::handlers::event::EventHandler;
|
|
use crate::state::pages::add_logic::AddLogicFocus;
|
|
use crate::state::app::highlight::HighlightState;
|
|
use crate::state::pages::admin::AdminState;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum AppMode {
|
|
General, // For intro and admin screens
|
|
ReadOnly, // Canvas read-only mode
|
|
Edit, // Canvas edit mode
|
|
Highlight, // Cnavas highlight/visual 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,
|
|
admin_state: &AdminState,
|
|
) -> AppMode {
|
|
if event_handler.navigation_state.active {
|
|
return AppMode::General;
|
|
}
|
|
|
|
if event_handler.command_mode {
|
|
return AppMode::Command;
|
|
}
|
|
|
|
if !matches!(event_handler.highlight_state, HighlightState::Off) {
|
|
return AppMode::Highlight;
|
|
}
|
|
|
|
let is_canvas_view = app_state.ui.show_login
|
|
|| app_state.ui.show_register
|
|
|| app_state.ui.show_form
|
|
|| app_state.ui.show_add_table
|
|
|| app_state.ui.show_add_logic;
|
|
|
|
if app_state.ui.show_add_logic {
|
|
// Specific logic for AddLogic view
|
|
match admin_state.add_logic_state.current_focus {
|
|
AddLogicFocus::InputLogicName
|
|
| AddLogicFocus::InputTargetColumn
|
|
| AddLogicFocus::InputDescription => {
|
|
// These are canvas inputs
|
|
if event_handler.is_edit_mode {
|
|
AppMode::Edit
|
|
} else {
|
|
AppMode::ReadOnly
|
|
}
|
|
}
|
|
_ => AppMode::General,
|
|
}
|
|
} else if app_state.ui.show_add_table {
|
|
if app_state.ui.focus_outside_canvas {
|
|
AppMode::General
|
|
} else {
|
|
if event_handler.is_edit_mode {
|
|
AppMode::Edit
|
|
} else {
|
|
AppMode::ReadOnly
|
|
}
|
|
}
|
|
} else if is_canvas_view {
|
|
if app_state.ui.focus_outside_canvas {
|
|
AppMode::General
|
|
} else {
|
|
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)
|
|
}
|
|
|
|
pub fn can_enter_edit_mode(current_mode: AppMode) -> bool {
|
|
matches!(current_mode, AppMode::ReadOnly)
|
|
}
|
|
|
|
pub fn can_enter_read_only_mode(current_mode: AppMode) -> bool {
|
|
matches!(current_mode, AppMode::Edit | AppMode::Command | AppMode::Highlight)
|
|
}
|
|
|
|
pub fn can_enter_highlight_mode(current_mode: AppMode) -> bool {
|
|
matches!(current_mode, AppMode::ReadOnly)
|
|
}
|
|
}
|