1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use crate::container;
use crate::core::{self, Element};

/// The controls of a [`Pane`].
///
/// [`Pane`]: super::Pane
#[allow(missing_debug_implementations)]
pub struct Controls<
    'a,
    Message,
    Theme = crate::Theme,
    Renderer = crate::Renderer,
> where
    Theme: container::Catalog,
    Renderer: core::Renderer,
{
    pub(super) full: Element<'a, Message, Theme, Renderer>,
    pub(super) compact: Option<Element<'a, Message, Theme, Renderer>>,
}

impl<'a, Message, Theme, Renderer> Controls<'a, Message, Theme, Renderer>
where
    Theme: container::Catalog,
    Renderer: core::Renderer,
{
    /// Creates a new [`Controls`] with the given content.
    pub fn new(
        content: impl Into<Element<'a, Message, Theme, Renderer>>,
    ) -> Self {
        Self {
            full: content.into(),
            compact: None,
        }
    }

    /// Creates a new [`Controls`] with a full and compact variant.
    /// If there is not enough room to show the full variant without overlap,
    /// then the compact variant will be shown instead.
    pub fn dynamic(
        full: impl Into<Element<'a, Message, Theme, Renderer>>,
        compact: impl Into<Element<'a, Message, Theme, Renderer>>,
    ) -> Self {
        Self {
            full: full.into(),
            compact: Some(compact.into()),
        }
    }
}

impl<'a, Message, Theme, Renderer> From<Element<'a, Message, Theme, Renderer>>
    for Controls<'a, Message, Theme, Renderer>
where
    Theme: container::Catalog,
    Renderer: core::Renderer,
{
    fn from(value: Element<'a, Message, Theme, Renderer>) -> Self {
        Self::new(value)
    }
}