diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-03-02 18:50:29 -0500 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-03-02 18:50:29 -0500 |
commit | e321dfc3c96f50f09c3953340a5a6fea72a5a245 (patch) | |
tree | dc13fee011e7c49536eb28b5b3d5de8bef93af89 /src/ui/widgets | |
parent | 8bc73974e78883eb1f619d1829a8be77933e5c00 (diff) |
add tab widget for showing which tab we are on
- code cleanup
- pageup and pagedown now work properly
Diffstat (limited to 'src/ui/widgets')
-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 | 54 |
8 files changed, 89 insertions, 31 deletions
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 0f2d64d..46af0b3 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, @@ -44,14 +45,47 @@ impl<'a> Widget for TuiView<'a> { .split(f_size); { - 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() { |