use super::{
BuilderCxFn, BuilderFn, ControlBuilder, ControlData, VanityControlBuilder, VanityControlData,
};
use crate::{FormBuilder, FormToolData};
use leptos::prelude::{AnyView, RwSignal};
use std::sync::Arc;
impl<FD: FormToolData> FormBuilder<FD> {
pub fn custom<CC: ControlData<FD>, FDT: Clone + PartialEq + 'static>(
mut self,
control_data: CC,
builder: impl BuilderFn<ControlBuilder<FD, CC, FDT>>,
) -> Self {
let control_builder = ControlBuilder::new(control_data);
let control = builder(control_builder);
self.add_control(control);
self
}
pub fn custom_cx<CC: ControlData<FD>, FDT: Clone + PartialEq + 'static>(
mut self,
control_data: CC,
builder: impl BuilderCxFn<ControlBuilder<FD, CC, FDT>, FD::Context>,
) -> Self {
let control_builder = ControlBuilder::new(control_data);
let control = builder(control_builder, self.cx.clone());
self.add_control(control);
self
}
pub fn custom_vanity<CC: VanityControlData<FD>>(
mut self,
control_data: CC,
builder: impl BuilderFn<VanityControlBuilder<FD, CC>>,
) -> Self {
let control_builder = VanityControlBuilder::new(control_data);
let control = builder(control_builder);
self.add_vanity(control);
self
}
pub fn custom_vanity_cx<CC: VanityControlData<FD>>(
mut self,
control_data: CC,
builder: impl BuilderCxFn<VanityControlBuilder<FD, CC>, FD::Context>,
) -> Self {
let control_builder = VanityControlBuilder::new(control_data);
let control = builder(control_builder, self.cx.clone());
self.add_vanity(control);
self
}
pub fn raw_view(
mut self,
render_fn: impl Fn(Arc<FD::Style>, RwSignal<FD>, Arc<FD::Context>) -> AnyView + 'static,
) -> Self {
let cx = self.cx.clone();
let render_fn = move |fs: Arc<FD::Style>, fd: RwSignal<FD>| {
let view = render_fn(fs, fd, cx);
(view, None)
};
self.render_fns.push(Box::new(render_fn));
self
}
}