fast_down_gui/core/
progress.rs1use crate::ui::Progress;
2use fast_down_ffi::ProgressEntry;
3use slint::{Model, ModelRc, VecModel};
4use std::rc::Rc;
5
6pub fn apply_progress_diff(
7 model_handle: &ModelRc<Progress>,
8 new_ranges: &[ProgressEntry],
9 total_size: u64,
10) -> ModelRc<Progress> {
11 #![allow(clippy::needless_range_loop)]
12
13 if total_size == 0 {
14 return model_handle.clone();
15 }
16 let total_f = total_size as f32;
17 let model = model_handle
18 .as_any()
19 .downcast_ref::<Rc<VecModel<Progress>>>()
20 .cloned()
21 .unwrap_or_default();
22
23 let old_len = model.row_count();
24 let new_len = new_ranges.len();
25
26 for i in 0..old_len.min(new_len) {
27 let r = &new_ranges[i];
28 let new_val = Progress {
29 start: r.start as f32 / total_f,
30 width: (r.end - r.start) as f32 / total_f,
31 };
32 if model.row_data(i).as_ref() != Some(&new_val) {
33 model.set_row_data(i, new_val);
34 }
35 }
36
37 if new_len > old_len {
38 for i in old_len..new_len {
39 let r = &new_ranges[i];
40 model.push(Progress {
41 start: r.start as f32 / total_f,
42 width: (r.end - r.start) as f32 / total_f,
43 });
44 }
45 } else if old_len > new_len {
46 for i in (new_len..old_len).rev() {
47 model.remove(i);
48 }
49 }
50 model.into()
51}