use super::{AlternateScreen,RawScreen};
use TerminalOutput;
use std::io::Write;
use std::io::Result;
use std::sync::Arc;
pub struct Screen
{
buffer: Vec<u8>,
pub stdout: Arc<TerminalOutput>,
drop: bool,
}
impl Screen
{
pub fn new(raw_mode: bool) -> Screen
{
if raw_mode
{
let screen = Screen { stdout: Arc::new(TerminalOutput::new(true)), buffer: Vec::new(), drop: true };
RawScreen::into_raw_mode().unwrap();
return screen;
}
return Screen::default();
}
pub fn enable_alternate_modes(&self, raw_mode: bool) -> Result<AlternateScreen> {
let stdout = TerminalOutput::new(raw_mode);
let alternate_screen = AlternateScreen::to_alternate_screen(stdout, raw_mode)?;
return Ok(alternate_screen);
}
pub fn write_buf(&mut self, buf: &[u8]) -> Result<usize> {
self.buffer.write(buf);
Ok(buf.len())
}
pub fn flush_buf(&mut self) -> Result<()> {
self.stdout.write_buf(&self.buffer);
self.stdout.flush()
}
pub fn disable_drop(&mut self)
{
self.drop = false;
}
}
impl From<TerminalOutput> for Screen
{
fn from(stdout: TerminalOutput) -> Self {
return Screen { stdout: Arc::new(stdout), buffer: Vec::new(), drop: true};
}
}
impl From<Arc<TerminalOutput>> for Screen
{
fn from(stdout: Arc<TerminalOutput>) -> Self {
return Screen { stdout: stdout, buffer: Vec::new(), drop: true};
}
}
impl Default for Screen
{
fn default() -> Self {
return Screen { stdout: Arc::new(TerminalOutput::new(false)), buffer: Vec::new(), drop: true};
}
}
impl Drop for Screen
{
fn drop(&mut self) {
if self.stdout.is_in_raw_mode && self.drop
{
RawScreen::disable_raw_modes();
}
}
}
impl Write for Screen
{
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.stdout.write_buf(buf)
}
fn flush(&mut self) -> Result<()> {
self.stdout.flush()
}
}