diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2023-02-09 22:41:31 -0500 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2023-02-09 22:41:31 -0500 |
commit | 7843a4550b8f4bf962e8e70968a4634f44ee5822 (patch) | |
tree | 1511d829269b27da6fe628f76b2f1e6db719d420 | |
parent | d472689177e8c0109fad0668645d2fb0830a0c05 (diff) |
make progress view better
-rw-r--r-- | src/ui/widgets/tui_worker.rs | 136 |
1 files changed, 99 insertions, 37 deletions
diff --git a/src/ui/widgets/tui_worker.rs b/src/ui/widgets/tui_worker.rs index cb6460e..4edfa22 100644 --- a/src/ui/widgets/tui_worker.rs +++ b/src/ui/widgets/tui_worker.rs @@ -4,6 +4,7 @@ use tui::style::{Color, Modifier, Style}; use tui::widgets::Widget; use crate::context::WorkerContext; +use crate::io::{FileOperationProgress, IoWorkerObserver}; use crate::util::format; pub struct TuiWorker<'a> { @@ -21,32 +22,11 @@ impl<'a> Widget for TuiWorker<'a> { match self.context.worker_ref() { Some(io_obs) => { if let Some(progress) = io_obs.progress.as_ref() { - let op_str = progress.kind().actioning_str(); - - let processed_size = format::file_size_to_string(progress.bytes_processed()); - let total_size = format::file_size_to_string(progress.total_bytes()); - - let msg = format!( - "{} ({}/{}) ({}/{}) {:?}", - op_str, - progress.files_processed() + 1, - progress.total_files(), - processed_size, - total_size, - io_obs.dest_path() - ); - - let style = Style::default(); - buf.set_stringn(0, 2, msg, area.width as usize, style); - - // draw a progress bar - let progress_bar_width = (progress.files_processed() as f32 - / progress.total_files() as f32 - * area.width as f32) as usize; - - let progress_bar_space = " ".repeat(progress_bar_width); - let style = Style::default().bg(Color::Blue); - buf.set_stringn(0, 3, progress_bar_space, area.width as usize, style); + let current_area = Rect { + y: area.y + 1, + ..area + }; + TuiCurrentWorker::new(io_obs, progress).render(current_area, buf); // draw queued up work let style = Style::default() @@ -54,17 +34,11 @@ impl<'a> Widget for TuiWorker<'a> { .add_modifier(Modifier::BOLD); buf.set_stringn(0, 5, "Queue:", area.width as usize, style); - let style = Style::default(); - for (i, worker) in self.context.iter().enumerate() { - let msg = format!( - "{:02} {} {} items {:?}", - i + 1, - worker.kind(), - worker.paths.len(), - worker.dest - ); - buf.set_stringn(0, (5 + i + 2) as u16, msg, area.width as usize, style); - } + let queue_area = Rect { + y: area.y + 7, + ..area + }; + TuiWorkerQueue::new(self.context).render(queue_area, buf); } } _ => { @@ -78,3 +52,91 @@ impl<'a> Widget for TuiWorker<'a> { } } } + +pub struct TuiCurrentWorker<'a> { + pub observer: &'a IoWorkerObserver, + pub progress: &'a FileOperationProgress, +} + +impl<'a> TuiCurrentWorker<'a> { + pub fn new(observer: &'a IoWorkerObserver, progress: &'a FileOperationProgress) -> Self { + Self { observer, progress } + } +} + +impl<'a> Widget for TuiCurrentWorker<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + let top = area.top(); + let left = area.left(); + let right = area.right(); + + let op_str = self.progress.kind().actioning_str(); + + let processed_size = format::file_size_to_string(self.progress.bytes_processed()); + let total_size = format::file_size_to_string(self.progress.total_bytes()); + + let msg = format!( + "{} ({}/{}) ({}/{})\n", + op_str, + self.progress.files_processed() + 1, + self.progress.total_files(), + processed_size, + total_size, + ); + buf.set_stringn(left, top, msg, right as usize, Style::default()); + + buf.set_stringn( + left, + top + 1, + format!("{:?}\n", self.observer.dest_path()), + right as usize, + Style::default(), + ); + + // draw a progress bar + let progress_bar_width = (self.progress.files_processed() as f32 + / self.progress.total_files() as f32 + * area.width as f32) as usize; + let progress_bar_space = " ".repeat(progress_bar_width); + let progress_bar_style = Style::default().bg(Color::Blue); + buf.set_stringn( + left, + top + 2, + progress_bar_space, + right as usize, + progress_bar_style, + ); + } +} + +pub struct TuiWorkerQueue<'a> { + pub context: &'a WorkerContext, +} + +impl<'a> TuiWorkerQueue<'a> { + pub fn new(context: &'a WorkerContext) -> Self { + Self { context } + } +} + +impl<'a> Widget for TuiWorkerQueue<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + let top = area.top(); + let left = area.left(); + let right = area.right(); + let width = right - left; + + let style = Style::default(); + + for (i, worker) in self.context.iter().enumerate() { + let msg = format!( + "{:02} {} {} items {:?}", + i + 1, + worker.kind(), + worker.paths.len(), + worker.dest + ); + buf.set_stringn(left, (top as usize + i) as u16, msg, width as usize, style); + } + } +} |