diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-09-19 21:21:33 -0400 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-09-19 21:21:33 -0400 |
commit | 7b4c611ed4d804bd52aeda0a619a54bea9b1e13d (patch) | |
tree | 7ba31fff7d5de171aadfc32c67f81dd64428b3ba /src/ui | |
parent | 7741d4d2c8798ad0bb609e97fb3bda86c5318a36 (diff) |
Change command to use an enum instead of polymorphism
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/widgets/tui_dirlist.rs | 5 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 4 | ||||
-rw-r--r-- | src/ui/widgets/tui_folder_view.rs | 8 | ||||
-rw-r--r-- | src/ui/widgets/tui_footer.rs | 83 | ||||
-rw-r--r-- | src/ui/widgets/tui_menu.rs | 4 |
5 files changed, 57 insertions, 47 deletions
diff --git a/src/ui/widgets/tui_dirlist.rs b/src/ui/widgets/tui_dirlist.rs index 05f6fc9..d4d6db4 100644 --- a/src/ui/widgets/tui_dirlist.rs +++ b/src/ui/widgets/tui_dirlist.rs @@ -21,7 +21,6 @@ impl<'a> Widget for TuiDirList<'a> { if area.width < 1 || area.height < 1 { return; } - if area.width < 4 { return; } @@ -46,8 +45,8 @@ impl<'a> Widget for TuiDirList<'a> { }; let area_width = area.width as usize - 1; - for (i, entry) in self.dirlist.contents[skip_dist..] - .iter() + for (i, entry) in self.dirlist.iter() + .skip(skip_dist) .enumerate() .take(area.height as usize) { diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index 27ddbc8..7dfb1b6 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -46,8 +46,8 @@ impl<'a> Widget for TuiDirListDetailed<'a> { }; let area_width = area.width as usize; - for (i, entry) in self.dirlist.contents[skip_dist..] - .iter() + for (i, entry) in self.dirlist.iter() + .skip(skip_dist) .enumerate() .take(area.height as usize) { diff --git a/src/ui/widgets/tui_folder_view.rs b/src/ui/widgets/tui_folder_view.rs index df14f73..01dcf2b 100644 --- a/src/ui/widgets/tui_folder_view.rs +++ b/src/ui/widgets/tui_folder_view.rs @@ -45,6 +45,7 @@ impl<'a> Widget for TuiFolderView<'a> { .constraints(constraints.as_ref()) .split(f_size); + // render tabs if self.context.tab_context_ref().len() > 1 { let topbar_width = if f_size.width > TAB_VIEW_WIDTH { f_size.width - TAB_VIEW_WIDTH @@ -89,10 +90,12 @@ impl<'a> Widget for TuiFolderView<'a> { TuiTopBar::new(curr_tab.pwd()).render(rect, buf); } + // render parent view if let Some(list) = parent_list.as_ref() { TuiDirList::new(&list).render(layout_rect[0], buf); }; + // render current view if let Some(list) = curr_list.as_ref() { TuiDirListDetailed::new(&list).render(layout_rect[1], buf); let rect = Rect { @@ -116,12 +119,13 @@ impl<'a> Widget for TuiFolderView<'a> { Paragraph::new(text) .wrap(Wrap { trim: true }) .render(rect, buf); - } else if let Some(entry) = list.get_curr_ref() { - TuiFooter::new(entry).render(rect, buf); + } else { + TuiFooter::new(list).render(rect, buf); } } }; + // render preview if let Some(list) = child_list.as_ref() { TuiDirList::new(&list).render(layout_rect[2], buf); }; diff --git a/src/ui/widgets/tui_footer.rs b/src/ui/widgets/tui_footer.rs index b9d3a08..35189dc 100644 --- a/src/ui/widgets/tui_footer.rs +++ b/src/ui/widgets/tui_footer.rs @@ -4,57 +4,64 @@ use tui::style::{Color, Style}; use tui::text::{Span, Spans}; use tui::widgets::{Paragraph, Widget}; -use crate::fs::{FileType, JoshutoDirEntry}; +use crate::fs::{FileType, JoshutoDirList}; use crate::util::format; pub struct TuiFooter<'a> { - entry: &'a JoshutoDirEntry, + list: &'a JoshutoDirList, } impl<'a> TuiFooter<'a> { - pub fn new(entry: &'a JoshutoDirEntry) -> Self { - Self { entry } + pub fn new(list: &'a JoshutoDirList) -> Self { + Self { list } } } impl<'a> Widget for TuiFooter<'a> { fn render(self, area: Rect, buf: &mut Buffer) { use std::os::unix::fs::PermissionsExt; + match self.list.index { + Some(i) if i < self.list.contents.len() => { + let entry = &self.list.contents[i]; + let mode = entry.metadata.permissions.mode(); + let mode = format::mode_to_string(mode); - let mode = self.entry.metadata.permissions.mode(); - let mode = format::mode_to_string(mode); - - let mode_style = Style::default().fg(Color::Cyan); - - let mtime = self.entry.metadata.modified; - let mtime = format::mtime_to_string(mtime); - - let size = self.entry.metadata.len; - let size = format::file_size_to_string(size); - - #[cfg(unix)] - let mimetype = match self.entry.metadata.mimetype.as_ref() { - Some(s) => s, - None => "", - }; - - let mut text = vec![ - Span::styled(mode, mode_style), - Span::raw(" "), - Span::raw(mtime), - Span::raw(" "), - Span::raw(size), - #[cfg(unix)] - Span::raw(" "), - #[cfg(unix)] - Span::raw(mimetype), - ]; - - if let FileType::Symlink(s) = &self.entry.metadata.file_type { - text.push(Span::styled(" -> ", mode_style)); - text.push(Span::styled(s, mode_style)); - } + let mode_style = Style::default().fg(Color::Cyan); + + let mtime = entry.metadata.modified; + let mtime = format::mtime_to_string(mtime); + + let size = entry.metadata.len; + let size = format::file_size_to_string(size); + + #[cfg(unix)] + let mimetype = match entry.metadata.mimetype.as_ref() { + Some(s) => s, + None => "", + }; - Paragraph::new(Spans::from(text)).render(area, buf); + let mut text = vec![ + Span::styled(mode, mode_style), + Span::raw(" "), + Span::raw(format!("{}/{}", i + 1, self.list.contents.len())), + Span::raw(" "), + Span::raw(mtime), + Span::raw(" "), + Span::raw(size), + #[cfg(unix)] + Span::raw(" "), + #[cfg(unix)] + Span::raw(mimetype), + ]; + + if let FileType::Symlink(s) = &entry.metadata.file_type { + text.push(Span::styled(" -> ", mode_style)); + text.push(Span::styled(s, mode_style)); + } + + Paragraph::new(Spans::from(text)).render(area, buf); + } + _ => {} + } } } diff --git a/src/ui/widgets/tui_menu.rs b/src/ui/widgets/tui_menu.rs index fcd47ce..85b0a7a 100644 --- a/src/ui/widgets/tui_menu.rs +++ b/src/ui/widgets/tui_menu.rs @@ -8,7 +8,7 @@ use tui::widgets::{Block, Borders, Clear, Widget}; use unicode_width::UnicodeWidthStr; use super::TuiView; -use crate::commands::{CommandKeybind, JoshutoCommand}; +use crate::commands::{CommandKeybind, KeyCommand}; use crate::config::JoshutoCommandMapping; use crate::context::JoshutoContext; use crate::ui::TuiBackend; @@ -30,7 +30,7 @@ impl TuiCommandMenu { backend: &mut TuiBackend, context: &mut JoshutoContext, m: &'a JoshutoCommandMapping, - ) -> Option<&'a Box<dyn JoshutoCommand>> { + ) -> Option<&'a KeyCommand> { let mut map: &JoshutoCommandMapping = &m; let terminal = backend.terminal_mut(); context.flush_event(); |