From 318110322c0642d3eb05ad91b38da2c9972411b7 Mon Sep 17 00:00:00 2001 From: Ridan Vandenbergh Date: Wed, 18 Jun 2025 15:10:19 +0200 Subject: [PATCH] Implement size check functions for directories --- src/theme.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/theme.rs b/src/theme.rs index cb2bca2..4b92ca5 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -234,6 +234,53 @@ impl<'a> DirectoryIndex<'a> { }) } + fn size_distance(&self, icon_size: u32, icon_scale: u32) -> u32 { + let size = icon_size * icon_scale; + + match self.directory_type { + DirectoryType::Fixed | DirectoryType::Scalable => { + (self.size * self.scale).abs_diff(size) + } + DirectoryType::Threshold => { + let lower = (self.size - self.threshold) * self.scale; + let higher = (self.size + self.threshold) * self.scale; + + if size < lower { + size.abs_diff(self.min_size * self.scale) + } else if size > higher { + size.abs_diff(self.max_size * self.scale) + } else { + 0 // within range -> no distance! + } + } + } + } + + pub fn matches_size(&self, icon_size: u32, icon_scale: u32) -> bool { + if self.scale != icon_scale { + return false; + } + + match self.directory_type { + DirectoryType::Fixed => self.size == icon_size, + DirectoryType::Scalable => { + let DirectoryIndex { + min_size, max_size, .. + } = *self; + + (min_size..=max_size).contains(&icon_size) + } + DirectoryType::Threshold => { + let DirectoryIndex { + threshold, size, .. + } = *self; + + // The icons in this directory can be used if the size differ at most this much from the desired (unscaled) size + size.abs_diff(icon_size) <= threshold + } + } + } + pub fn into_owned(self) -> OwnedDirectoryIndex { dir_index_into_owned(self) }