mimick/library/masonry/
quality.rs1use crate::api_client::ThumbnailSize;
8
9pub(crate) const PREVIEW_BUCKET_THRESHOLD: f32 = 600.0;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
12pub enum GridQuality {
13 Auto,
14 #[default]
15 Thumbnail,
16 Preview,
17 Fullsize,
18}
19
20impl GridQuality {
21 pub fn parse(s: &str) -> Self {
22 match s {
23 "thumbnail" => Self::Thumbnail,
24 "preview" => Self::Preview,
25 "fullsize" => Self::Fullsize,
26 _ => Self::Auto,
27 }
28 }
29}
30
31pub(crate) fn bucket_for_row_height(h: f32, quality: GridQuality) -> ThumbnailSize {
32 match quality {
33 GridQuality::Thumbnail => ThumbnailSize::Thumbnail,
34 GridQuality::Preview => ThumbnailSize::Preview,
35 GridQuality::Fullsize => ThumbnailSize::Fullsize,
36 GridQuality::Auto => {
37 if h <= PREVIEW_BUCKET_THRESHOLD {
38 ThumbnailSize::Thumbnail
39 } else {
40 ThumbnailSize::Preview
41 }
42 }
43 }
44}
45
46pub(crate) fn fallback_bucket(size: ThumbnailSize) -> Option<ThumbnailSize> {
48 match size {
49 ThumbnailSize::Fullsize => Some(ThumbnailSize::Preview),
50 ThumbnailSize::Preview | ThumbnailSize::Thumbnail => None,
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn bucket_thumbnail_under_threshold() {
60 assert!(matches!(
61 bucket_for_row_height(200.0, GridQuality::Auto),
62 ThumbnailSize::Thumbnail
63 ));
64 assert!(matches!(
65 bucket_for_row_height(PREVIEW_BUCKET_THRESHOLD, GridQuality::Auto),
66 ThumbnailSize::Thumbnail
67 ));
68 assert!(matches!(
69 bucket_for_row_height(PREVIEW_BUCKET_THRESHOLD + 1.0, GridQuality::Auto),
70 ThumbnailSize::Preview
71 ));
72 }
73
74 #[test]
75 fn explicit_quality_overrides_row_height() {
76 assert!(matches!(
77 bucket_for_row_height(2000.0, GridQuality::Thumbnail),
78 ThumbnailSize::Thumbnail
79 ));
80 assert!(matches!(
81 bucket_for_row_height(50.0, GridQuality::Fullsize),
82 ThumbnailSize::Fullsize
83 ));
84 }
85
86 #[test]
87 fn fallback_chain_degrades_fullsize_to_preview() {
88 assert_eq!(
89 fallback_bucket(ThumbnailSize::Fullsize),
90 Some(ThumbnailSize::Preview)
91 );
92 assert_eq!(fallback_bucket(ThumbnailSize::Preview), None);
93 assert_eq!(fallback_bucket(ThumbnailSize::Thumbnail), None);
94 }
95}