diff options
-rw-r--r-- | src/commands/cursor_move.rs | 20 | ||||
-rw-r--r-- | src/commands/delete_files.rs | 2 | ||||
-rw-r--r-- | src/commands/new_directory.rs | 2 | ||||
-rw-r--r-- | src/commands/open_file.rs | 23 | ||||
-rw-r--r-- | src/commands/rename_file.rs | 3 | ||||
-rw-r--r-- | src/commands/set_mode.rs | 16 | ||||
-rw-r--r-- | src/commands/tab_operations.rs | 4 | ||||
-rw-r--r-- | src/commands/tab_switch.rs | 12 | ||||
-rw-r--r-- | src/config/mimetype.rs | 4 | ||||
-rw-r--r-- | src/config/theme.rs | 3 | ||||
-rw-r--r-- | src/context.rs | 2 | ||||
-rw-r--r-- | src/fs/dirlist.rs | 4 | ||||
-rw-r--r-- | src/fs/entry.rs | 4 | ||||
-rw-r--r-- | src/history.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 5 | ||||
-rw-r--r-- | src/run.rs | 6 | ||||
-rw-r--r-- | src/ui/tui_backend.rs | 13 | ||||
-rw-r--r-- | src/ui/widgets/mod.rs | 2 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 3 | ||||
-rw-r--r-- | src/ui/widgets/tui_footer.rs | 2 | ||||
-rw-r--r-- | src/ui/widgets/tui_menu.rs | 4 | ||||
-rw-r--r-- | src/ui/widgets/tui_prompt.rs | 6 | ||||
-rw-r--r-- | src/ui/widgets/tui_tab.rs | 29 | ||||
-rw-r--r-- | src/ui/widgets/tui_textfield.rs | 20 | ||||
-rw-r--r-- | src/ui/widgets/tui_view.rs | 74 |
25 files changed, 150 insertions, 115 deletions
diff --git a/src/commands/cursor_move.rs b/src/commands/cursor_move.rs index 36ba233..d249181 100644 --- a/src/commands/cursor_move.rs +++ b/src/commands/cursor_move.rs @@ -134,10 +134,16 @@ impl std::fmt::Display for CursorMovePageUp { } impl JoshutoRunnable for CursorMovePageUp { - fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> { + fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { + let half_page = { + match backend.terminal.as_ref().unwrap().size() { + Ok(rect) => rect.height as usize - 2, + _ => 10, + } + }; + let movement = match context.curr_tab_ref().curr_list_ref() { Some(curr_list) => { - let half_page = 10; curr_list .index .map(|idx| if idx > half_page { idx - half_page } else { 0 }) @@ -173,11 +179,17 @@ impl std::fmt::Display for CursorMovePageDown { } impl JoshutoRunnable for CursorMovePageDown { - fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> { + fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { + let half_page = { + match backend.terminal.as_ref().unwrap().size() { + Ok(rect) => rect.height as usize - 2, + _ => 10, + } + }; + let movement = match context.curr_tab_ref().curr_list_ref() { Some(curr_list) => { let dir_len = curr_list.contents.len(); - let half_page = 10; curr_list.index.map(|idx| { if idx + half_page > dir_len - 1 { dir_len - 1 diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs index d89a17d..30a5754 100644 --- a/src/commands/delete_files.rs +++ b/src/commands/delete_files.rs @@ -1,5 +1,4 @@ use std::fs; -use std::io::{self, Write}; use std::path; use termion::event::Key; @@ -8,7 +7,6 @@ use crate::commands::{JoshutoCommand, JoshutoRunnable, ReloadDirList}; use crate::context::JoshutoContext; use crate::error::JoshutoResult; use crate::ui::TuiBackend; -use crate::util::event::Event; use crate::ui::widgets::TuiPrompt; diff --git a/src/commands/new_directory.rs b/src/commands/new_directory.rs index 2a72c38..ab7c170 100644 --- a/src/commands/new_directory.rs +++ b/src/commands/new_directory.rs @@ -28,7 +28,7 @@ impl std::fmt::Display for NewDirectory { } impl JoshutoRunnable for NewDirectory { - fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { + fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> { for path in &self.paths { std::fs::create_dir_all(path)?; } diff --git a/src/commands/open_file.rs b/src/commands/open_file.rs index ee70151..39524e7 100644 --- a/src/commands/open_file.rs +++ b/src/commands/open_file.rs @@ -4,7 +4,6 @@ use crate::commands::{ChangeDirectory, JoshutoCommand, JoshutoRunnable}; use crate::config::mimetype::JoshutoMimetypeEntry; use crate::context::JoshutoContext; use crate::error::{JoshutoError, JoshutoErrorKind, JoshutoResult}; -use crate::history::DirectoryHistory; use crate::ui::widgets::{TuiMenu, TuiTextField}; use crate::ui::TuiBackend; use crate::util::load_child::LoadChild; @@ -59,6 +58,7 @@ impl OpenFile { options[0].execute_with(&paths)?; backend.terminal_restore(); } else { + OpenFileWith::open_with(context, backend, &paths)?; } } Ok(()) @@ -91,7 +91,11 @@ impl OpenFileWith { "open_file_with" } - pub fn open_with(context: &JoshutoContext, backend: &mut TuiBackend, paths: &[&PathBuf]) -> std::io::Result<()> { + pub fn open_with( + context: &JoshutoContext, + backend: &mut TuiBackend, + paths: &[&PathBuf], + ) -> std::io::Result<()> { const PROMPT: &'static str = "open_with "; let mimetype_options: Vec<&JoshutoMimetypeEntry> = OpenFile::get_options(&paths[0]); @@ -102,10 +106,7 @@ impl OpenFileWith { .enumerate() .map(|(i, e)| format!(" {} | {}", i, e)) .collect(); - let menu_options_str: Vec<&str> = menu_options - .iter() - .map(|e| e.as_str()) - .collect(); + let menu_options_str: Vec<&str> = menu_options.iter().map(|e| e.as_str()).collect(); let mut menu_widget = TuiMenu::new(&menu_options_str); let mut textfield = TuiTextField::default() @@ -121,8 +122,8 @@ impl OpenFileWith { match user_input.parse::<usize>() { Ok(n) if n >= mimetype_options.len() => Err(std::io::Error::new( - std::io::ErrorKind::InvalidData, - "option does not exist".to_owned(), + std::io::ErrorKind::InvalidData, + "option does not exist".to_owned(), )), Ok(n) => { let mimetype_entry = &mimetype_options[n]; @@ -167,9 +168,7 @@ impl std::fmt::Display for OpenFileWith { impl JoshutoRunnable for OpenFileWith { fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { let paths = match &context.tabs[context.curr_tab_index].curr_list_ref() { - Some(curr_list) => { - curr_list.get_selected_paths() - } + Some(curr_list) => curr_list.get_selected_paths(), None => vec![], }; @@ -177,7 +176,7 @@ impl JoshutoRunnable for OpenFileWith { return Err(JoshutoError::new( JoshutoErrorKind::IONotFound, String::from("No files selected"), - )) + )); } Self::open_with(context, backend, &paths)?; Ok(()) diff --git a/src/commands/rename_file.rs b/src/commands/rename_file.rs index 8d666d3..23ae1fd 100644 --- a/src/commands/rename_file.rs +++ b/src/commands/rename_file.rs @@ -22,7 +22,6 @@ impl RenameFile { &self, path: &path::PathBuf, context: &mut JoshutoContext, - backend: &mut TuiBackend, ) -> std::io::Result<()> { let new_path = &self.path; if new_path.exists() { @@ -58,7 +57,7 @@ impl JoshutoRunnable for RenameFile { } if let Some(path) = path { - self.rename_file(&path, context, backend)?; + self.rename_file(&path, context)?; } Ok(()) } diff --git a/src/commands/set_mode.rs b/src/commands/set_mode.rs index b2c08df..7ce18a2 100644 --- a/src/commands/set_mode.rs +++ b/src/commands/set_mode.rs @@ -55,10 +55,9 @@ impl JoshutoRunnable for SetMode { const PREFIX: &'static str = "set_mode "; - let entry = context - .tabs[context.curr_tab_index] - .curr_list_ref() - .and_then(|x| x.get_curr_ref()); + let entry = context.tabs[context.curr_tab_index] + .curr_list_ref() + .and_then(|x| x.get_curr_ref()); let user_input = match entry { Some(entry) => { @@ -78,11 +77,10 @@ impl JoshutoRunnable for SetMode { let s = &s[PREFIX.len()..]; let mode = Self::str_to_mode(s); - let mut entry = context - .tabs[context.curr_tab_index] - .curr_list_mut() - .and_then(|x| x.get_curr_mut()) - .unwrap(); + let mut entry = context.tabs[context.curr_tab_index] + .curr_list_mut() + .and_then(|x| x.get_curr_mut()) + .unwrap(); unix::set_mode(entry.file_path().as_path(), mode); entry.metadata.permissions.set_mode(mode); diff --git a/src/commands/tab_operations.rs b/src/commands/tab_operations.rs index aae7371..c2bdbab 100644 --- a/src/commands/tab_operations.rs +++ b/src/commands/tab_operations.rs @@ -29,7 +29,7 @@ impl NewTab { let tab = JoshutoTab::new(curr_path, &context.config_t.sort_option)?; context.tabs.push(tab); context.curr_tab_index = context.tabs.len() - 1; - TabSwitch::tab_switch(context.curr_tab_index, context, backend)?; + TabSwitch::tab_switch(context.curr_tab_index, context)?; Ok(()) } } @@ -68,7 +68,7 @@ impl CloseTab { if context.curr_tab_index > 0 { context.curr_tab_index -= 1; } - TabSwitch::tab_switch(context.curr_tab_index, context, backend)?; + TabSwitch::tab_switch(context.curr_tab_index, context)?; Ok(()) } } diff --git a/src/commands/tab_switch.rs b/src/commands/tab_switch.rs index a6dbab1..ef911f1 100644 --- a/src/commands/tab_switch.rs +++ b/src/commands/tab_switch.rs @@ -18,19 +18,11 @@ impl TabSwitch { "tab_switch" } - pub fn tab_switch( - new_index: usize, - context: &mut JoshutoContext, - backend: &mut TuiBackend, - ) -> std::io::Result<()> { + pub fn tab_switch(new_index: usize, context: &mut JoshutoContext) -> std::io::Result<()> { context.curr_tab_index = new_index; let path = &context.curr_tab_ref().curr_path; env::set_current_dir(path)?; - /* - ui::redraw_tab_view(&view.tab_win, &context); - ncurses::doupdate(); - */ Ok(()) } } @@ -54,7 +46,7 @@ impl JoshutoRunnable for TabSwitch { new_index -= tab_len; } let new_index = new_index as usize; - Self::tab_switch(new_index, context, backend)?; + Self::tab_switch(new_index, context)?; Ok(()) } } diff --git a/src/config/mimetype.rs b/src/config/mimetype.rs index a4d6c44..5538fb0 100644 --- a/src/config/mimetype.rs +++ b/src/config/mimetype.rs @@ -8,10 +8,6 @@ use std::process; use super::{parse_config_file, ConfigStructure}; use crate::MIMETYPE_FILE; -const fn default_false() -> bool { - false -} - #[derive(Debug, Deserialize)] pub struct JoshutoMimetypeEntry { #[serde(rename = "command")] diff --git a/src/config/theme.rs b/src/config/theme.rs index ddbd882..38af29f 100644 --- a/src/config/theme.rs +++ b/src/config/theme.rs @@ -230,8 +230,7 @@ impl std::default::Default for JoshutoTheme { let executable = JoshutoStyleTheme::default() .set_fg(Color::LightGreen) .set_bold(true); - let regular = JoshutoStyleTheme::default() - .set_fg(Color::White); + let regular = JoshutoStyleTheme::default().set_fg(Color::White); let directory = JoshutoStyleTheme::default() .set_fg(Color::LightBlue) .set_bold(true); diff --git a/src/context.rs b/src/context.rs index 56dcc89..0135674 100644 --- a/src/context.rs +++ b/src/context.rs @@ -6,8 +6,6 @@ use crate::io::IOWorkerThread; use crate::tab::JoshutoTab; use crate::util::event::Events; -pub const MESSAGE_VISIBLE_DURATION: usize = 1; - pub struct JoshutoContext { pub exit: bool, pub curr_tab_index: usize, diff --git a/src/fs/dirlist.rs b/src/fs/dirlist.rs index c099442..d6c4673 100644 --- a/src/fs/dirlist.rs +++ b/src/fs/dirlist.rs @@ -69,8 +69,8 @@ impl JoshutoDirList { Some(entry) => contents .iter() .enumerate() - .find(|(i, e)| e.file_name() == entry.file_name()) - .and_then(|(i, e)| Some(i)) + .find(|(_, e)| e.file_name() == entry.file_name()) + .and_then(|(i, _)| Some(i)) .or(Some(0)), None => Some(0), } diff --git a/src/fs/entry.rs b/src/fs/entry.rs index 84e818c..5f24de1 100644 --- a/src/fs/entry.rs +++ b/src/fs/entry.rs @@ -118,8 +118,6 @@ impl JoshutoDirEntry { let metadata = &self.metadata; let filetype = metadata.file_type; - use std::os::unix::fs::MetadataExt; - let mut modifier = Modifier::empty(); if filetype.is_dir() { @@ -159,8 +157,6 @@ impl JoshutoDirEntry { } pub fn get_style(&self) -> Style { - use std::os::unix::fs::MetadataExt; - let metadata = &self.metadata; let filetype = metadata.file_type; diff --git a/src/history.rs b/src/history.rs index 036912e..cf6892f 100644 --- a/src/history.rs +++ b/src/history.rs @@ -65,7 +65,7 @@ impl DirectoryHistory for JoshutoHistory { dirlist.reload_contents(sort_option)?; } Entry::Vacant(entry) => { - let mut dirlist = JoshutoDirList::new(path.to_path_buf(), sort_option)?; + let dirlist = JoshutoDirList::new(path.to_path_buf(), sort_option)?; entry.insert(dirlist); } } diff --git a/src/main.rs b/src/main.rs index a2a01be..26bbbb8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,5 +70,8 @@ fn main() { eprintln!("mimetype config: {:#?}", *MIMETYPE_T); } - run(config, keymap); + match run(config, keymap) { + Ok(_) => {} + Err(e) => eprintln!("{}", e), + } } @@ -2,7 +2,7 @@ use std::thread; use crate::commands::{CommandKeybind, CursorMoveUp, JoshutoRunnable}; use crate::config::{JoshutoCommandMapping, JoshutoConfig}; -use crate::context::{JoshutoContext, MESSAGE_VISIBLE_DURATION}; +use crate::context::JoshutoContext; use crate::tab::JoshutoTab; use crate::ui; use crate::ui::widgets::{TuiCommandMenu, TuiView}; @@ -85,11 +85,9 @@ pub fn run(config_t: JoshutoConfig, keymap_t: JoshutoCommandMapping) -> std::io: } } Some(CommandKeybind::CompositeKeybind(m)) => { - let mut map: &JoshutoCommandMapping = &m; - let cmd = { let mut menu = TuiCommandMenu::new(); - menu.get_input(&mut backend, &context, map) + menu.get_input(&mut backend, &context, &m) }; if let Some(command) = cmd { diff --git a/src/ui/tui_backend.rs b/src/ui/tui_backend.rs index 498e3f6..7d3a7f3 100644 --- a/src/ui/tui_backend.rs +++ b/src/ui/tui_backend.rs @@ -1,5 +1,5 @@ -use std::io::Write; use std::io::stdout; +use std::io::Write; use termion::raw::{IntoRawMode, RawTerminal}; use termion::screen::AlternateScreen; @@ -7,7 +7,8 @@ use tui::backend::TermionBackend; use tui::widgets::Widget; pub struct TuiBackend { - pub terminal: Option<tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>>>, + pub terminal: + Option<tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>>>, } impl TuiBackend { @@ -17,7 +18,9 @@ impl TuiBackend { let backend = TermionBackend::new(stdout); let mut terminal = tui::Terminal::new(backend)?; terminal.hide_cursor()?; - Ok(Self { terminal: Some(terminal) }) + Ok(Self { + terminal: Some(terminal), + }) } pub fn render<W>(&mut self, widget: &mut W) @@ -30,7 +33,9 @@ impl TuiBackend { }); } - pub fn terminal_mut(&mut self) -> &mut tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>> { + pub fn terminal_mut( + &mut self, + ) -> &mut tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>> { self.terminal.as_mut().unwrap() } diff --git a/src/ui/widgets/mod.rs b/src/ui/widgets/mod.rs index 49fbfc5..2600255 100644 --- a/src/ui/widgets/mod.rs +++ b/src/ui/widgets/mod.rs @@ -3,6 +3,7 @@ pub mod tui_dirlist_detailed; pub mod tui_footer; pub mod tui_menu; pub mod tui_prompt; +pub mod tui_tab; pub mod tui_textfield; pub mod tui_topbar; pub mod tui_view; @@ -12,6 +13,7 @@ pub use self::tui_dirlist_detailed::TuiDirListDetailed; pub use self::tui_footer::TuiFooter; pub use self::tui_menu::{TuiCommandMenu, TuiMenu}; pub use self::tui_prompt::TuiPrompt; +pub use self::tui_tab::TuiTabBar; pub use self::tui_textfield::TuiTextField; pub use self::tui_topbar::TuiTopBar; pub use self::tui_view::TuiView; diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index d0f9c12..0fffd79 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -2,8 +2,7 @@ use tui::buffer::Buffer; use tui::layout::Rect; use tui::style::{Color, Modifier, Style}; use tui::widgets::Widget; -use unicode_width::UnicodeWidthChar; -use unicode_width::UnicodeWidthStr; +use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; use crate::fs::JoshutoDirList; use crate::util::format; diff --git a/src/ui/widgets/tui_footer.rs b/src/ui/widgets/tui_footer.rs index 8bc1b49..3e044f4 100644 --- a/src/ui/widgets/tui_footer.rs +++ b/src/ui/widgets/tui_footer.rs @@ -2,7 +2,7 @@ use std::fs; use tui::buffer::Buffer; use tui::layout::Rect; -use tui::style::{Color, Modifier, Style}; +use tui::style::{Color, Style}; use tui::widgets::{Paragraph, Text, Widget}; use crate::fs::JoshutoDirEntry; diff --git a/src/ui/widgets/tui_menu.rs b/src/ui/widgets/tui_menu.rs index fdd291e..5f628cc 100644 --- a/src/ui/widgets/tui_menu.rs +++ b/src/ui/widgets/tui_menu.rs @@ -3,7 +3,7 @@ use std::iter::Iterator; use termion::event::Key; use tui::buffer::Buffer; use tui::layout::Rect; -use tui::style::{Color, Style}; +use tui::style::Style; use tui::widgets::{Block, Borders, Widget}; use unicode_width::UnicodeWidthStr; @@ -31,7 +31,7 @@ impl TuiCommandMenu { m: &'a JoshutoCommandMapping, ) -> Option<&'a Box<dyn JoshutoCommand>> { let mut map: &JoshutoCommandMapping = &m; - let mut terminal = backend.terminal_mut(); + let terminal = backend.terminal_mut(); loop { terminal.draw(|mut frame| { diff --git a/src/ui/widgets/tui_prompt.rs b/src/ui/widgets/tui_prompt.rs index c01965a..dd947a9 100644 --- a/src/ui/widgets/tui_prompt.rs +++ b/src/ui/widgets/tui_prompt.rs @@ -1,12 +1,12 @@ use termion::event::Key; use tui::layout::Rect; use tui::style::{Color, Style}; -use tui::widgets::{Block, Borders, List, Paragraph, Text, Widget}; +use tui::widgets::{Paragraph, Text, Widget}; use unicode_width::UnicodeWidthStr; use crate::context::JoshutoContext; use crate::ui::TuiBackend; -use crate::util::event::{Event, Events}; +use crate::util::event::Event; use super::TuiView; @@ -20,7 +20,7 @@ impl<'a> TuiPrompt<'a> { } pub fn get_key(&mut self, backend: &mut TuiBackend, context: &JoshutoContext) -> Key { - let mut terminal = backend.terminal_mut(); + let terminal = backend.terminal_mut(); loop { terminal.draw(|mut frame| { let f_size = frame.size(); diff --git a/src/ui/widgets/tui_tab.rs b/src/ui/widgets/tui_tab.rs new file mode 100644 index 0000000..55ca497 --- /dev/null +++ b/src/ui/widgets/tui_tab.rs @@ -0,0 +1,29 @@ +use tui::buffer::Buffer; +use tui::layout::Rect; +use tui::style::{Modifier, Style}; +use tui::widgets::{Paragraph, Text, Widget}; + +pub struct TuiTabBar<'a> { + name: &'a str, + curr: usize, + len: usize, +} + +impl<'a> TuiTabBar<'a> { + pub fn new(name: &'a str, curr: usize, len: usize) -> Self { + Self { name, curr, len } + } +} + +impl<'a> Widget for TuiTabBar<'a> { + fn draw(&mut self, area: Rect, buf: &mut Buffer) { + let selected = Style::default().modifier(Modifier::REVERSED); + + let text = [ + Text::styled(format!("{}: {}", self.curr + 1, self.name), selected), + Text::raw(format!("/{}", self.len)), + ]; + + Paragraph::new(text.iter()).wrap(true).draw(area, buf); + } +} diff --git a/src/ui/widgets/tui_textfield.rs b/src/ui/widgets/tui_textfield.rs index f1e9cc7..e978549 100644 --- a/src/ui/widgets/tui_textfield.rs +++ b/src/ui/widgets/tui_textfield.rs @@ -1,19 +1,15 @@ -use std::io::Write; - use rustyline::completion::{Candidate, Completer, FilenameCompleter, Pair}; use rustyline::line_buffer; -use termion::cursor::Goto; use termion::event::Key; -use tui::backend::Backend; use tui::layout::Rect; use tui::style::{Color, Style}; -use tui::widgets::{Block, Borders, List, Paragraph, Text, Widget}; -use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; +use tui::widgets::{Paragraph, Text, Widget}; +use unicode_width::UnicodeWidthChar; use crate::context::JoshutoContext; use crate::ui::TuiBackend; -use crate::util::event::{Event, Events}; +use crate::util::event::Event; use super::{TuiMenu, TuiView}; @@ -73,7 +69,7 @@ impl<'a> TuiTextField<'a> { let mut completion_tracker: Option<CompletionTracker> = None; - let mut char_idx = self + let char_idx = self ._prefix .char_indices() .last() @@ -84,14 +80,13 @@ impl<'a> TuiTextField<'a> { line_buffer.insert_str(char_idx, self._suffix); line_buffer.set_pos(char_idx); - let mut terminal = backend.terminal_mut();; + let terminal = backend.terminal_mut(); terminal.show_cursor(); let mut cursor_xpos = self._prefix.len() + 1; { let frame = terminal.get_frame(); let f_size = frame.size(); - terminal - .set_cursor(cursor_xpos as u16, f_size.height - 1); + terminal.set_cursor(cursor_xpos as u16, f_size.height - 1); } loop { @@ -221,8 +216,7 @@ impl<'a> TuiTextField<'a> { { let frame = terminal.get_frame(); let f_size = frame.size(); - terminal - .set_cursor(cursor_xpos as u16, f_size.height - 1); + terminal.set_cursor(cursor_xpos as u16, f_size.height - 1); } } terminal.hide_cursor(); diff --git a/src/ui/widgets/tui_view.rs b/src/ui/widgets/tui_view.rs index 9ab7e2c..7cfe223 100644 --- a/src/ui/widgets/tui_view.rs +++ b/src/ui/widgets/tui_view.rs @@ -2,11 +2,12 @@ use tui::buffer::Buffer; use tui::layout::{Direction, Layout, Rect}; use tui::style::{Color, Modifier, Style}; use tui::widgets::{Paragraph, Text, Widget}; -use unicode_width::UnicodeWidthStr; -use super::{TuiDirList, TuiDirListDetailed, TuiFooter, TuiTopBar}; +use super::{TuiDirList, TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; use crate::context::JoshutoContext; +const TAB_VIEW_WIDTH: u16 = 15; + pub struct TuiView<'a> { pub context: &'a JoshutoContext, pub show_bottom_status: bool, @@ -43,32 +44,49 @@ impl<'a> Widget for TuiView<'a> { .constraints(constraints.as_ref()) .split(f_size); - if self.context.tabs.len() > 1 { - let rect = Rect { - x: f_size.width - 5, - y: 0, - width: 5, - height: 1, - }; - - let rect = Rect { - x: 0, - y: 0, - width: f_size.width - 5, - height: 1, - }; - - TuiTopBar::new(curr_tab.curr_path.as_path()).draw(rect, buf); - } else { - let rect = Rect { - x: 0, - y: 0, - width: f_size.width, - height: 1, - }; - - TuiTopBar::new(curr_tab.curr_path.as_path()).draw(rect, buf); - } + { + let curr_path = curr_tab.curr_path.as_path(); + + if self.context.tabs.len() > 1 { + let topbar_width = if f_size.width > TAB_VIEW_WIDTH { + f_size.width - TAB_VIEW_WIDTH + } else { + 0 + }; + + let rect = Rect { + x: 0, + y: 0, + width: topbar_width, + height: 1, + }; + TuiTopBar::new(curr_path).draw(rect, buf); + + let rect = Rect { + x: topbar_width, + y: 0, + width: TAB_VIEW_WIDTH, + height: 1, + }; + let name = if let Some(ostr) = curr_path.file_name() { + ostr.to_str().unwrap_or("") + } else { + "" + }; + TuiTabBar::new(name, self.context.curr_tab_index, self.context.tabs.len()) + .draw(rect, buf); + } else { + let topbar_width = f_size.width; + + let rect = Rect { + x: 0, + y: 0, + width: topbar_width, + height: 1, + }; + TuiTopBar::new(curr_path).draw(rect, buf); + } + } if let Some(curr_list) = parent_list.as_ref() { TuiDirList::new(&curr_list).draw(layout_rect[0], buf); |