fast_down_gui/persist/
entry.rs1use 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}