cosmic_files/
zoom.rs

1use std::num::NonZeroU16;
2
3use crate::config::IconSizes;
4use crate::tab::View;
5
6static DEFAULT_ZOOM: NonZeroU16 = NonZeroU16::new(100).unwrap();
7static MIN_ZOOM: NonZeroU16 = NonZeroU16::new(50).unwrap();
8static MAX_ZOOM: NonZeroU16 = NonZeroU16::new(500).unwrap();
9const ZOOM_STEP: u16 = 25;
10
11pub(crate) const fn zoom_to_default(view: View, icon_sizes: &mut IconSizes) {
12    let icon_size = select_resized_icon(view, icon_sizes);
13    *icon_size = DEFAULT_ZOOM;
14}
15
16pub(crate) fn zoom_in_view(view: View, icon_sizes: &mut IconSizes) {
17    let icon_size = select_resized_icon(view, icon_sizes);
18
19    let mut step = MIN_ZOOM;
20    while step <= MAX_ZOOM {
21        if *icon_size < step {
22            *icon_size = step;
23            break;
24        }
25        step = step.saturating_add(ZOOM_STEP);
26    }
27    if *icon_size > step {
28        *icon_size = step;
29    }
30}
31
32pub(crate) fn zoom_out_view(view: View, icon_sizes: &mut IconSizes) {
33    let icon_size = select_resized_icon(view, icon_sizes);
34
35    let mut step = MAX_ZOOM;
36    while step >= MIN_ZOOM {
37        if *icon_size > step {
38            *icon_size = step;
39            break;
40        }
41        step = NonZeroU16::new(step.get().saturating_sub(ZOOM_STEP)).unwrap();
42    }
43    if *icon_size < step {
44        *icon_size = step;
45    }
46}
47
48const fn select_resized_icon(view: View, icon_sizes: &mut IconSizes) -> &mut NonZeroU16 {
49    match view {
50        View::Grid => &mut icon_sizes.grid,
51        View::List => &mut icon_sizes.list,
52    }
53}