summaryrefslogtreecommitdiffstats
path: root/src/ui/widgets
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-02 18:50:29 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-02 18:50:29 -0500
commite321dfc3c96f50f09c3953340a5a6fea72a5a245 (patch)
treedc13fee011e7c49536eb28b5b3d5de8bef93af89 /src/ui/widgets
parent8bc73974e78883eb1f619d1829a8be77933e5c00 (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.rs2
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs3
-rw-r--r--src/ui/widgets/tui_footer.rs2
-rw-r--r--src/ui/widgets/tui_menu.rs4
-rw-r--r--src/ui/widgets/tui_prompt.rs6
-rw-r--r--src/ui/widgets/tui_tab.rs29
-rw-r--r--src/ui/widgets/tui_textfield.rs20
-rw-r--r--src/ui/widgets/tui_view.rs54
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() {