cosmic-freedesktop-icons/src/theme/directories.rs

68 lines
1.9 KiB
Rust
Raw Normal View History

#[derive(Debug)]
pub struct Directory<'a> {
pub name: &'a str,
pub size: i16,
pub scale: i16,
pub type_: DirectoryType,
pub maxsize: i16,
pub minsize: i16,
pub threshold: i16,
}
impl Directory<'_> {
pub fn directory_size_distance(&self, size: i16, scale: i16) -> i16 {
match self.type_ {
DirectoryType::Fixed => self.size * self.scale - size * scale,
DirectoryType::Scalable => {
let scaled_requested_size = size * scale;
let min_scaled_size = self.minsize * self.scale;
if scaled_requested_size < min_scaled_size {
min_scaled_size - scaled_requested_size
} else {
let max_scaled_size = self.maxsize * self.scale;
if scaled_requested_size < max_scaled_size {
scaled_requested_size - max_scaled_size
} else {
0
}
}
}
DirectoryType::Threshold => {
let scaled_requested_size = size * scale;
if scaled_requested_size < (self.size - self.threshold) * scale {
self.minsize * self.scale - scaled_requested_size
} else if scaled_requested_size > (self.size + self.threshold) * scale {
scaled_requested_size - self.maxsize * self.scale
} else {
0
}
}
}
}
}
#[derive(Debug)]
pub enum DirectoryType {
Fixed,
Scalable,
Threshold,
}
impl Default for DirectoryType {
fn default() -> Self {
Self::Threshold
}
}
impl From<&[u8]> for DirectoryType {
fn from(value: &[u8]) -> Self {
match value[0] {
b'F' => DirectoryType::Fixed,
b'S' => DirectoryType::Scalable,
_ => DirectoryType::Threshold,
}
}
}