diff --git a/src/appstate.rs b/src/appstate.rs
index 927b37e..8223df8 100644
--- a/src/appstate.rs
+++ b/src/appstate.rs
@@ -1,8 +1,4 @@
-use std::{
- cell::{Ref, RefCell},
- fmt, io,
- time::Duration,
-};
+use std::{cell::RefCell, fmt, io, time::Duration};
use console::style;
use indicatif::{ProgressBar, ProgressStyle};
@@ -11,7 +7,7 @@ use log::{debug, warn};
use crate::{
cachefile::CacheFile,
cli::Cli,
- file::{self, Chunk, FileTrait},
+ file::{Chunk, FileTrait},
sharry::{self, Client},
};
@@ -61,10 +57,14 @@ impl AppState {
Ok(Self::new(http, CacheFile::from_args(args, share_id)))
}
- fn get_or_create_progressbar(&self, uploading: &file::Uploading) -> Ref<'_, ProgressBar> {
+ fn with_progressbar(&self, drop_bar: bool, f: impl FnOnce(&ProgressBar)) {
+ let Some(upl) = self.inner.peek_uploading() else {
+ return;
+ };
+
let mut slot = self.progress.borrow_mut();
if slot.is_none() {
- let bar = ProgressBar::new(uploading.get_size())
+ let bar = ProgressBar::no_length()
.with_style(
ProgressStyle::with_template(&format!(
concat!(
@@ -76,75 +76,68 @@ impl AppState {
))
.expect("style template is not valid"),
)
- .with_position(uploading.get_offset())
- .with_message(uploading.get_name().to_owned());
+ .with_message(upl.get_name().to_owned());
bar.enable_steady_tick(Duration::from_millis(100));
*slot = Some(bar);
}
- drop(slot);
- Ref::map(self.progress.borrow(), |opt| {
- opt.as_ref().expect("somehow the slot holds None")
- })
- }
+ let bar = slot.as_ref().expect("somehow the slot holds None");
- fn end_progressbar(&self, f: impl FnOnce(&ProgressBar)) {
- let mut slot = self.progress.borrow_mut();
- if let Some(bar) = slot.as_ref() {
- f(bar);
+ bar.set_position(upl.get_offset());
+ // BUG in `indicatif` crate?
+ // `set_position` does not force an immediate redraw, so we need to call `set_length` after
+ bar.set_length(upl.get_size());
+
+ f(bar);
+
+ if drop_bar {
*slot = None;
}
}
- fn next_chunk<'t>(&mut self, buffer: &'t mut [u8]) -> io::Result