Skip to main content

fast_down_gui/persist/
entry.rs

1use crate::{
2    fmt::{format_size, format_time},
3    persist::DownloadConfig,
4    ui::EntryData,
5};
6use fast_down_ffi::{FileId, Total};
7use serde::{Deserialize, Serialize};
8use slint::{SharedString, VecModel};
9use std::{ops::Range, path::PathBuf, rc::Rc, time::Duration};
10use url::Url;
11
12#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
13pub struct DatabaseEntry {
14    pub file_name: String,
15    pub file_path: PathBuf,
16    pub file_size: u64,
17    pub file_id: FileId,
18    pub progress: Vec<Range<u64>>,
19    pub elapsed: Duration,
20    pub url: Url,
21    pub config: DownloadConfig,
22    pub status: Status,
23}
24
25impl DatabaseEntry {
26    pub fn to_entry_data(&self, gid: i32) -> EntryData {
27        let downloaded: u64 = self.progress.total();
28        let file_size = self.file_size;
29        let elapsed = self.elapsed;
30        let speed = downloaded as f64 / elapsed.as_secs_f64();
31        let speed_str: SharedString = format!("{}/s", format_size(speed)).into();
32        let remaining_size = file_size.saturating_sub(downloaded) as f64;
33        EntryData {
34            avg_speed: speed_str.clone(),
35            downloaded: format_size(downloaded as f64).into(),
36            filename: self.file_name.as_str().into(),
37            gid,
38            path: self.file_path.to_string_lossy().as_ref().into(),
39            percentage: format!("{:.2}%", downloaded as f64 / file_size as f64 * 100.).into(),
40            progress: if file_size > 0 {
41                Rc::new(VecModel::from_iter(self.progress.iter().map(|r| {
42                    crate::ui::Progress {
43                        start: r.start as f32 / file_size as f32,
44                        width: r.total() as f32 / file_size as f32,
45                    }
46                })))
47                .into()
48            } else {
49                Rc::new(VecModel::from_iter([])).into()
50            },
51            remaining_size: format_size(remaining_size).into(),
52            remaining_time: format_time((remaining_size / speed) as u64).into(),
53            speed: speed_str,
54            status: match self.status {
55                Status::Completed => crate::ui::Status::Completed,
56                Status::Error => crate::ui::Status::Error,
57                Status::Paused => crate::ui::Status::Paused,
58            },
59            time: format_time(elapsed.as_secs()).into(),
60            total: format_size(file_size as f64).into(),
61            error: SharedString::new(),
62        }
63    }
64}
65
66#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
67pub enum Status {
68    Completed,
69    Error,
70    Paused,
71}