Files
komp_ac/client/src/tui/terminal/core.rs
2025-03-21 12:05:18 +01:00

66 lines
1.7 KiB
Rust

// src/tui/terminal/core.rs
use crossterm::{
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
cursor::{SetCursorStyle, EnableBlinking, Show, MoveTo},
event::Event,
};
use ratatui::{backend::CrosstermBackend, Terminal};
use std::io::{self, stdout, Write};
pub struct TerminalCore {
terminal: Terminal<CrosstermBackend<io::Stdout>>,
}
impl TerminalCore {
pub fn new() -> Result<Self, Box<dyn std::error::Error>> {
enable_raw_mode()?;
let mut stdout = stdout();
execute!(
stdout,
EnterAlternateScreen,
SetCursorStyle::SteadyBlock,
EnableBlinking
)?;
let backend = CrosstermBackend::new(stdout);
let terminal = Terminal::new(backend)?;
Ok(Self { terminal })
}
pub fn draw<F>(&mut self, f: F) -> Result<(), Box<dyn std::error::Error>>
where
F: FnOnce(&mut ratatui::Frame),
{
self.terminal.draw(f)?;
Ok(())
}
pub fn cleanup(&mut self) -> Result<(), Box<dyn std::error::Error>> {
let mut stdout = stdout();
execute!(stdout, Show)?;
execute!(stdout, SetCursorStyle::DefaultUserShape)?;
execute!(stdout, LeaveAlternateScreen)?;
disable_raw_mode()?;
stdout.flush()?;
execute!(
stdout,
crossterm::terminal::Clear(crossterm::terminal::ClearType::All),
MoveTo(0, 0)
)?;
Ok(())
}
pub fn set_cursor_style(
&mut self,
style: SetCursorStyle,
) -> Result<(), Box<dyn std::error::Error>> {
execute!(
self.terminal.backend_mut(),
style,
EnableBlinking,
)?;
Ok(())
}
}