cosmic_freedesktop_icons/theme/
directories.rs

1#[derive(Debug)]
2pub struct Directory<'a> {
3    pub name: &'a str,
4    pub size: i16,
5    pub scale: i16,
6    pub type_: DirectoryType,
7    pub maxsize: i16,
8    pub minsize: i16,
9    pub threshold: i16,
10}
11
12impl Directory<'_> {
13    pub fn match_size(&self, size: u16, scale: u16) -> bool {
14        let scale = scale as i16;
15        let size = size as i16;
16
17        if self.scale != scale {
18            false
19        } else {
20            match self.type_ {
21                DirectoryType::Fixed => self.size == size,
22                DirectoryType::Scalable => self.minsize <= size && size <= self.maxsize,
23                DirectoryType::Threshold => {
24                    self.size - self.threshold <= size && size <= self.size + self.threshold
25                }
26            }
27        }
28    }
29
30    pub fn directory_size_distance(&self, size: u16, scale: u16) -> i16 {
31        let scaled_size = self.size * self.scale;
32        let min_scaled_size = self.minsize * self.scale;
33        let max_scaled_size = self.maxsize * self.scale;
34        let scale = scale as i16;
35        let size = size as i16;
36        let scaled_requested_size = size * scale;
37
38        match self.type_ {
39            DirectoryType::Fixed => scaled_size - scaled_requested_size,
40            DirectoryType::Scalable => {
41                if scaled_requested_size < min_scaled_size {
42                    min_scaled_size - scaled_requested_size
43                } else if scaled_requested_size < max_scaled_size {
44                    scaled_requested_size - max_scaled_size
45                } else {
46                    0
47                }
48            }
49            DirectoryType::Threshold => {
50                if scaled_requested_size < (self.size - self.threshold) * scale {
51                    min_scaled_size - scaled_requested_size
52                } else if scaled_requested_size > (self.size + self.threshold) * scale {
53                    scaled_requested_size - max_scaled_size
54                } else {
55                    0
56                }
57            }
58        }
59    }
60}
61
62#[derive(Debug)]
63pub enum DirectoryType {
64    Fixed,
65    Scalable,
66    Threshold,
67}
68
69impl Default for DirectoryType {
70    fn default() -> Self {
71        Self::Threshold
72    }
73}
74
75impl From<&str> for DirectoryType {
76    fn from(value: &str) -> Self {
77        match value {
78            "Fixed" => DirectoryType::Fixed,
79            "Scalable" => DirectoryType::Scalable,
80            _ => DirectoryType::Threshold,
81        }
82    }
83}