From 67fde00a341b3c90afcad2414aaf19f2b0a0cbf1 Mon Sep 17 00:00:00 2001 From: rabite Date: Fri, 22 May 2020 14:32:56 +0200 Subject: add preview zoom mode --- src/file_browser.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 5 deletions(-) (limited to 'src/file_browser.rs') diff --git a/src/file_browser.rs b/src/file_browser.rs index fcc0c6c..f3cec19 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -72,6 +72,14 @@ impl Widget for FileBrowserWidgets { FileBrowserWidgets::Blank(widget) => widget.get_drawlist(), } } + + fn on_key(&mut self, key: Key) -> HResult<()> { + match self { + FileBrowserWidgets::FileList(widget) => widget.on_key(key), + FileBrowserWidgets::Previewer(widget) => widget.on_key(key), + FileBrowserWidgets::Blank(widget) => widget.on_key(key) + } + } } pub struct FileBrowser { @@ -854,9 +862,45 @@ impl FileBrowser { } } + fn cancel_preview_animation(&mut self) { + self.preview_widget_mut() + .map(|preview| preview.cancel_animation()) + .log(); + } + + fn activate_main_widget(&mut self) { + const MAIN_INDEX: usize = 1; + self.columns + .set_active(MAIN_INDEX) + .log(); + } + + fn activate_preview_widget(&mut self) { + const PREVIEW_INDEX: usize = 2; + self.columns + .set_active(PREVIEW_INDEX) + .log(); + } + pub fn toggle_colums(&mut self) { - self.preview_widget().map(|preview| preview.cancel_animation()).log(); - self.columns.toggle_zoom().log(); + self.cancel_preview_animation(); + self.activate_main_widget(); + self.columns + .toggle_zoom() + .log(); + } + + pub fn zoom_preview(&mut self) { + self.cancel_preview_animation(); + self.activate_preview_widget(); + self.preview_widget_mut() + .map(|preview| { + preview.reload_text(); + }).log(); + + self.columns + .toggle_zoom() + .log(); } pub fn quit_with_dir(&self) -> HResult<()> { @@ -1419,13 +1463,25 @@ impl Widget for FileBrowser { let sized_path = crate::term::sized_string(&pretty_path, xsize); Ok(sized_path.to_string()) } + fn render_footer(&self) -> HResult { let xsize = term::xsize_u(); - match self.get_core()?.status_bar_content.lock()?.as_mut().take() { - Some(status) => Ok(term::sized_string_u(&status, xsize)), - _ => { self.get_footer() }, + let mut status = self.get_core()? + .status_bar_content + .lock()?; + let status = status.as_mut() + .take(); + let active = self.columns + .active + .unwrap_or(1); + + match (status, active) { + (Some(status), _) => Ok(term::sized_string_u(&status, xsize)), + (_, 2) => self.preview_widget()?.render_footer(), + _ => self.get_footer(), } } + fn refresh(&mut self) -> HResult<()> { self.set_title().log(); self.columns.refresh().log(); @@ -1441,6 +1497,26 @@ impl Widget for FileBrowser { } fn on_key(&mut self, key: Key) -> HResult<()> { + // Special handling for preview zoom + let binds = self.search_in(); + let action = binds.get(key); + + match (action, self.columns.active) { + (Some(FileBrowserAction::ZoomPreview), Some(2)) => { + self.toggle_colums(); + return Ok(()); + } + (Some(FileBrowserAction::ZoomPreview), Some(1)) => { + self.zoom_preview(); + return Ok(()); + } + (_, Some(2)) => { + self.columns.active_widget_mut()?.on_key(key)?; + return Ok(()); + } + _ => {} + } + match self.do_key(key) { Err(HError::WidgetUndefinedKeyError{..}) => { match self.main_widget_mut()?.on_key(key) { @@ -1509,6 +1585,7 @@ impl Acting for FileBrowser { ShowQuickActions => self.quick_action()?, RunSubshell => self.run_subshell()?, ToggleColumns => self.toggle_colums(), + ZoomPreview => self.zoom_preview(), // Tab implementation needs to call exec_cmd because ALL files are needed ExecCmd => Err(HError::FileBrowserNeedTabFiles)? } -- cgit v1.2.3