Skip to main content

fast_down_gui/core/
progress.rs

1use 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}