use std::collections::HashMap;
use super::types::{PanelId, TuiMode};
use crate::tui::theme::ThemeMode;
use crate::tui::views::{DagTab, MissionTab, NovanetTab, ReasoningTab};
#[derive(Debug)]
pub struct UiState {
pub focus: PanelId,
pub mode: TuiMode,
pub scroll: HashMap<PanelId, usize>,
pub theme_mode: ThemeMode,
pub mission_tab: MissionTab,
pub dag_tab: DagTab,
pub novanet_tab: NovanetTab,
pub reasoning_tab: ReasoningTab,
}
impl Default for UiState {
fn default() -> Self {
Self {
focus: PanelId::Progress,
mode: TuiMode::Normal,
scroll: HashMap::new(),
theme_mode: ThemeMode::default(),
mission_tab: MissionTab::default(),
dag_tab: DagTab::default(),
novanet_tab: NovanetTab::default(),
reasoning_tab: ReasoningTab::default(),
}
}
}
impl UiState {
pub fn new() -> Self {
Self::default()
}
pub fn set_focus(&mut self, panel: PanelId) {
self.focus = panel;
}
pub fn set_mode(&mut self, mode: TuiMode) {
self.mode = mode;
}
pub fn scroll_offset(&self, panel: &PanelId) -> usize {
self.scroll.get(panel).copied().unwrap_or(0)
}
pub fn set_scroll(&mut self, panel: PanelId, offset: usize) {
self.scroll.insert(panel, offset);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ui_state_default() {
let ui = UiState::new();
assert_eq!(ui.focus, PanelId::Progress);
assert!(matches!(ui.mode, TuiMode::Normal));
assert!(ui.scroll.is_empty());
}
#[test]
fn test_ui_state_focus() {
let mut ui = UiState::new();
ui.set_focus(PanelId::Agent);
assert_eq!(ui.focus, PanelId::Agent);
}
#[test]
fn test_ui_state_mode() {
let mut ui = UiState::new();
ui.set_mode(TuiMode::Search);
assert!(matches!(ui.mode, TuiMode::Search));
}
#[test]
fn test_ui_state_scroll() {
let mut ui = UiState::new();
assert_eq!(ui.scroll_offset(&PanelId::Dag), 0);
ui.set_scroll(PanelId::Dag, 42);
assert_eq!(ui.scroll_offset(&PanelId::Dag), 42);
}
}