mirror of
https://github.com/ankitects/anki.git
synced 2025-09-23 08:22:24 -04:00
Update progress when checking incoming media too
This commit is contained in:
parent
6eb8aa0987
commit
8c1a4d0cdd
2 changed files with 33 additions and 6 deletions
|
@ -32,20 +32,41 @@ pub(super) struct MediaUseMap {
|
||||||
unchecked: Vec<SafeMediaEntry>,
|
unchecked: Vec<SafeMediaEntry>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ProgressHandler<F: FnMut(usize) -> Result<()>> {
|
||||||
|
progress_fn: F,
|
||||||
|
counter: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F: FnMut(usize) -> Result<()>> ProgressHandler<F> {
|
||||||
|
fn new(progress_fn: F) -> Self {
|
||||||
|
Self {
|
||||||
|
progress_fn,
|
||||||
|
counter: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn increment(&mut self) -> Result<()> {
|
||||||
|
self.counter += 1;
|
||||||
|
if self.counter % 17 == 0 {
|
||||||
|
(self.progress_fn)(self.counter)
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Context<'_> {
|
impl Context<'_> {
|
||||||
pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> {
|
pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> {
|
||||||
let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok();
|
let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok();
|
||||||
let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?;
|
let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?;
|
||||||
prepare_media(&mut self.archive, &existing_sha1s)
|
prepare_media(&mut self.archive, &existing_sha1s, &mut self.progress_fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> {
|
pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> {
|
||||||
let mut counter = 0;
|
let mut progress =
|
||||||
|
ProgressHandler::new(|u| (&mut self.progress_fn)(ImportProgress::Media(u)));
|
||||||
for entry in media_map.used_entries() {
|
for entry in media_map.used_entries() {
|
||||||
counter += 1;
|
progress.increment()?;
|
||||||
if counter % 10 == 0 {
|
|
||||||
(self.progress_fn)(ImportProgress::Media(counter))?;
|
|
||||||
}
|
|
||||||
entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?;
|
entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -65,9 +86,14 @@ impl Collection {
|
||||||
fn prepare_media(
|
fn prepare_media(
|
||||||
archive: &mut ZipArchive<File>,
|
archive: &mut ZipArchive<File>,
|
||||||
existing_sha1s: &HashMap<String, [u8; 20]>,
|
existing_sha1s: &HashMap<String, [u8; 20]>,
|
||||||
|
progress_fn: &mut impl FnMut(ImportProgress) -> Result<()>,
|
||||||
) -> Result<MediaUseMap> {
|
) -> Result<MediaUseMap> {
|
||||||
let mut media_map = MediaUseMap::default();
|
let mut media_map = MediaUseMap::default();
|
||||||
|
let mut progress = ProgressHandler::new(|u| progress_fn(ImportProgress::MediaCheck(u)));
|
||||||
|
|
||||||
for mut entry in extract_media_entries(&Meta::new_legacy(), archive)? {
|
for mut entry in extract_media_entries(&Meta::new_legacy(), archive)? {
|
||||||
|
progress.increment()?;
|
||||||
|
|
||||||
if entry.is_static() {
|
if entry.is_static() {
|
||||||
if !existing_sha1s.contains_key(&entry.name) {
|
if !existing_sha1s.contains_key(&entry.name) {
|
||||||
media_map.unchecked.push(entry);
|
media_map.unchecked.push(entry);
|
||||||
|
|
|
@ -40,6 +40,7 @@ impl Collection {
|
||||||
path: impl AsRef<Path>,
|
path: impl AsRef<Path>,
|
||||||
progress_fn: &mut ProgressFn,
|
progress_fn: &mut ProgressFn,
|
||||||
) -> Result<OpOutput<NoteLog>> {
|
) -> Result<OpOutput<NoteLog>> {
|
||||||
|
progress_fn(ImportProgress::Collection)?;
|
||||||
let file = File::open(path)?;
|
let file = File::open(path)?;
|
||||||
let archive = ZipArchive::new(file)?;
|
let archive = ZipArchive::new(file)?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue