summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/views/tui_command_menu.rs122
-rw-r--r--src/ui/views/tui_folder_view.rs8
-rw-r--r--src/ui/views/tui_textfield.rs40
-rw-r--r--src/ui/views/tui_worker_view.rs72
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs4
-rw-r--r--src/ui/widgets/tui_prompt.rs2
-rw-r--r--src/ui/widgets/tui_worker.rs10
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",