replaced manual write!s

This commit is contained in:
rabite 2019-03-03 00:24:21 +01:00
parent eb5a86b7cd
commit 86250206c3
6 changed files with 62 additions and 19 deletions

View File

@ -44,6 +44,14 @@ pub enum HError {
NoWidgetCoreError(Backtrace), NoWidgetCoreError(Backtrace),
#[fail(display = "No header for widget")] #[fail(display = "No header for widget")]
NoHeaderError, NoHeaderError,
#[fail(display = "You wanted this!")]
Quit
}
impl HError {
pub fn quit() -> HResult<()> {
Err(HError::Quit)
}
} }
pub trait ErrorLog where Self: Sized { pub trait ErrorLog where Self: Sized {

View File

@ -106,23 +106,41 @@ impl FileBrowser {
pub fn new_cored(core: &WidgetCore) -> HResult<FileBrowser> { pub fn new_cored(core: &WidgetCore) -> HResult<FileBrowser> {
let cwd = std::env::current_dir().unwrap(); let cwd = std::env::current_dir().unwrap();
let coords = core.coordinates.clone(); let coords = core.coordinates.clone();
let core_ = core.clone(); let core_m = core.clone();
let core_l = core.clone();
let mut miller = MillerColumns::new(core); let mut miller = MillerColumns::new(core);
miller.set_coordinates(&coords)?; miller.set_coordinates(&coords)?;
let (_, main_coords, _) = miller.calculate_coordinates(); let (left_coords, main_coords, _) = miller.calculate_coordinates();
let main_path = cwd.ancestors()
.take(1)
.map(|path| {
std::path::PathBuf::from(path)
}).last()?;
let left_path = main_path.parent().map(|p| p.to_path_buf());
let main_path: std::path::PathBuf = cwd.ancestors().take(1).map(|path| std::path::PathBuf::from(path)).collect();
let main_widget = WillBeWidget::new(&core, Box::new(move |_| { let main_widget = WillBeWidget::new(&core, Box::new(move |_| {
let mut list = ListView::new(&core_, let mut list = ListView::new(&core_m,
Files::new_from_path(&main_path).unwrap()); Files::new_from_path(&main_path)?);
list.set_coordinates(&main_coords).log(); list.set_coordinates(&main_coords).log();
list.animate_slide_up().log(); list.animate_slide_up().log();
Ok(list) Ok(list)
})); }));
if let Some(left_path) = left_path {
let left_widget = WillBeWidget::new(&core, Box::new(move |_| {
let mut list = ListView::new(&core_l,
Files::new_from_path(&left_path)?);
list.set_coordinates(&left_coords).log();
list.animate_slide_up().log();
Ok(list)
}));
miller.push_widget(left_widget);
}
miller.push_widget(main_widget); miller.push_widget(main_widget);
@ -331,8 +349,7 @@ impl FileBrowser {
let mut file = std::fs::File::create(filepath)?; let mut file = std::fs::File::create(filepath)?;
file.write(output.as_bytes())?; file.write(output.as_bytes())?;
panic!("Quitting!"); HError::quit()
Ok(())
} }
pub fn turbo_cd(&mut self) -> HResult<()> { pub fn turbo_cd(&mut self) -> HResult<()> {
@ -493,4 +510,3 @@ impl PartialEq for FileBrowser {
} }
} }
} }

View File

@ -69,6 +69,7 @@ fn run() -> HResult<()> {
let mut screen = AlternateScreen::from(bufout); let mut screen = AlternateScreen::from(bufout);
let mut _stdout = MouseTerminal::from(stdout().into_raw_mode()?); let mut _stdout = MouseTerminal::from(stdout().into_raw_mode()?);
screen.cursor_hide()?; screen.cursor_hide()?;
screen.clear()?;
screen.flush()?; screen.flush()?;
let core = WidgetCore::new()?; let core = WidgetCore::new()?;

View File

@ -1,10 +1,11 @@
use std::io::Write;
use termion::event::Key; use termion::event::Key;
use std::io::{stdout, Write};
use crate::coordinates::{Coordinates}; use crate::coordinates::{Coordinates};
use crate::widget::{Widget, WidgetCore}; use crate::widget::{Widget, WidgetCore};
use crate::fail::{HResult, HError}; use crate::fail::{HResult, HError, ErrorLog};
use crate::term; use crate::term::ScreenExt;
#[derive(Debug)] #[derive(Debug)]
pub struct MiniBuffer { pub struct MiniBuffer {
@ -45,7 +46,7 @@ impl MiniBuffer {
self.completions.clear(); self.completions.clear();
self.last_completion = None; self.last_completion = None;
write!(stdout(), "{}", termion::cursor::Show)?; self.get_core()?.screen.lock()?.cursor_hide();
self.popup()?; self.popup()?;
@ -360,14 +361,14 @@ impl Widget for MiniBuffer {
fn after_draw(&self) -> HResult<()> { fn after_draw(&self) -> HResult<()> {
let cursor_pos = self.query.len() + let cursor_pos = self.query.len() +
": ".len() + ": ".len() +
self.position + self.position;
1;
let ysize = term::ysize(); let mut screen = self.get_core()?.screen.lock()?;
let ysize = screen.ysize()?;
screen.goto_xy(cursor_pos, ysize).log();
screen.cursor_show().log();
write!(stdout(), "{}", term::goto_xy(cursor_pos as u16, ysize))?;
stdout().flush()?;
Ok(()) Ok(())
} }
} }

View File

@ -21,11 +21,25 @@ pub trait ScreenExt: Write {
self.flush()?; self.flush()?;
Ok(()) Ok(())
} }
fn clear(&mut self) -> HResult<()> {
write!(self, "{}", termion::clear::All)?;
Ok(())
}
fn write_str(&mut self, str: &str) -> HResult<()> { fn write_str(&mut self, str: &str) -> HResult<()> {
write!(self, "{}", str)?; write!(self, "{}", str)?;
self.flush()?; self.flush()?;
Ok(()) Ok(())
} }
fn goto_xy(&mut self, x: usize, y: usize) -> HResult<()> {
let x = x as u16;
let y = y as u16;
write!(self, "{}", goto_xy(x + 1, y + 1))?;
Ok(())
}
fn ysize(&self) -> HResult<usize> {
let (_, ysize) = termion::terminal_size()?;
Ok((ysize - 1) as usize)
}
} }
impl ScreenExt for AlternateScreen<Box<Stdout>> {} impl ScreenExt for AlternateScreen<Box<Stdout>> {}

View File

@ -112,7 +112,7 @@ pub trait Widget {
fn on_event(&mut self, event: Event) -> HResult<()> { fn on_event(&mut self, event: Event) -> HResult<()> {
match event { match event {
Event::Key(Key::Char('q')) => panic!("It's your fault!"), Event::Key(Key::Char('q')) => HError::quit(),
Event::Key(key) => self.on_key(key), Event::Key(key) => self.on_key(key),
Event::Mouse(button) => self.on_mouse(button), Event::Mouse(button) => self.on_mouse(button),
Event::Unsupported(wtf) => self.on_wtf(wtf), Event::Unsupported(wtf) => self.on_wtf(wtf),
@ -287,7 +287,10 @@ pub trait Widget {
for event in rx_internal_event.iter() { for event in rx_internal_event.iter() {
match event { match event {
Events::InputEvent(event) => { Events::InputEvent(event) => {
self.on_event(event).ok(); match self.on_event(event) {
Err(HError::Quit) => { HError::quit()?; },
_ => {}
}
self.draw().ok(); self.draw().ok();
}, },
_ => { _ => {