leptos_chartistry/inner/
mod.rs1pub 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#[derive(Clone)]
15#[non_exhaustive]
16pub enum InnerLayout<X: Tick, Y: Tick> {
17 AxisMarker(axis_marker::AxisMarker),
19 XGridLine(grid_line::XGridLine<X>),
21 YGridLine(grid_line::YGridLine<Y>),
23 XGuideLine(guide_line::XGuideLine),
25 YGuideLine(guide_line::YGuideLine),
27 Legend(legend::InsetLegend),
29}
30
31pub trait IntoInner<X: Tick, Y: Tick> {
33 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);