Skip to main content

vizia_core/modifiers/
control.rs

1use crate::prelude::*;
2
3/// Enum representing semantic size presets for common controls.
4#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
5pub enum ControlSize {
6    /// Extra small control.
7    ExtraSmall,
8    /// Small control.
9    Small,
10    #[default]
11    /// Medium control.
12    Medium,
13    /// Large control.
14    Large,
15}
16
17impl_res_simple!(ControlSize);
18
19/// Modifiers for common control-level behavior that can be shared across views.
20pub trait ControlModifiers: Sized {
21    /// Applies semantic sizing classes to a control.
22    fn control_size<U: Into<ControlSize> + Clone + 'static>(
23        self,
24        size: impl Res<U> + 'static,
25    ) -> Self;
26}
27
28pub(crate) fn bind_control_size<V: View, U: Into<ControlSize> + Clone + 'static>(
29    handle: Handle<'_, V>,
30    size: impl Res<U> + 'static,
31) -> Handle<'_, V> {
32    let size = size.to_signal(handle.cx).map(|value| value.clone().into());
33    handle.bind(size, move |handle| {
34        match size.get() {
35            ControlSize::ExtraSmall => {
36                handle
37                    .toggle_class("xsmall", true)
38                    .toggle_class("small", false)
39                    .toggle_class("medium", false)
40                    .toggle_class("large", false);
41            }
42            ControlSize::Small => {
43                handle
44                    .toggle_class("small", true)
45                    .toggle_class("xsmall", false)
46                    .toggle_class("medium", false)
47                    .toggle_class("large", false);
48            }
49            ControlSize::Medium => {
50                handle
51                    .toggle_class("medium", true)
52                    .toggle_class("xsmall", false)
53                    .toggle_class("small", false)
54                    .toggle_class("large", false);
55            }
56            ControlSize::Large => {
57                handle
58                    .toggle_class("large", true)
59                    .toggle_class("xsmall", false)
60                    .toggle_class("small", false)
61                    .toggle_class("medium", false);
62            }
63        };
64    })
65}