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}