summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-09-19 21:21:33 -0400
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-09-19 21:21:33 -0400
commit7b4c611ed4d804bd52aeda0a619a54bea9b1e13d (patch)
tree7ba31fff7d5de171aadfc32c67f81dd64428b3ba /src/ui
parent7741d4d2c8798ad0bb609e97fb3bda86c5318a36 (diff)
Change command to use an enum instead of polymorphism
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/widgets/tui_dirlist.rs5
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs4
-rw-r--r--src/ui/widgets/tui_folder_view.rs8
-rw-r--r--src/ui/widgets/tui_footer.rs83
-rw-r--r--src/ui/widgets/tui_menu.rs4
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();