cosmic_freedesktop_icons/theme/
directories.rs1#[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}