summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-02-16 16:40:20 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-02-16 16:40:20 -0500
commit88da91c0f97dcb40e7e4cab54941af92a46d2e1a (patch)
treed5e7fa33842c19b32bfc834e531e2b942813e985 /src
parent98d0ce7e70f9febf804cda7473f5e9f7f180fe91 (diff)
remove more code
- remove curr_list field from tab - fixes many commands not working
Diffstat (limited to 'src')
-rw-r--r--src/commands/bulk_rename.rs5
-rw-r--r--src/commands/cursor_move.rs38
-rw-r--r--src/commands/delete_files.rs6
-rw-r--r--src/commands/reload_dir.rs5
-rw-r--r--src/commands/rename_file.rs35
-rw-r--r--src/commands/search.rs4
-rw-r--r--src/commands/selection.rs36
-rw-r--r--src/commands/set_mode.rs17
-rw-r--r--src/commands/show_hidden.rs5
-rw-r--r--src/fs/entry.rs108
-rw-r--r--src/tab.rs4
-rw-r--r--src/ui/tui_backend.rs33
-rw-r--r--src/ui/widgets/tui_dirlist.rs15
13 files changed, 245 insertions, 66 deletions
diff --git a/src/commands/bulk_rename.rs b/src/commands/bulk_rename.rs
index 9f67106..942ba73 100644
--- a/src/commands/bulk_rename.rs
+++ b/src/commands/bulk_rename.rs
@@ -45,7 +45,10 @@ impl BulkRename {
file_path.push(rand_str);
let curr_tab = &context.tabs[context.curr_tab_index];
- let paths = curr_tab.curr_list.get_selected_paths();
+ let paths = match curr_tab.curr_list_ref() {
+ Some(s) => s.get_selected_paths(),
+ None => Vec::new(),
+ };
{
let mut file = std::fs::File::create(&file_path)?;
for path in &paths {
diff --git a/src/commands/cursor_move.rs b/src/commands/cursor_move.rs
index a0b7522..03d9908 100644
--- a/src/commands/cursor_move.rs
+++ b/src/commands/cursor_move.rs
@@ -218,13 +218,20 @@ impl std::fmt::Display for CursorMoveHome {
impl JoshutoRunnable for CursorMoveHome {
fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> {
- let movement: Option<usize> = {
- let len = context.curr_tab_mut().curr_list.contents.len();
- if len == 0 {
- None
- } else {
- Some(0)
+ let movement: Option<usize> = match context
+ .curr_tab_ref()
+ .curr_list_ref() {
+ Some(curr_list) => {
+ let len = curr_list
+ .contents
+ .len();
+ if len == 0 {
+ None
+ } else {
+ Some(0)
+ }
}
+ None => None,
};
if let Some(s) = movement {
@@ -256,13 +263,20 @@ impl std::fmt::Display for CursorMoveEnd {
impl JoshutoRunnable for CursorMoveEnd {
fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> {
- let movement: Option<usize> = {
- let len = context.curr_tab_mut().curr_list.contents.len();
- if len == 0 {
- None
- } else {
- Some(len - 1)
+ let movement: Option<usize> = match context
+ .curr_tab_ref()
+ .curr_list_ref() {
+ Some(curr_list) => {
+ let len = curr_list
+ .contents
+ .len();
+ if len == 0 {
+ None
+ } else {
+ Some(len - 1)
+ }
}
+ None => None,
};
if let Some(s) = movement {
diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs
index ed35630..f1ce09d 100644
--- a/src/commands/delete_files.rs
+++ b/src/commands/delete_files.rs
@@ -33,7 +33,11 @@ impl DeleteFiles {
fn delete_files(context: &mut JoshutoContext, backend: &mut TuiBackend) -> std::io::Result<()> {
let curr_tab = &mut context.tabs[context.curr_tab_index];
- let paths = curr_tab.curr_list.get_selected_paths();
+ let paths = match curr_tab.curr_list_ref() {
+ Some(s) => s.get_selected_paths(),
+ None => Vec::new(),
+ };
+
if paths.is_empty() {
return Err(std::io::Error::new(
std::io::ErrorKind::Other,
diff --git a/src/commands/reload_dir.rs b/src/commands/reload_dir.rs
index 7103970..ac8d72d 100644
--- a/src/commands/reload_dir.rs
+++ b/src/commands/reload_dir.rs
@@ -17,7 +17,10 @@ impl ReloadDirList {
pub fn reload(index: usize, context: &mut JoshutoContext) -> std::io::Result<()> {
let curr_tab = &mut context.tabs[index];
let sort_option = &context.config_t.sort_option;
- curr_tab.curr_list.reload_contents(sort_option)?;
+ match curr_tab.curr_list_mut() {
+ Some(curr_list) => curr_list.reload_contents(sort_option)?,
+ None => {},
+ }
Ok(())
}
diff --git a/src/commands/rename_file.rs b/src/commands/rename_file.rs
index ad2441c..dad9632 100644
--- a/src/commands/rename_file.rs
+++ b/src/commands/rename_file.rs
@@ -32,9 +32,9 @@ impl RenameFile {
}
std::fs::rename(&path, &new_path)?;
let curr_tab = &mut context.tabs[context.curr_tab_index];
- curr_tab
- .curr_list
- .reload_contents(&context.config_t.sort_option)?;
+ if let Some(curr_list) = curr_tab.curr_list_mut() {
+ curr_list.reload_contents(&context.config_t.sort_option)?;
+ }
Ok(())
}
}
@@ -51,9 +51,10 @@ impl JoshutoRunnable for RenameFile {
fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> {
let mut path: Option<path::PathBuf> = None;
- let curr_list = &context.tabs[context.curr_tab_index].curr_list;
- if let Some(s) = curr_list.get_curr_ref() {
- path = Some(s.file_path().clone());
+ if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() {
+ if let Some(s) = curr_list.get_curr_ref() {
+ path = Some(s.file_path().clone());
+ }
}
if let Some(path) = path {
@@ -105,10 +106,13 @@ impl std::fmt::Display for RenameFileAppend {
impl JoshutoRunnable for RenameFileAppend {
fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> {
- let curr_list = &context.tabs[context.curr_tab_index].curr_list;
- let file_name = curr_list
- .get_curr_ref()
- .and_then(|s| Some(String::from(s.file_name())));
+ let mut file_name: Option<String> = None;
+
+ if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() {
+ file_name = curr_list
+ .get_curr_ref()
+ .and_then(|s| Some(s.file_name().to_string()));
+ }
if let Some(file_name) = file_name {
self.rename_file(context, backend, file_name)?;
@@ -152,10 +156,13 @@ impl std::fmt::Display for RenameFilePrepend {
impl JoshutoRunnable for RenameFilePrepend {
fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> {
- let curr_list = &context.tabs[context.curr_tab_index].curr_list;
- let file_name = curr_list
- .get_curr_ref()
- .and_then(|s| Some(String::from(s.file_name())));
+ let mut file_name: Option<String> = None;
+
+ if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() {
+ file_name = curr_list
+ .get_curr_ref()
+ .and_then(|s| Some(s.file_name().to_string()));
+ }
if let Some(file_name) = file_name {
self.rename_file(context, backend, file_name)?;
diff --git a/src/commands/search.rs b/src/commands/search.rs
index 0b7ef76..23180c4 100644
--- a/src/commands/search.rs
+++ b/src/commands/search.rs
@@ -26,7 +26,7 @@ impl Search {
"search"
}
pub fn search(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> {
- let curr_list = &curr_tab.curr_list;
+ let curr_list = curr_tab.curr_list_ref()?;
let offset = curr_list.index? + 1;
let contents_len = curr_list.contents.len();
@@ -41,7 +41,7 @@ impl Search {
None
}
pub fn search_rev(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> {
- let curr_list = &curr_tab.curr_list;
+ let curr_list = curr_tab.curr_list_ref()?;
let offset = curr_list.index?;
let contents_len = curr_list.contents.len();
diff --git a/src/commands/selection.rs b/src/commands/selection.rs
index 4ce4772..dccb114 100644
--- a/src/commands/selection.rs
+++ b/src/commands/selection.rs
@@ -38,27 +38,35 @@ impl JoshutoRunnable for SelectFiles {
let curr_tab = &mut context.tabs[context.curr_tab_index];
if self.toggle {
if !self.all {
- let curr_list = &mut curr_tab.curr_list;
- if let Some(s) = curr_list.get_curr_mut() {
- s.set_selected(!s.is_selected());
- CursorMoveDown::new(1).execute(context, backend)?;
+ let curr_list = curr_tab.curr_list_mut();
+ if let Some(curr_list) = curr_list {
+ if let Some(s) = curr_list.get_curr_mut() {
+ s.set_selected(!s.is_selected());
+ CursorMoveDown::new(1).execute(context, backend)?;
+ }
}
} else {
- let curr_list = &mut curr_tab.curr_list;
- for curr in &mut curr_list.contents {
- curr.set_selected(!curr.is_selected());
+ let curr_list = curr_tab.curr_list_mut();
+ if let Some(curr_list) = curr_list {
+ for curr in &mut curr_list.contents {
+ curr.set_selected(!curr.is_selected());
+ }
}
}
} else if !self.all {
- let curr_list = &mut curr_tab.curr_list;
- if let Some(s) = curr_list.get_curr_mut() {
- s.set_selected(true);
- CursorMoveDown::new(1).execute(context, backend)?;
+ let curr_list = curr_tab.curr_list_mut();
+ if let Some(curr_list) = curr_list {
+ if let Some(s) = curr_list.get_curr_mut() {
+ s.set_selected(!s.is_selected());
+ CursorMoveDown::new(1).execute(context, backend)?;
+ }
}
} else {
- let curr_list = &mut curr_tab.curr_list;
- for curr in &mut curr_list.contents {
- curr.set_selected(true);
+ let curr_list = curr_tab.curr_list_mut();
+ if let Some(curr_list) = curr_list {
+ for curr in &mut curr_list.contents {
+ curr.set_selected(true);
+ }
}
}
Ok(())
diff --git a/src/commands/set_mode.rs b/src/commands/set_mode.rs
index 6a5896f..07f6d37 100644
--- a/src/commands/set_mode.rs
+++ b/src/commands/set_mode.rs
@@ -65,15 +65,16 @@ impl JoshutoRunnable for SetMode {
fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> {
use std::os::unix::fs::PermissionsExt;
let curr_tab = &mut context.tabs[context.curr_tab_index];
- if let Some(file) = curr_tab.curr_list.get_curr_mut() {
- let mode = file.metadata.permissions.mode();
- let mut mode_string = unix::stringify_mode(mode);
- mode_string.remove(0);
+ if let Some(curr_list) = curr_tab.curr_list_mut() {
+ if let Some(file) = curr_list.get_curr_mut() {
+ let mode = file.metadata.permissions.mode();
+ let mut mode_string = unix::stringify_mode(mode);
+ mode_string.remove(0);
- self.set_mode(file, mode_string);
- CursorMoveDown::new(1).execute(context, backend)
- } else {
- Ok(())
+ self.set_mode(file, mode_string);
+ CursorMoveDown::new(1).execute(context, backend)?;
+ }
}
+ Ok(())
}
}
diff --git a/src/commands/show_hidden.rs b/src/commands/show_hidden.rs
index 3a51c84..63ac4bf 100644
--- a/src/commands/show_hidden.rs
+++ b/src/commands/show_hidden.rs
@@ -20,7 +20,10 @@ impl ToggleHiddenFiles {
for tab in &mut context.tabs {
tab.history.depreciate_all_entries();
- tab.curr_list.depreciate();
+ match tab.curr_list_mut() {
+ Some(s) => s.depreciate(),
+ None => {},
+ }
}
}
}
diff --git a/src/fs/entry.rs b/src/fs/entry.rs
index ebc2e75..5cb8a2b 100644
--- a/src/fs/entry.rs
+++ b/src/fs/entry.rs
@@ -1,6 +1,6 @@
use std::{fs, path};
-use tui::style::Color;
+use tui::style::{Color, Modifier, Style};
use crate::fs::JoshutoMetadata;
@@ -112,6 +112,112 @@ impl JoshutoDirEntry {
}
}
}
+
+ pub fn get_modifier(&self) -> Modifier {
+ let metadata = &self.metadata;
+ let filetype = metadata.file_type;
+
+ let mut modifier = Modifier::empty();
+
+ if filetype.is_dir() {
+ if THEME_T.directory.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if THEME_T.directory.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+ } else if filetype.is_symlink() {
+ if THEME_T.link.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if THEME_T.link.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+ } else {
+ match self.file_path().extension() {
+ None => {}
+ Some(os_str) => match os_str.to_str() {
+ None => {}
+ Some(s) => match THEME_T.ext.get(s) {
+ None => {}
+ Some(t) => {
+ if t.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if t.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+ }
+ },
+ },
+ };
+ }
+ modifier
+ }
+
+ pub fn get_style(&self) -> Style {
+ let metadata = &self.metadata;
+ let filetype = metadata.file_type;
+
+ let mut style = Style::default();
+
+ if self.is_selected() {
+ let mut modifier = Modifier::empty();
+ if THEME_T.selection.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if THEME_T.selection.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+
+ style = style.fg(THEME_T.selection.fg).bg(THEME_T.selection.bg);
+ style = style.modifier(modifier);
+ } else if filetype.is_dir() {
+ let mut modifier = Modifier::empty();
+ if THEME_T.directory.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if THEME_T.directory.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+
+ style = style.fg(THEME_T.directory.fg).bg(THEME_T.directory.bg);
+ style = style.modifier(modifier);
+ } else if filetype.is_symlink() {
+ let mut modifier = Modifier::empty();
+ if THEME_T.link.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if THEME_T.link.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+
+ style = style.fg(THEME_T.link.fg).bg(THEME_T.link.bg);
+ style = style.modifier(modifier);
+ } else {
+ match self.file_path().extension() {
+ None => {}
+ Some(os_str) => match os_str.to_str() {
+ None => {}
+ Some(s) => match THEME_T.ext.get(s) {
+ None => {}
+ Some(t) => {
+ let mut modifier = Modifier::empty();
+ if t.bold {
+ modifier.insert(Modifier::BOLD);
+ }
+ if t.underline {
+ modifier.insert(Modifier::UNDERLINED);
+ }
+ style = style.fg(t.fg).bg(t.bg);
+ style = style.modifier(modifier);
+ }
+ },
+ },
+ }
+ }
+ style
+ }
}
impl std::fmt::Display for JoshutoDirEntry {
diff --git a/src/tab.rs b/src/tab.rs
index c467568..08bf0ee 100644
--- a/src/tab.rs
+++ b/src/tab.rs
@@ -7,7 +7,6 @@ use crate::sort;
pub struct JoshutoTab {
pub history: JoshutoHistory,
pub curr_path: PathBuf,
- pub curr_list: JoshutoDirList,
}
impl JoshutoTab {
@@ -15,12 +14,9 @@ impl JoshutoTab {
let mut history = JoshutoHistory::new();
history.populate_to_root(&curr_path, sort_option)?;
- let curr_list = JoshutoDirList::new(curr_path.clone(), sort_option)?;
-
let tab = JoshutoTab {
curr_path,
history,
- curr_list,
};
Ok(tab)
}
diff --git a/src/ui/tui_backend.rs b/src/ui/tui_backend.rs
index fa923a2..2a0c53e 100644
--- a/src/ui/tui_backend.rs
+++ b/src/ui/tui_backend.rs
@@ -8,13 +8,14 @@ use termion::raw::{IntoRawMode, RawTerminal};
use termion::screen::AlternateScreen;
use tui::backend::TermionBackend;
use tui::layout::{Constraint, Direction, Layout, Rect};
-use tui::style::{Color, Style};
+use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders, List, Paragraph, SelectableList, Text, Widget};
use unicode_width::UnicodeWidthStr;
use super::widgets::TuiDirList;
use crate::context::JoshutoContext;
-// use crate::fs::JoshutoDirList;
+
+use crate::{HOSTNAME, USERNAME};
pub struct TuiBackend {
pub terminal: tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>>,
@@ -63,6 +64,34 @@ impl TuiBackend {
.constraints(constraints.as_ref())
.split(f_size);
+ {
+ let username_style = Style::default()
+ .fg(Color::LightGreen)
+ .modifier(Modifier::BOLD);
+
+ let path_style = Style::default()
+ .fg(Color::LightBlue)
+ .modifier(Modifier::BOLD);
+
+ let curr_path_str = curr_tab.curr_path.to_string_lossy();
+
+ let text = [
+ Text::styled(format!("{}@{} ", *USERNAME, *HOSTNAME), username_style),
+ Text::styled(curr_path_str, path_style),
+ ];
+
+ let top_rect = Rect {
+ x: 0,
+ y: 0,
+ width: f_size.width,
+ height: 1,
+ };
+
+ Paragraph::new(text.iter())
+ .wrap(true)
+ .render(&mut frame, top_rect);
+ }
+
if let Some(curr_list) = parent_list.as_ref() {
TuiDirList::new(&curr_list).render(&mut frame, layout_rect[0]);
};
diff --git a/src/ui/widgets/tui_dirlist.rs b/src/ui/widgets/tui_dirlist.rs
index 83891b4..cda2da9 100644
--- a/src/ui/widgets/tui_dirlist.rs
+++ b/src/ui/widgets/tui_dirlist.rs
@@ -103,20 +103,25 @@ impl<'a> Widget for TuiDirList<'a> {
}
let curr_index = self.dirlist.index.unwrap();
+ let skip_dist = curr_index / area.height as usize * area.height as usize;
+
+ let screen_index = if skip_dist > 0 {
+ curr_index % skip_dist
+ } else {
+ curr_index
+ };
for (i, entry) in self
.dirlist
.contents
.iter()
+ .skip(skip_dist)
.enumerate()
.take(area.height as usize)
{
- let fg = entry.get_fg_color();
- let bg = entry.get_bg_color();
let name = entry.file_name();
+ let mut style = entry.get_style();
- let mut style = Style::default().fg(fg).bg(bg);
-
- if i == curr_index {
+ if i == screen_index {
style = style.modifier(Modifier::REVERSED);
}
buf.set_stringn(x, y + i as u16, name, area.width as usize, style);