rush_sync_server/ui/
terminal.rs

1use crate::core::constants::APP_TITLE;
2use crate::core::prelude::*;
3use crossterm::{
4    cursor, execute,
5    style::ResetColor,
6    terminal::{
7        self, disable_raw_mode, enable_raw_mode, ClearType, EnterAlternateScreen,
8        LeaveAlternateScreen,
9    },
10};
11use std::io::Stdout;
12
13pub struct TerminalManager {
14    stdout: Stdout,
15}
16
17impl TerminalManager {
18    pub async fn new() -> Result<Self> {
19        let stdout = io::stdout();
20        Ok(Self { stdout })
21    }
22
23    pub async fn setup(&mut self) -> Result<()> {
24        enable_raw_mode()?;
25
26        execute!(
27            self.stdout,
28            terminal::Clear(ClearType::All),
29            EnterAlternateScreen,
30            terminal::DisableLineWrap,
31            terminal::SetTitle(APP_TITLE),
32            cursor::Hide
33        )?;
34
35        Ok(())
36    }
37
38    pub async fn cleanup(&mut self) -> Result<()> {
39        // Erst Terminal-Modi zurücksetzen
40        disable_raw_mode()?;
41
42        // Dann alle cleanup operations in der richtigen Reihenfolge
43        execute!(
44            self.stdout,
45            terminal::Clear(ClearType::All), // NEU: Clear vor Leave
46            LeaveAlternateScreen,
47            terminal::EnableLineWrap,
48            cursor::Show,
49            ResetColor,
50            cursor::MoveTo(0, 0)
51        )?;
52
53        // Buffer explizit leeren
54        self.stdout.flush()?;
55
56        Ok(())
57    }
58}