summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2023-02-09 22:41:31 -0500
committerJeff Zhao <jeff.no.zhao@gmail.com>2023-02-09 22:41:31 -0500
commit7843a4550b8f4bf962e8e70968a4634f44ee5822 (patch)
tree1511d829269b27da6fe628f76b2f1e6db719d420
parentd472689177e8c0109fad0668645d2fb0830a0c05 (diff)
make progress view better
-rw-r--r--src/ui/widgets/tui_worker.rs136
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);
+ }
+ }
+}