use std::cell::RefCell;
use std::rc::Rc;
use crate::OsString;
use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle};
use duplicate_destroyer::{ProgressIndicator, ProgressMultiline};
pub struct MultiProgressBar {
multiprogress: MultiProgress,
dir_spinner: ProgressBar,
}
impl MultiProgressBar {
pub fn new() -> Self {
Self { multiprogress: MultiProgress::new(), dir_spinner: ProgressBar::new_spinner() }
}
}
impl ProgressMultiline for MultiProgressBar {
fn create(
&mut self,
_message: String,
total_iterations: u64,
) -> Rc<RefCell<dyn ProgressIndicator>> {
self.multiprogress = MultiProgress::with_draw_target(ProgressDrawTarget::stderr_with_hz(5));
let spinner_style = ProgressStyle::with_template("{spinner} {wide_msg}")
.unwrap()
.tick_strings(&["▹▹▹▹", "▸▹▹▹", "▹▸▹▹", "▹▹▸▹", "▹▹▹▸", "▪▪▪▪"]);
let dir_spinner = ProgressBar::new_spinner().with_style(spinner_style);
self.dir_spinner = self.multiprogress.add(dir_spinner);
let pb_style = ProgressStyle::with_template(
"{msg} [{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7}",
)
.unwrap()
.progress_chars("##-");
let checksum_pb = ProgressBar::new(total_iterations)
.with_style(pb_style)
.with_message("Calculating hashes:");
let mut out_progress = Progress::new();
out_progress.set_progress_bar(self.multiprogress.add(checksum_pb));
Rc::new(RefCell::new(out_progress))
}
fn update_dir(&self, new_dir: OsString) {
self.dir_spinner.set_message(format!("Checking directories: {:?}", new_dir));
self.dir_spinner.tick();
}
fn finalise(&self) {
self.dir_spinner.finish_with_message("Checking directories: Done");
}
fn debug_string(&self) -> String {
"AddDirBar".into()
}
}
pub struct Progress {
progress_bar: ProgressBar,
}
impl Progress {
pub fn new() -> Self {
Self { progress_bar: ProgressBar::new(0) }
}
pub fn set_progress_bar(&mut self, new_pb: ProgressBar) {
self.progress_bar = new_pb;
}
}
impl ProgressIndicator for Progress {
fn create(&mut self, message: String, _total_iterations: u64) {
let spinner_style = ProgressStyle::with_template("{spinner} {wide_msg}")
.unwrap()
.tick_strings(&["▹▹▹▹", "▸▹▹▹", "▹▸▹▹", "▹▹▸▹", "▹▹▹▸", "▪▪▪▪"]);
self.progress_bar =
ProgressBar::new_spinner().with_style(spinner_style).with_message(message);
}
fn update(&self, iterations_done: u64) {
self.progress_bar.set_position(iterations_done)
}
fn finalise(&self) {
self.progress_bar.finish()
}
fn debug_string(&self) -> String {
"Progress Bar".to_string()
}
}