feat: enhance workspace management and history tracking in application state

This commit is contained in:
asepharyana
2026-07-12 18:09:03 +07:00
parent a59feb23c4
commit 8a11a469f9
12 changed files with 112 additions and 20 deletions
+22 -5
View File
@@ -11,6 +11,7 @@ use std::sync::Mutex;
use anyhow::Result;
use crossterm::execute;
use crossterm::terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen};
use crossterm::event::{EnableMouseCapture, DisableMouseCapture};
use ratatui::backend::CrosstermBackend;
use ratatui::Terminal;
@@ -116,7 +117,7 @@ fn run_single_process() -> Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
terminal.clear()?;
@@ -124,7 +125,7 @@ fn run_single_process() -> Result<()> {
let run_result = run_loop(&mut state, &mut terminal);
let mut restore_stdout = io::stdout();
let _ = execute!(restore_stdout, LeaveAlternateScreen);
let _ = execute!(restore_stdout, LeaveAlternateScreen, DisableMouseCapture);
let _ = disable_raw_mode();
if let Err(e) = run_result {
@@ -413,6 +414,14 @@ fn run_daemon() -> Result<()> {
apply_action(&mut state, Action::Resize(w, h));
apply_action(&mut state, Action::Tick);
}
ClientRequest::ScrollUp => {
apply_action(&mut state, Action::ScrollUp);
apply_action(&mut state, Action::Tick);
}
ClientRequest::ScrollDown => {
apply_action(&mut state, Action::ScrollDown);
apply_action(&mut state, Action::Tick);
}
ClientRequest::Close => {
running = false;
}
@@ -449,7 +458,7 @@ fn run_daemon() -> Result<()> {
/// through the daemon, since the daemon has no notion of "this client
/// wants to leave" beyond the explicit `Close` request.
fn run_attach(session_id: &str) -> Result<()> {
use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers};
use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MouseEventKind};
use ipc::protocol::ClientRequest;
let store = model::store::Store::new();
@@ -460,7 +469,7 @@ fn run_attach(session_id: &str) -> Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
terminal.clear()?;
@@ -512,6 +521,13 @@ fn run_attach(session_id: &str) -> Result<()> {
Event::Resize(w, h) => {
client.send(&ClientRequest::Resize(w, h))?;
}
Event::Mouse(mouse_event) => {
if mouse_event.kind == MouseEventKind::ScrollUp {
client.send(&ClientRequest::ScrollUp)?;
} else if mouse_event.kind == MouseEventKind::ScrollDown {
client.send(&ClientRequest::ScrollDown)?;
}
}
_ => {}
}
} else {
@@ -544,7 +560,7 @@ fn run_attach(session_id: &str) -> Result<()> {
})?;
}
let _ = execute!(io::stdout(), LeaveAlternateScreen);
let _ = execute!(io::stdout(), LeaveAlternateScreen, DisableMouseCapture);
let _ = disable_raw_mode();
let _ = client_state.settings.save();
@@ -569,6 +585,7 @@ fn run_loop(
if let Err(ref _e) = result {
let _ = terminal.clear();
let _ = execute!(io::stdout(), DisableMouseCapture);
let _ = disable_raw_mode();
let _ = execute!(io::stdout(), LeaveAlternateScreen);
}