From 97ff7011e864628a43932bd8876a763a1d3617ed Mon Sep 17 00:00:00 2001 From: fromost Date: Mon, 13 Oct 2025 23:56:07 +0800 Subject: [PATCH] Refactor popup --- src/app.rs | 105 +++++++---------------- src/widgets/components/mod.rs | 1 + src/widgets/{ => components}/textarea.rs | 11 ++- src/widgets/mod.rs | 3 +- src/widgets/popups/folder.rs | 46 ++++++++++ src/widgets/popups/mod.rs | 1 + 6 files changed, 87 insertions(+), 80 deletions(-) create mode 100644 src/widgets/components/mod.rs rename src/widgets/{ => components}/textarea.rs (84%) create mode 100644 src/widgets/popups/folder.rs create mode 100644 src/widgets/popups/mod.rs diff --git a/src/app.rs b/src/app.rs index ef73eec..d4f1b32 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,7 +1,6 @@ use std::any::Any; -use std::collections::HashMap; use crate::event::{AppEvent, EventHandler}; -use ratatui::widgets::{Block, Borders, Paragraph}; +use ratatui::widgets::{Block, Borders, Paragraph, StatefulWidget}; use ratatui::{DefaultTerminal, Frame}; use std::time::Duration; use color_eyre::Result; @@ -11,32 +10,29 @@ use crossterm::event::Event as CrosstermEvent; use diesel::{Connection, SqliteConnection}; use ratatui::buffer::Buffer; use ratatui::layout::{Constraint, Direction, Layout, Rect}; -use ratatui::prelude::{StatefulWidget, Widget}; +use ratatui::prelude::{Widget}; use ratatui::style::{Color, Style}; use ratatui::text::{Line, Span, Text}; use crate::config::types::ApplicationConfig; use crate::constants::{APP_CONFIG_DIR, APP_CONIFG_FILE_PATH, APP_DATA_DIR}; -use crate::widgets::textarea::TextArea; +use crate::widgets::popups::folder::AddFolderPopup; -enum AppState { +enum AppStatus { Running, Exiting, Input } -enum AppPopUp { - AddFolder, - None -} - pub(crate) struct App { - state: AppState, - popup: AppPopUp, + status: AppStatus, events: EventHandler, db_connection: SqliteConnection, app_config: ApplicationConfig, - stateful_widgets: HashMap>, - + state: AppState, +} + +struct AppState { + popup: Option>, } impl App { @@ -46,13 +42,13 @@ impl App { else { ApplicationConfig::new() }; Self::initialize_folders(); let db_conn = Self::establish_db_connection(app_conf.clone()); + let state = AppState { popup: None }; Self { - state: AppState::Running, - popup: AppPopUp::None, + status: AppStatus::Running, events: EventHandler::new(Duration::from_millis(app_conf.basic_config.tick_rate)), db_connection: db_conn, app_config: app_conf, - stateful_widgets: HashMap::new() + state } } @@ -76,20 +72,16 @@ impl App { terminal.draw(|frame| self.draw(frame))?; let event = self.events.next().await?; self.update(event)?; - if matches!(self.state, AppState::Exiting) { + if matches!(self.status, AppStatus::Exiting) { break Ok(()) } } } fn update(&mut self, event: AppEvent) -> Result<()> { - if matches!(self.state, AppState::Input) && let AppEvent::Raw(raw) = &event { - self.stateful_widgets.iter_mut() - .map(|(_, widget)| widget.downcast_mut::