summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-12-11 21:07:13 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-12-11 21:07:13 -0500
commit916d72c42cfc7bcb8fc560e17cb3bd75c00757da (patch)
treea8024fc9bd9a48065cd6b65375109482ac9b7983 /src/ui
parentbf9c102a4cfb85a9fd910195e6372dcd1d062c16 (diff)
add a view for showing worker progress
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/mod.rs1
-rw-r--r--src/ui/tui_backend.rs4
-rw-r--r--src/ui/views/mod.rs7
-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.rs55
-rw-r--r--src/ui/widgets/mod.rs8
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs2
-rw-r--r--src/ui/widgets/tui_menu.rs4
-rw-r--r--src/ui/widgets/tui_prompt.rs5
-rw-r--r--src/ui/widgets/tui_textfield.rs19
-rw-r--r--src/ui/widgets/tui_worker.rs94
-rw-r--r--src/ui/widgets/tui_worker_view.rs79
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);
- }
- }
-}