24 lines
649 B
Rust
24 lines
649 B
Rust
use crate::{UiRsc, WidgetIdFn, WidgetLike, WeakWidget};
|
|
|
|
pub trait WidgetAttr<Rsc, W: ?Sized> {
|
|
type Input;
|
|
fn run(rsc: &mut Rsc, id: WeakWidget<W>, input: Self::Input);
|
|
}
|
|
|
|
pub trait Attrable<Rsc, W: ?Sized, Tag> {
|
|
fn attr<A: WidgetAttr<Rsc, W>>(self, input: A::Input) -> impl WidgetIdFn<Rsc, W>;
|
|
}
|
|
|
|
impl<Rsc: UiRsc, WL: WidgetLike<Rsc, Tag>, Tag> Attrable<Rsc, WL::Widget, Tag> for WL {
|
|
fn attr<A: WidgetAttr<Rsc, WL::Widget>>(
|
|
self,
|
|
input: A::Input,
|
|
) -> impl WidgetIdFn<Rsc, WL::Widget> {
|
|
|rsc| {
|
|
let id = self.add(rsc);
|
|
A::run(rsc, id, input);
|
|
id
|
|
}
|
|
}
|
|
}
|