summaryrefslogtreecommitdiffstats
path: root/src
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
parent8bc73974e78883eb1f619d1829a8be77933e5c00 (diff)
add tab widget for showing which tab we are on
- code cleanup - pageup and pagedown now work properly
Diffstat (limited to 'src')
-rw-r--r--src/commands/cursor_move.rs20
-rw-r--r--src/commands/delete_files.rs2
-rw-r--r--src/commands/new_directory.rs2
-rw-r--r--src/commands/open_file.rs23
-rw-r--r--src/commands/rename_file.rs3
-rw-r--r--src/commands/set_mode.rs1
-rw-r--r--src/commands/tab_operations.rs4
-rw-r--r--src/commands/tab_switch.rs12
-rw-r--r--src/config/mimetype.rs4
-rw-r--r--src/config/theme.rs3
-rw-r--r--src/context.rs2
-rw-r--r--src/fs/dirlist.rs4
-rw-r--r--src/fs/entry.rs4
-rw-r--r--src/history.rs2
-rw-r--r--src/main.rs5
-rw-r--r--src/run.rs6
-rw-r--r--src/ui/tui_backend.rs13
-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
25 files changed, 141 insertions, 89 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 94a6d23..4ff5343 100644
--- a/src/commands/set_mode.rs
+++ b/src/commands/set_mode.rs
@@ -2,7 +2,6 @@ use crate::commands::{CursorMoveDown, JoshutoCommand, JoshutoRunnable};
use crate::context::JoshutoContext;
use crate::error::JoshutoResult;
use crate::fs::JoshutoDirEntry;
-use crate::ui::widgets::TuiTextField;
use crate::ui::TuiBackend;
use crate::util::unix;
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 601c1fc..4cd83f9 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),
+ }
}
diff --git a/src/run.rs b/src/run.rs
index 0b9913c..6f3234c 100644
--- a/src/run.rs
+++ b/src/run.rs
@@ -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 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() {