diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-12-11 21:07:13 -0500 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-12-11 21:07:13 -0500 |
commit | 916d72c42cfc7bcb8fc560e17cb3bd75c00757da (patch) | |
tree | a8024fc9bd9a48065cd6b65375109482ac9b7983 /src/ui | |
parent | bf9c102a4cfb85a9fd910195e6372dcd1d062c16 (diff) |
add a view for showing worker progress
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/mod.rs | 1 | ||||
-rw-r--r-- | src/ui/tui_backend.rs | 4 | ||||
-rw-r--r-- | src/ui/views/mod.rs | 7 | ||||
-rw-r--r-- | src/ui/views/tui_folder_view.rs (renamed from src/ui/widgets/tui_folder_view.rs) | 2 | ||||
-rw-r--r-- | src/ui/views/tui_progress_view.rs (renamed from src/ui/widgets/tui_progress_view.rs) | 0 | ||||
-rw-r--r-- | src/ui/views/tui_view.rs (renamed from src/ui/widgets/tui_view.rs) | 2 | ||||
-rw-r--r-- | src/ui/views/tui_worker_view.rs | 55 | ||||
-rw-r--r-- | src/ui/widgets/mod.rs | 8 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 2 | ||||
-rw-r--r-- | src/ui/widgets/tui_menu.rs | 4 | ||||
-rw-r--r-- | src/ui/widgets/tui_prompt.rs | 5 | ||||
-rw-r--r-- | src/ui/widgets/tui_textfield.rs | 19 | ||||
-rw-r--r-- | src/ui/widgets/tui_worker.rs | 94 | ||||
-rw-r--r-- | src/ui/widgets/tui_worker_view.rs | 79 |
14 files changed, 180 insertions, 102 deletions
diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 844a70c..b5c98c8 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,6 +1,7 @@ use tui::layout::Constraint; mod tui_backend; +pub mod views; pub mod widgets; pub use tui_backend::*; diff --git a/src/ui/tui_backend.rs b/src/ui/tui_backend.rs index 395f081..2294737 100644 --- a/src/ui/tui_backend.rs +++ b/src/ui/tui_backend.rs @@ -30,7 +30,7 @@ impl TuiBackend { where W: Widget, { - self.terminal_mut().draw(|frame| { + let _ = self.terminal_mut().draw(|frame| { let rect = frame.size(); frame.render_widget(widget, rect); }); @@ -44,7 +44,7 @@ impl TuiBackend { pub fn terminal_drop(&mut self) { let _ = self.terminal.take(); - stdout().flush(); + let _ = stdout().flush(); } pub fn terminal_restore(&mut self) -> std::io::Result<()> { diff --git a/src/ui/views/mod.rs b/src/ui/views/mod.rs new file mode 100644 index 0000000..e6b1c41 --- /dev/null +++ b/src/ui/views/mod.rs @@ -0,0 +1,7 @@ +mod tui_folder_view; +mod tui_view; +mod tui_worker_view; + +pub use self::tui_folder_view::TuiFolderView; +pub use self::tui_view::TuiView; +pub use self::tui_worker_view::TuiWorkerView; diff --git a/src/ui/widgets/tui_folder_view.rs b/src/ui/views/tui_folder_view.rs index 01dcf2b..cd8283d 100644 --- a/src/ui/widgets/tui_folder_view.rs +++ b/src/ui/views/tui_folder_view.rs @@ -4,8 +4,8 @@ use tui::style::{Color, Style}; use tui::text::Span; use tui::widgets::{Paragraph, Widget, Wrap}; -use super::{TuiDirList, TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; use crate::context::JoshutoContext; +use crate::ui::widgets::{TuiDirList, TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; const TAB_VIEW_WIDTH: u16 = 15; diff --git a/src/ui/widgets/tui_progress_view.rs b/src/ui/views/tui_progress_view.rs index 9dad78f..9dad78f 100644 --- a/src/ui/widgets/tui_progress_view.rs +++ b/src/ui/views/tui_progress_view.rs diff --git a/src/ui/widgets/tui_view.rs b/src/ui/views/tui_view.rs index f86eaec..81512b5 100644 --- a/src/ui/widgets/tui_view.rs +++ b/src/ui/views/tui_view.rs @@ -5,8 +5,6 @@ use tui::widgets::Widget; use super::TuiFolderView; use crate::context::JoshutoContext; -const TAB_VIEW_WIDTH: u16 = 15; - pub struct TuiView<'a> { pub context: &'a JoshutoContext, pub show_bottom_status: bool, diff --git a/src/ui/views/tui_worker_view.rs b/src/ui/views/tui_worker_view.rs new file mode 100644 index 0000000..536c45a --- /dev/null +++ b/src/ui/views/tui_worker_view.rs @@ -0,0 +1,55 @@ +use termion::event::Key; + +use tui::layout::Rect; + +use crate::context::JoshutoContext; +use crate::ui::widgets::TuiWorker; +use crate::ui::TuiBackend; +use crate::util::event::Event; +use crate::util::worker; + +pub struct TuiWorkerView {} + +impl TuiWorkerView { + pub fn new() -> Self { + Self {} + } + + pub fn display(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) { + context.flush_event(); + let terminal = backend.terminal_mut(); + + loop { + let _ = terminal.draw(|frame| { + let f_size: Rect = frame.size(); + if f_size.height == 0 { + return; + } + { + let view = TuiWorker::new(&context); + frame.render_widget(view, f_size); + } + }); + + if let Ok(event) = context.poll_event() { + match event { + Event::IOWorkerProgress(res) => { + worker::process_worker_progress(context, res); + } + Event::IOWorkerResult(res) => { + worker::process_finished_worker(context, res); + } + Event::Input(key) => { + match key { + Key::Esc => { + break; + } + _ => {} + } + context.flush_event(); + } + }; + } + } + } +} diff --git a/src/ui/widgets/mod.rs b/src/ui/widgets/mod.rs index fe756a3..b09b4df 100644 --- a/src/ui/widgets/mod.rs +++ b/src/ui/widgets/mod.rs @@ -1,23 +1,19 @@ mod tui_dirlist; mod tui_dirlist_detailed; -mod tui_folder_view; mod tui_footer; mod tui_menu; mod tui_prompt; mod tui_tab; mod tui_textfield; mod tui_topbar; -mod tui_view; -mod tui_worker_view; +mod tui_worker; pub use self::tui_dirlist::TuiDirList; pub use self::tui_dirlist_detailed::TuiDirListDetailed; -pub use self::tui_folder_view::TuiFolderView; 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; -pub use self::tui_worker_view::TuiWorkerView; +pub use self::tui_worker::TuiWorker; diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index c76e198..70330c9 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -66,7 +66,7 @@ impl<'a> Widget for TuiDirListDetailed<'a> { buf.set_string(x + area_width as u16 - 1, y + i as u16, "…", style); } } - FileType::Symlink(p) => { + FileType::Symlink(_) => { if name_width < area_width - 4 { buf.set_string(x, y + i as u16, name, style); buf.set_string(x + area_width as u16 - 4, y + i as u16, "->", style); diff --git a/src/ui/widgets/tui_menu.rs b/src/ui/widgets/tui_menu.rs index 80a3d3a..f7c9080 100644 --- a/src/ui/widgets/tui_menu.rs +++ b/src/ui/widgets/tui_menu.rs @@ -6,10 +6,10 @@ use tui::layout::Rect; use tui::style::{Color, Style}; use tui::widgets::{Block, Borders, Clear, Widget}; -use super::TuiView; use crate::commands::{CommandKeybind, KeyCommand}; use crate::config::JoshutoCommandMapping; use crate::context::JoshutoContext; +use crate::ui::views::TuiView; use crate::ui::TuiBackend; use crate::util::event::Event; use crate::util::worker; @@ -63,7 +63,7 @@ impl TuiCommandMenu { context.flush_event(); loop { - terminal.draw(|frame| { + let _ = terminal.draw(|frame| { let f_size: Rect = frame.size(); { diff --git a/src/ui/widgets/tui_prompt.rs b/src/ui/widgets/tui_prompt.rs index ea6aa49..f520de9 100644 --- a/src/ui/widgets/tui_prompt.rs +++ b/src/ui/widgets/tui_prompt.rs @@ -5,12 +5,11 @@ use tui::text::Span; use tui::widgets::{Clear, Paragraph, Wrap}; use crate::context::JoshutoContext; +use crate::ui::views::TuiView; use crate::ui::TuiBackend; use crate::util::event::Event; use crate::util::worker; -use super::TuiView; - pub struct TuiPrompt<'a> { prompt: &'a str, } @@ -25,7 +24,7 @@ impl<'a> TuiPrompt<'a> { context.flush_event(); loop { - terminal.draw(|frame| { + let _ = terminal.draw(|frame| { let f_size: Rect = frame.size(); if f_size.height == 0 { return; diff --git a/src/ui/widgets/tui_textfield.rs b/src/ui/widgets/tui_textfield.rs index 0e413fc..07f38b8 100644 --- a/src/ui/widgets/tui_textfield.rs +++ b/src/ui/widgets/tui_textfield.rs @@ -8,12 +8,12 @@ use tui::text::{Span, Spans}; use tui::widgets::{Clear, Paragraph, Wrap}; use crate::context::JoshutoContext; +use crate::ui::views::TuiView; +use crate::ui::widgets::TuiMenu; use crate::ui::TuiBackend; use crate::util::event::Event; use crate::util::worker; -use super::{TuiMenu, TuiView}; - struct CompletionTracker { pub index: usize, pub pos: usize, @@ -40,6 +40,15 @@ pub struct TuiTextField<'a> { } impl<'a> TuiTextField<'a> { + pub fn new() -> Self { + Self { + _prompt: "", + _prefix: "", + _suffix: "", + _menu_items: None, + } + } + pub fn menu_items<I>(&mut self, items: I) -> &mut Self where I: Iterator<Item = &'a str>, @@ -90,7 +99,6 @@ impl<'a> TuiTextField<'a> { if f_size.height == 0 { return; } - { let mut view = TuiView::new(&context); view.show_bottom_status = false; @@ -98,7 +106,8 @@ impl<'a> TuiTextField<'a> { } if let Some(items) = self._menu_items.as_ref() { - let menu_len = items.len(); + let menu_widget = TuiMenu::new(items); + let menu_len = menu_widget.len(); let menu_y = if menu_len + 2 > f_size.height as usize { 0 } else { @@ -111,13 +120,11 @@ impl<'a> TuiTextField<'a> { width: f_size.width, height: menu_len as u16 + 1, }; - let menu_widget = TuiMenu::new(items); frame.render_widget(Clear, menu_rect); frame.render_widget(menu_widget, menu_rect); } let cursor_xpos = line_buffer.pos(); - let prefix = &line_buffer.as_str()[..cursor_xpos]; let curr = line_buffer.as_str()[cursor_xpos..].chars().next(); diff --git a/src/ui/widgets/tui_worker.rs b/src/ui/widgets/tui_worker.rs new file mode 100644 index 0000000..8707e5d --- /dev/null +++ b/src/ui/widgets/tui_worker.rs @@ -0,0 +1,94 @@ +use tui::buffer::Buffer; +use tui::layout::Rect; +use tui::style::{Color, Modifier, Style}; +use tui::text::Span; +use tui::widgets::{Paragraph, Widget, Wrap}; + +use crate::context::JoshutoContext; +use crate::io::FileOp; +use crate::ui::widgets::TuiTopBar; + +pub struct TuiWorker<'a> { + pub context: &'a JoshutoContext, +} + +impl<'a> TuiWorker<'a> { + pub fn new(context: &'a JoshutoContext) -> Self { + Self { context } + } +} + +impl<'a> Widget for TuiWorker<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + let f_size = area; + + let topbar_width = f_size.width; + + let curr_tab = self.context.tab_context_ref().curr_tab_ref(); + let rect = Rect { + x: 0, + y: 0, + width: topbar_width, + height: 1, + }; + TuiTopBar::new(curr_tab.pwd()).render(rect, buf); + + match self.context.worker_ref() { + Some(io_obs) => match io_obs.progress.as_ref() { + Some(progress) => { + let msg = match progress.kind() { + FileOp::Copy => format!( + "Copying ({}/{}) {:?} -> {:?}", + progress.index() + 1, + progress.len(), + io_obs.src_path(), + io_obs.dest_path() + ), + FileOp::Cut => format!( + "Moving ({}/{}) {:?} -> {:?}", + progress.index() + 1, + progress.len(), + io_obs.src_path(), + io_obs.dest_path() + ), + }; + let style = Style::default(); + buf.set_stringn(0, 2, msg, area.width as usize, style); + let style = Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD); + buf.set_stringn(0, 4, "Queue:", area.width as usize, style); + let style = Style::default(); + for (i, worker) in self.context.worker_iter().enumerate() { + let msg = match worker.kind() { + FileOp::Copy => format!( + "{:02} Copy {} items {:?} -> {:?}", + i + 1, + worker.paths.len(), + worker.paths[0].parent().unwrap(), + worker.dest + ), + FileOp::Cut => format!( + "{:02} Moving {} items {:?} -> {:?}", + i + 1, + worker.paths.len(), + worker.paths[0].parent().unwrap(), + worker.dest + ), + }; + buf.set_stringn(0, (4 + i + 2) as u16, msg, area.width as usize, style); + } + } + _ => {} + }, + _ => { + let style = Style::default(); + buf.set_stringn(0, 2, "No operations running", area.width as usize, style); + let style = Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD); + buf.set_stringn(0, 4, "Queue:", area.width as usize, style); + } + } + } +} diff --git a/src/ui/widgets/tui_worker_view.rs b/src/ui/widgets/tui_worker_view.rs deleted file mode 100644 index d17f7c2..0000000 --- a/src/ui/widgets/tui_worker_view.rs +++ /dev/null @@ -1,79 +0,0 @@ -use tui::buffer::Buffer; -use tui::layout::{Direction, Layout, Rect}; -use tui::style::{Color, Style}; -use tui::text::Span; -use tui::widgets::{Paragraph, Widget, Wrap}; - -use super::{TuiDirList, TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; -use crate::context::JoshutoContext; - -const TAB_VIEW_WIDTH: u16 = 15; - -pub struct TuiWorkerView<'a> { - pub context: &'a JoshutoContext, - pub show_bottom_status: bool, -} - -use super::super::{DEFAULT_LAYOUT, NO_PREVIEW_LAYOUT}; - -impl<'a> TuiWorkerView<'a> { - pub fn new(context: &'a JoshutoContext) -> Self { - Self { - context, - show_bottom_status: true, - } - } -} - -impl<'a> Widget for TuiWorkerView<'a> { - fn render(self, area: Rect, buf: &mut Buffer) { - let f_size = area; - - let curr_tab = self.context.tab_context_ref().curr_tab_ref(); - let layout_rect = Layout::default().direction(Direction::Horizontal).margin(1); - - if self.context.tab_context_ref().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_tab.pwd()).render(rect, buf); - - let rect = Rect { - x: topbar_width, - y: 0, - width: TAB_VIEW_WIDTH, - height: 1, - }; - let name = if let Some(ostr) = curr_tab.pwd().file_name() { - ostr.to_str().unwrap_or("") - } else { - "" - }; - TuiTabBar::new( - name, - self.context.tab_context_ref().get_index(), - self.context.tab_context_ref().len(), - ) - .render(rect, buf); - } else { - let topbar_width = f_size.width; - - let rect = Rect { - x: 0, - y: 0, - width: topbar_width, - height: 1, - }; - TuiTopBar::new(curr_tab.pwd()).render(rect, buf); - } - } -} |