fast-down-gui 0.1.45

超级快的下载器图形化界面
Documentation
use crate::ui::Progress;
use fast_down_ffi::ProgressEntry;
use slint::{Model, ModelRc, VecModel};
use std::rc::Rc;

pub fn apply_progress_diff(
    model_handle: &ModelRc<Progress>,
    new_ranges: &[ProgressEntry],
    total_size: u64,
) -> ModelRc<Progress> {
    #![allow(clippy::needless_range_loop)]

    if total_size == 0 {
        return model_handle.clone();
    }
    let total_f = total_size as f32;
    let model = model_handle
        .as_any()
        .downcast_ref::<Rc<VecModel<Progress>>>()
        .cloned()
        .unwrap_or_default();

    let old_len = model.row_count();
    let new_len = new_ranges.len();

    for i in 0..old_len.min(new_len) {
        let r = &new_ranges[i];
        let new_val = Progress {
            start: r.start as f32 / total_f,
            width: (r.end - r.start) as f32 / total_f,
        };
        if model.row_data(i).as_ref() != Some(&new_val) {
            model.set_row_data(i, new_val);
        }
    }

    if new_len > old_len {
        for i in old_len..new_len {
            let r = &new_ranges[i];
            model.push(Progress {
                start: r.start as f32 / total_f,
                width: (r.end - r.start) as f32 / total_f,
            });
        }
    } else if old_len > new_len {
        for i in (new_len..old_len).rev() {
            model.remove(i);
        }
    }
    model.into()
}