leptos_chartistry/inner/
mod.rs

1pub mod axis_marker;
2pub mod grid_line;
3pub mod guide_line;
4pub mod legend;
5
6use crate::{state::State, Tick};
7use axis_marker::AxisMarker;
8use grid_line::{XGridLine, YGridLine};
9use guide_line::{XGuideLine, YGuideLine};
10use legend::InsetLegend;
11use leptos::prelude::*;
12
13/// Inner layout options for a [Chart](crate::Chart). See [IntoInner](trait@IntoInner) for details.
14#[derive(Clone)]
15#[non_exhaustive]
16pub enum InnerLayout<X: Tick, Y: Tick> {
17    /// Axis marker. See [AxisMarker](struct@axis_marker::AxisMarker) for details.
18    AxisMarker(axis_marker::AxisMarker),
19    /// X grid line. See [XGridLine](struct@grid_line::XGridLine) for details.
20    XGridLine(grid_line::XGridLine<X>),
21    /// Y grid line. See [YGridLine](struct@grid_line::YGridLine) for details.
22    YGridLine(grid_line::YGridLine<Y>),
23    /// X guide line. See [XGuideLine](struct@guide_line::XGuideLine) for details.
24    XGuideLine(guide_line::XGuideLine),
25    /// Y guide line. See [YGuideLine](struct@guide_line::YGuideLine) for details.
26    YGuideLine(guide_line::YGuideLine),
27    /// Inset legend. See [InsetLegend](struct@legend::InsetLegend) for details.
28    Legend(legend::InsetLegend),
29}
30
31/// Convert a type (e.g., a [guide line](struct@guide_line::XGuideLine)) into an inner layout for use in a [Chart](crate::Chart).
32pub trait IntoInner<X: Tick, Y: Tick> {
33    /// Create an inner layout from the type. See [IntoInner](trait@IntoInner) for details.
34    fn into_inner(self) -> InnerLayout<X, Y>;
35}
36
37pub enum UseInner<X: Tick, Y: Tick> {
38    AxisMarker(axis_marker::AxisMarker),
39    XGridLine(grid_line::UseXGridLine<X>),
40    YGridLine(grid_line::UseYGridLine<Y>),
41    XGuideLine(guide_line::UseXGuideLine),
42    YGuideLine(guide_line::UseYGuideLine),
43    Legend(legend::InsetLegend),
44}
45
46impl<X: Tick, Y: Tick> InnerLayout<X, Y> {
47    pub(super) fn into_use(self, state: &State<X, Y>) -> UseInner<X, Y> {
48        match self {
49            Self::AxisMarker(inner) => UseInner::AxisMarker(inner),
50            Self::XGridLine(inner) => UseInner::XGridLine(inner.use_horizontal(state)),
51            Self::YGridLine(inner) => UseInner::YGridLine(inner.use_vertical(state)),
52            Self::XGuideLine(inner) => UseInner::XGuideLine(inner.use_horizontal()),
53            Self::YGuideLine(inner) => UseInner::YGuideLine(inner.use_vertical()),
54            Self::Legend(inner) => UseInner::Legend(inner),
55        }
56    }
57}
58
59impl<X: Tick, Y: Tick> UseInner<X, Y> {
60    pub(super) fn render(self, state: State<X, Y>) -> impl IntoView {
61        match self {
62            Self::AxisMarker(inner) => view! {<AxisMarker marker=inner state=state />}.into_any(),
63            Self::XGridLine(inner) => view! {<XGridLine line=inner state=state />}.into_any(),
64            Self::YGridLine(inner) => view! {<YGridLine line=inner state=state />}.into_any(),
65            Self::XGuideLine(inner) => view! {<XGuideLine line=inner state=state />}.into_any(),
66            Self::YGuideLine(inner) => view! {<YGuideLine line=inner state=state />}.into_any(),
67            Self::Legend(inner) => view! {<InsetLegend legend=inner state=state />}.into_any(),
68        }
69    }
70}
71
72macro_rules! impl_into_inner {
73    ($ty:ty, $enum:ident) => {
74        impl<X: Tick, Y: Tick> IntoInner<X, Y> for $ty {
75            fn into_inner(self) -> InnerLayout<X, Y> {
76                InnerLayout::$enum(self)
77            }
78        }
79
80        impl<X: Tick, Y: Tick> From<$ty> for InnerLayout<X, Y> {
81            fn from(inner: $ty) -> Self {
82                inner.into_inner()
83            }
84        }
85
86        impl<X: Tick, Y: Tick> From<$ty> for Vec<InnerLayout<X, Y>> {
87            fn from(inner: $ty) -> Self {
88                vec![inner.into_inner()]
89            }
90        }
91    };
92}
93impl_into_inner!(axis_marker::AxisMarker, AxisMarker);
94impl_into_inner!(grid_line::XGridLine<X>, XGridLine);
95impl_into_inner!(grid_line::YGridLine<Y>, YGridLine);
96impl_into_inner!(guide_line::XGuideLine, XGuideLine);
97impl_into_inner!(guide_line::YGuideLine, YGuideLine);
98impl_into_inner!(legend::InsetLegend, Legend);