// src/buffer/state/buffer.rs #[derive(Debug, Clone, PartialEq, Eq)] pub enum AppView { Intro, Login, Register, Admin, AddTable, AddLogic, Form(String), Scratch, } impl AppView { /// Returns the display name for the view. /// For Form, pass the current table name to get dynamic naming. pub fn display_name(&self) -> &str { match self { AppView::Intro => "Intro", AppView::Login => "Login", AppView::Register => "Register", AppView::Admin => "Admin_Panel", AppView::AddTable => "Add_Table", AppView::AddLogic => "Add_Logic", AppView::Form(_) => "Form", AppView::Scratch => "*scratch*", } } /// Returns the display name with dynamic context (for Form buffers) pub fn display_name_with_context(&self, current_table_name: Option<&str>) -> String { match self { AppView::Form(path) => { // Derive table name from "profile/table" path let table = path.split('/').nth(1).unwrap_or(""); if !table.is_empty() { table.to_string() } else { current_table_name.unwrap_or("Data Form").to_string() } } _ => self.display_name().to_string(), } } } #[derive(Debug, Clone)] pub struct BufferState { pub history: Vec, pub active_index: usize, } impl Default for BufferState { fn default() -> Self { Self { history: vec![AppView::Intro], active_index: 0, } } } impl BufferState { pub fn update_history(&mut self, view: AppView) { let existing_pos = self.history.iter().position(|v| v == &view); match existing_pos { Some(pos) => self.active_index = pos, None => { self.history.push(view.clone()); self.active_index = self.history.len() - 1; } } } pub fn get_active_view(&self) -> Option<&AppView> { self.history.get(self.active_index) } pub fn close_active_buffer(&mut self) -> bool { if self.history.is_empty() { self.history.push(AppView::Intro); self.active_index = 0; return false; } let current_index = self.active_index; self.history.remove(current_index); if self.history.is_empty() { self.history.push(AppView::Intro); self.active_index = 0; } else if self.active_index >= self.history.len() { self.active_index = self.history.len() - 1; } true } pub fn close_buffer_with_intro_fallback(&mut self, current_table_name: Option<&str>) -> String { let current_view_cloned = self.get_active_view().cloned(); if let Some(AppView::Intro) = current_view_cloned { if self.history.len() == 1 { self.close_active_buffer(); return "Intro buffer reset".to_string(); } } let closed_name = current_view_cloned .as_ref() .map(|v| v.display_name_with_context(current_table_name)) .unwrap_or_else(|| "Unknown".to_string()); if self.close_active_buffer() { if self.history.len() == 1 && matches!(self.history.get(0), Some(AppView::Intro)) { format!("Closed '{}' - returned to Intro", closed_name) } else { format!("Closed '{}'", closed_name) } } else { format!("Buffer '{}' could not be closed", closed_name) } } }