diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/views/tui_command_menu.rs | 122 | ||||
-rw-r--r-- | src/ui/views/tui_folder_view.rs | 8 | ||||
-rw-r--r-- | src/ui/views/tui_textfield.rs | 40 | ||||
-rw-r--r-- | src/ui/views/tui_worker_view.rs | 72 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 4 | ||||
-rw-r--r-- | src/ui/widgets/tui_prompt.rs | 2 | ||||
-rw-r--r-- | src/ui/widgets/tui_worker.rs | 10 |
7 files changed, 114 insertions, 144 deletions
diff --git a/src/ui/views/tui_command_menu.rs b/src/ui/views/tui_command_menu.rs index 5f7bc56..2954d5a 100644 --- a/src/ui/views/tui_command_menu.rs +++ b/src/ui/views/tui_command_menu.rs @@ -1,10 +1,9 @@ use std::iter::Iterator; -use termion::event::{Event, Key}; +use tui::buffer::Buffer; use tui::layout::Rect; -use tui::widgets::Clear; +use tui::widgets::{Clear, Widget}; -use crate::commands::{CommandKeybind, KeyCommand}; use crate::config::AppKeyMapping; use crate::context::AppContext; use crate::event::AppEvent; @@ -17,91 +16,52 @@ use crate::util::to_string::ToString; const BORDER_HEIGHT: usize = 1; const BOTTOM_MARGIN: usize = 1; -pub struct TuiCommandMenu; +pub struct TuiCommandMenu<'a> { + context: &'a AppContext, + keymap: &'a AppKeyMapping, +} -impl TuiCommandMenu { - pub fn new() -> Self { - Self {} +impl<'a> TuiCommandMenu<'a> { + pub fn new(context: &'a AppContext, keymap: &'a AppKeyMapping) -> Self { + Self { context, keymap } } +} - pub fn get_input<'a>( - &mut self, - backend: &mut TuiBackend, - context: &mut AppContext, - map: &'a AppKeyMapping, - ) -> Option<&'a KeyCommand> { - let mut map = map; - let terminal = backend.terminal_mut(); - context.flush_event(); - - loop { - let _ = terminal.draw(|frame| { - let area = frame.size(); - - { - let view = TuiView::new(&context); - frame.render_widget(view, area); - } - - { - // draw menu - let mut display_vec: Vec<String> = map - .as_ref() - .iter() - .map(|(k, v)| format!(" {} {}", k.to_string(), v)) - .collect(); - display_vec.sort(); - let display_str: Vec<&str> = display_vec.iter().map(|v| v.as_str()).collect(); - let display_str_len = display_str.len(); +impl<'a> Widget for TuiCommandMenu<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + TuiView::new(self.context).render(area, buf); - let y = if (area.height as usize) - < display_str_len + BORDER_HEIGHT + BOTTOM_MARGIN - { - 0 - } else { - area.height - - (BORDER_HEIGHT + BOTTOM_MARGIN) as u16 - - display_str_len as u16 - }; + // draw menu + let mut display_vec: Vec<String> = self + .keymap + .as_ref() + .iter() + .map(|(k, v)| format!(" {} {}", k.to_string(), v)) + .collect(); + display_vec.sort(); + let display_str: Vec<&str> = display_vec.iter().map(|v| v.as_str()).collect(); + let display_str_len = display_str.len(); - let menu_height = if display_str_len + BORDER_HEIGHT > area.height as usize { - area.height - } else { - (display_str_len + BORDER_HEIGHT) as u16 - }; + let y = if (area.height as usize) < display_str_len + BORDER_HEIGHT + BOTTOM_MARGIN { + 0 + } else { + area.height - (BORDER_HEIGHT + BOTTOM_MARGIN) as u16 - display_str_len as u16 + }; - let menu_rect = Rect { - x: 0, - y, - width: area.width, - height: menu_height, - }; + let menu_height = if display_str_len + BORDER_HEIGHT > area.height as usize { + area.height + } else { + (display_str_len + BORDER_HEIGHT) as u16 + }; - frame.render_widget(Clear, menu_rect); - frame.render_widget(TuiMenu::new(&display_str), menu_rect); - } - }); + let menu_rect = Rect { + x: 0, + y, + width: area.width, + height: menu_height, + }; - if let Ok(event) = context.poll_event() { - match event { - AppEvent::Termion(event) => { - match event { - Event::Key(Key::Esc) => return None, - event => match map.as_ref().get(&event) { - Some(CommandKeybind::SimpleKeybind(s)) => { - return Some(s); - } - Some(CommandKeybind::CompositeKeybind(m)) => { - map = m; - } - None => return None, - }, - } - context.flush_event(); - } - event => input::process_noninteractive(event, context), - } - } - } + Clear.render(menu_rect, buf); + TuiMenu::new(&display_str).render(menu_rect, buf); } } diff --git a/src/ui/views/tui_folder_view.rs b/src/ui/views/tui_folder_view.rs index 4f64fc0..398c3d8 100644 --- a/src/ui/views/tui_folder_view.rs +++ b/src/ui/views/tui_folder_view.rs @@ -122,12 +122,12 @@ impl<'a> Widget for TuiFolderView<'a> { // render parent view if let Some(list) = parent_list.as_ref() { - TuiDirList::new(&list).render(layout_rect[0], buf); + TuiDirList::new(list).render(layout_rect[0], buf); } // render current view if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(&list).render(layout_rect[1], buf); + TuiDirListDetailed::new(list).render(layout_rect[1], buf); let rect = Rect { x: 0, y: area.height - 1, @@ -144,7 +144,7 @@ impl<'a> Widget for TuiFolderView<'a> { .wrap(Wrap { trim: true }) .render(rect, buf); } else if let Some(msg) = self.context.message_queue_ref().current_message() { - let text = Span::styled(msg.content.as_str(), msg.style.clone()); + let text = Span::styled(msg.content.as_str(), msg.style); Paragraph::new(text) .wrap(Wrap { trim: true }) .render(rect, buf); @@ -156,7 +156,7 @@ impl<'a> Widget for TuiFolderView<'a> { // render preview if let Some(list) = child_list.as_ref() { - TuiDirList::new(&list).render(layout_rect[2], buf); + TuiDirList::new(list).render(layout_rect[2], buf); } else if let Some(entry) = curr_entry { if let Some(Some(preview)) = preview_context.get_preview(entry.file_path()) { match preview.status.code() { diff --git a/src/ui/views/tui_textfield.rs b/src/ui/views/tui_textfield.rs index b664300..348c0f4 100644 --- a/src/ui/views/tui_textfield.rs +++ b/src/ui/views/tui_textfield.rs @@ -86,6 +86,8 @@ impl<'a> TuiTextField<'a> { let terminal = backend.terminal_mut(); let _ = terminal.show_cursor(); + let mut curr_history_index = context.commandline_context_ref().history_ref().len(); + loop { terminal .draw(|frame| { @@ -94,7 +96,7 @@ impl<'a> TuiTextField<'a> { return; } { - let mut view = TuiView::new(&context); + let mut view = TuiView::new(context); view.show_bottom_status = false; frame.render_widget(view, area); } @@ -186,8 +188,40 @@ impl<'a> TuiTextField<'a> { line_buffer.move_end(); completion_tracker.take(); } - Key::Up => {} - Key::Down => {} + Key::Up => { + curr_history_index = if curr_history_index > 0 { + curr_history_index - 1 + } else { + 0 + }; + line_buffer.move_home(); + line_buffer.kill_line(); + if let Some(s) = context + .commandline_context_ref() + .history_ref() + .get(curr_history_index) + { + line_buffer.insert_str(0, s); + } + } + Key::Down => { + curr_history_index = if curr_history_index + < context.commandline_context_ref().history_ref().len() + { + curr_history_index + 1 + } else { + curr_history_index + }; + line_buffer.move_home(); + line_buffer.kill_line(); + if let Some(s) = context + .commandline_context_ref() + .history_ref() + .get(curr_history_index) + { + line_buffer.insert_str(0, s); + } + } Key::Esc => { let _ = terminal.hide_cursor(); return None; diff --git a/src/ui/views/tui_worker_view.rs b/src/ui/views/tui_worker_view.rs index 08ed38d..ace4805 100644 --- a/src/ui/views/tui_worker_view.rs +++ b/src/ui/views/tui_worker_view.rs @@ -1,60 +1,36 @@ -use termion::event::{Event, Key}; - +use tui::buffer::Buffer; use tui::layout::Rect; +use tui::widgets::Widget; use crate::context::AppContext; -use crate::event::AppEvent; use crate::ui::widgets::{TuiTopBar, TuiWorker}; -use crate::ui::TuiBackend; -use crate::util::input; -pub struct TuiWorkerView { - exit_key: Key, +pub struct TuiWorkerView<'a> { + context: &'a AppContext, } -impl TuiWorkerView { - pub fn new(exit_key: Key) -> Self { - Self { exit_key } +impl<'a> TuiWorkerView<'a> { + pub fn new(context: &'a AppContext) -> Self { + Self { context } } +} - pub fn display(&self, context: &mut AppContext, backend: &mut TuiBackend) { - let terminal = backend.terminal_mut(); - - loop { - let _ = terminal.draw(|frame| { - let area: Rect = frame.size(); - if area.height == 0 { - return; - } - - let rect = Rect { height: 1, ..area }; - let curr_tab = context.tab_context_ref().curr_tab_ref(); - let view = TuiTopBar::new(context, curr_tab.cwd()); - frame.render_widget(view, rect); - - let rect = Rect { - x: 0, - y: 1, - width: area.width, - height: area.height - 1, - }; - let view = TuiWorker::new(&context); - frame.render_widget(view, rect); - }); - - if let Ok(event) = context.poll_event() { - match event { - AppEvent::Termion(event) => { - match event { - Event::Key(Key::Esc) => break, - Event::Key(k) if k == self.exit_key => break, - _ => {} - } - context.flush_event(); - } - event => input::process_noninteractive(event, context), - }; - } +impl<'a> Widget for TuiWorkerView<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + if area.height == 0 { + return; } + + let rect = Rect { height: 1, ..area }; + let curr_tab = self.context.tab_context_ref().curr_tab_ref(); + TuiTopBar::new(self.context, curr_tab.cwd()).render(rect, buf); + + let rect = Rect { + x: 0, + y: 1, + width: area.width, + height: area.height - 1, + }; + TuiWorker::new(self.context.worker_context_ref()).render(rect, buf); } } diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index a43d4f6..e03f084 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -85,7 +85,7 @@ fn print_entry( .metadata .directory_size() .map(|n| n.to_string()) - .unwrap_or("".to_string()), + .unwrap_or_else(|| "".to_string()), FileType::File => format::file_size_to_string(entry.metadata.len()), }; let symlink_string = match entry.metadata.link_type() { @@ -167,7 +167,7 @@ pub fn trim_file_label(name: &str, drawing_width: usize) -> String { let truncated_stem = stem.trunc(stem_width - 3); format!("{}{}.{}", truncated_stem, ELLIPSIS, ELLIPSIS) } else if ext_width == drawing_width { - extension.replacen('.', ELLIPSIS, 1).to_string() + extension.replacen('.', ELLIPSIS, 1) } else { let stem_width = drawing_width - ext_width; let truncated_stem = stem.trunc(stem_width - 1); diff --git a/src/ui/widgets/tui_prompt.rs b/src/ui/widgets/tui_prompt.rs index ec947a9..bc1b210 100644 --- a/src/ui/widgets/tui_prompt.rs +++ b/src/ui/widgets/tui_prompt.rs @@ -31,7 +31,7 @@ impl<'a> TuiPrompt<'a> { } { - let mut view = TuiView::new(&context); + let mut view = TuiView::new(context); view.show_bottom_status = false; frame.render_widget(view, f_size); } diff --git a/src/ui/widgets/tui_worker.rs b/src/ui/widgets/tui_worker.rs index 110d694..f9e544d 100644 --- a/src/ui/widgets/tui_worker.rs +++ b/src/ui/widgets/tui_worker.rs @@ -3,23 +3,23 @@ use tui::layout::Rect; use tui::style::{Color, Modifier, Style}; use tui::widgets::Widget; -use crate::context::AppContext; +use crate::context::WorkerContext; use crate::io::FileOp; use crate::util::format; pub struct TuiWorker<'a> { - pub context: &'a AppContext, + pub context: &'a WorkerContext, } impl<'a> TuiWorker<'a> { - pub fn new(context: &'a AppContext) -> Self { + pub fn new(context: &'a WorkerContext) -> Self { Self { context } } } impl<'a> Widget for TuiWorker<'a> { fn render(self, area: Rect, buf: &mut Buffer) { - match self.context.worker_context_ref().worker_ref() { + match self.context.worker_ref() { Some(io_obs) => { if let Some(progress) = io_obs.progress.as_ref() { let op_str = match progress.kind() { @@ -59,7 +59,7 @@ impl<'a> Widget for TuiWorker<'a> { buf.set_stringn(0, 5, "Queue:", area.width as usize, style); let style = Style::default(); - for (i, worker) in self.context.worker_context_ref().iter().enumerate() { + for (i, worker) in self.context.iter().enumerate() { let op_str = match worker.kind() { FileOp::Copy => "Copy", FileOp::Cut => "Move", |