From fc2d6d268c6059981422bbe6879f887a5856a7e5 Mon Sep 17 00:00:00 2001 From: rabite Date: Wed, 20 Mar 2019 21:56:59 +0100 Subject: [PATCH] hide left/right columns --- src/fail.rs | 16 +++++++++++++++- src/file_browser.rs | 26 ++++++-------------------- src/hbox.rs | 27 +++++++++++++++++++++++++-- src/preview.rs | 20 +++++++++++++++++++- 4 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/fail.rs b/src/fail.rs index 580aad1..6cf4afe 100644 --- a/src/fail.rs +++ b/src/fail.rs @@ -29,6 +29,8 @@ pub enum HError { PreviewFailed{file: String, backtrace: Backtrace}, #[fail(display = "StalePreviewer for file: {}", file)] StalePreviewError{file: String}, + #[fail(display = "Accessed stale value")] + StaleError(Backtrace), #[fail(display = "Failed: {}", error)] Error{#[cause] error: failure::Error , backtrace: Backtrace}, #[fail(display = "Was None!")] @@ -120,6 +122,10 @@ impl HError { pub fn terminal_resized() -> HResult { Err(HError::TerminalResizedError) } + + pub fn stale() -> HResult { + Err(HError::StaleError(Backtrace::new())) + } } @@ -138,7 +144,8 @@ pub fn put_log>(log: L) -> HResult<()> { } pub trait ErrorLog where Self: Sized { - fn log(self) {} + fn log(self); + fn log_and(self) -> Self; } impl ErrorLog for HResult { @@ -148,6 +155,13 @@ impl ErrorLog for HResult { put_log(&err).ok(); } } + + fn log_and(self) -> Self { + if let Err(err) = &self { + put_log(err).ok(); + } + self + } } diff --git a/src/file_browser.rs b/src/file_browser.rs index ba64116..2effb3d 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -11,7 +11,6 @@ use std::ffi::{OsString, OsStr}; use crate::files::{File, Files, PathBufExt, OsStrTools}; use crate::listview::ListView; -//use crate::miller_columns::MillerColumns; use crate::hbox::HBox; use crate::widget::Widget; use crate::dirty::Dirtyable; @@ -598,17 +597,8 @@ impl FileBrowser { } } - pub fn toggle_colums(&mut self) -> HResult<()> { - self.show_columns = !self.show_columns; - - if !self.show_columns { - self.columns.set_ratios(vec![1,99,1]); - self.left_widget_mut()?.set_stale().log(); - self.preview_widget_mut()?.set_stale().log() - } - - self.core.set_dirty(); - self.refresh() + pub fn toggle_colums(&mut self) { + self.columns.toggle_zoom().log(); } pub fn quit_with_dir(&self) -> HResult<()> { @@ -842,18 +832,13 @@ impl Widget for FileBrowser { self.save_selection().log(); self.set_cwd().log(); self.update_watches().log(); - self.update_preview().log(); + if !self.columns.zoom_active { self.update_preview().log(); } self.columns.refresh().log(); Ok(()) } fn get_drawlist(&self) -> HResult { - return self.columns.get_drawlist(); - let left = self.left_widget()?.get_drawlist()?; - let main = self.main_widget()?.get_drawlist()?; - let prev = self.preview_widget()?.get_drawlist()?; - - Ok(left + &main + &prev) + self.columns.get_drawlist() } fn on_key(&mut self, key: Key) -> HResult<()> { @@ -868,9 +853,10 @@ impl Widget for FileBrowser { Key::Char('w') => { self.proc_view.lock()?.popup()?; }, Key::Char('l') => self.log_view.lock()?.popup()?, Key::Char('z') => self.run_subshell()?, + Key::Char('c') => self.toggle_colums(), _ => { self.main_widget_mut()?.on_key(key)?; }, } - self.update_preview()?; + if !self.columns.zoom_active { self.update_preview().log(); } Ok(()) } } diff --git a/src/hbox.rs b/src/hbox.rs index a782911..15644f5 100644 --- a/src/hbox.rs +++ b/src/hbox.rs @@ -9,6 +9,7 @@ pub struct HBox { pub core: WidgetCore, pub widgets: Vec, pub ratios: Option>, + pub zoom_active: bool, pub active: Option, } @@ -18,6 +19,7 @@ impl HBox where T: Widget + PartialEq { HBox { core: core.clone(), widgets: vec![], ratios: None, + zoom_active: false, active: None } } @@ -27,6 +29,12 @@ impl HBox where T: Widget + PartialEq { let len = self.widgets.len(); if len == 0 { return Ok(()) } + if self.zoom_active { + let coords = self.core.coordinates.clone(); + self.active_widget_mut()?.set_coordinates(&coords).log(); + return Ok(()); + } + let coords: Vec = self.calculate_coordinates()?; @@ -50,6 +58,12 @@ impl HBox where T: Widget + PartialEq { self.widgets.insert(0, widget); } + pub fn toggle_zoom(&mut self) -> HResult<()> { + self.clear().log(); + self.zoom_active = !self.zoom_active; + self.resize_children() + } + pub fn set_ratios(&mut self, ratios: Vec) { self.ratios = Some(ratios); } @@ -140,6 +154,11 @@ impl Widget for HBox where T: Widget + PartialEq { } fn refresh(&mut self) -> HResult<()> { + if self.zoom_active { + self.active_widget_mut()?.refresh().log(); + return Ok(()); + } + self.resize_children().log(); for child in &mut self.widgets { child.refresh().log(); @@ -148,13 +167,17 @@ impl Widget for HBox where T: Widget + PartialEq { } fn get_drawlist(&self) -> HResult { + if self.zoom_active { + return self.active_widget()?.get_drawlist(); + } + Ok(self.widgets.iter().map(|child| { - child.get_drawlist().unwrap() + child.get_drawlist().log_and().unwrap_or_else(|_| String::new()) }).collect()) } fn on_event(&mut self, event: Event) -> HResult<()> { - self.widgets.last_mut()?.on_event(event)?; + self.active_widget_mut()?.on_event(event)?; Ok(()) } } diff --git a/src/preview.rs b/src/preview.rs index 03e2805..ca99f83 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -83,6 +83,10 @@ impl WillBe where { Ok(()) } + pub fn is_stale(&self) -> HResult { + is_stale(&self.stale) + } + pub fn take(&mut self) -> HResult { self.check()?; Ok(self.thing.lock()?.take()?) @@ -154,19 +158,27 @@ impl WillBeWidget { self.willbe = willbe; Ok(()) } + pub fn set_stale(&mut self) -> HResult<()> { self.willbe.set_stale() } + + pub fn is_stale(&self) -> HResult { + self.willbe.is_stale() + } + pub fn widget(&self) -> HResult>>> { self.willbe.check()?; Ok(self.willbe.thing.clone()) } + pub fn ready(&self) -> bool { match self.willbe.check() { Ok(_) => true, _ => false } } + pub fn take(&mut self) -> HResult { self.willbe.take() } @@ -223,9 +235,11 @@ impl Widget for WillBeWidget { let pos = crate::term::goto_xy(xpos, ypos); return Ok(clear + &pos + "...") } - if is_stale(&self.willbe.stale)? { + + if self.is_stale()? { return self.get_clearlist() } + let widget = self.widget()?; let widget = widget.lock()?; let widget = widget.as_ref()?; @@ -282,6 +296,10 @@ impl Previewer { self.widget.set_coordinates(&coordinates).ok(); } + pub fn set_stale(&mut self) -> HResult<()> { + self.widget.set_stale() + } + pub fn set_file(&mut self, file: &File, selection: Option,