diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-31 02:03:45 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-31 02:03:45 +0300 |
| commit | ea57a65321edfc44277555de73449bce8b5d58fa (patch) | |
| tree | 30c403c00ecbc3e1cfcade5b24fa0094ebc14d01 /src/workspace.rs | |
| parent | 41a0269de8594a66f010db48b569567f2aa9c3f2 (diff) | |
fix: make app rendering event-driven
Diffstat (limited to 'src/workspace.rs')
| -rw-r--r-- | src/workspace.rs | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/workspace.rs b/src/workspace.rs index 68b4e624..63e98912 100644 --- a/src/workspace.rs +++ b/src/workspace.rs @@ -1,8 +1,10 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; +use std::sync::atomic::AtomicBool; +use std::sync::Arc; use ratatui::layout::Direction; -use tokio::sync::mpsc; +use tokio::sync::{mpsc, Notify}; use tracing::info; use crate::detect::{Agent, AgentState}; @@ -29,6 +31,8 @@ pub struct Workspace { pub runtimes: HashMap<PaneId, PaneRuntime>, pub zoomed: bool, pub events: mpsc::Sender<AppEvent>, + pub(crate) render_notify: Arc<Notify>, + pub(crate) render_dirty: Arc<AtomicBool>, } impl Workspace { @@ -37,9 +41,19 @@ impl Workspace { rows: u16, cols: u16, events: mpsc::Sender<AppEvent>, + render_notify: Arc<Notify>, + render_dirty: Arc<AtomicBool>, ) -> std::io::Result<Self> { let (layout, root_id) = TileLayout::new(); - let runtime = PaneRuntime::spawn(root_id, rows, cols, initial_cwd, events.clone())?; + let runtime = PaneRuntime::spawn( + root_id, + rows, + cols, + initial_cwd, + events.clone(), + render_notify.clone(), + render_dirty.clone(), + )?; let mut panes = HashMap::new(); panes.insert(root_id, PaneState::new()); @@ -60,6 +74,8 @@ impl Workspace { runtimes, zoomed: false, events, + render_notify, + render_dirty, }) } @@ -74,7 +90,15 @@ impl Workspace { let new_id = self.layout.split_focused(direction); let actual_cwd = cwd.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| "/".into())); - let runtime = PaneRuntime::spawn(new_id, rows, cols, actual_cwd, self.events.clone())?; + let runtime = PaneRuntime::spawn( + new_id, + rows, + cols, + actual_cwd, + self.events.clone(), + self.render_notify.clone(), + self.render_dirty.clone(), + )?; self.panes.insert(new_id, PaneState::new()); self.public_pane_numbers .insert(new_id, self.next_public_pane_number); @@ -170,6 +194,12 @@ impl Workspace { .unwrap_or((AgentState::Unknown, true)) } + pub fn has_working_pane(&self) -> bool { + self.panes + .values() + .any(|pane| pane.state == AgentState::Working) + } + /// Per-pane (state, seen) in BSP tree order (left-to-right, top-to-bottom). #[cfg(test)] pub fn pane_states(&self) -> Vec<(AgentState, bool)> { @@ -346,6 +376,8 @@ impl Workspace { pub fn test_new(name: &str) -> Self { let (events, _) = mpsc::channel(64); let (layout, root_id) = TileLayout::new(); + let render_notify = Arc::new(Notify::new()); + let render_dirty = Arc::new(AtomicBool::new(false)); let mut panes = HashMap::new(); panes.insert(root_id, PaneState::new()); let mut public_pane_numbers = HashMap::new(); @@ -361,6 +393,8 @@ impl Workspace { runtimes: HashMap::new(), zoomed: false, events, + render_notify, + render_dirty, } } |
