This commit is contained in:
2026-01-12 18:40:27 -05:00
parent a9c76e4326
commit 79813db3ba
35 changed files with 378 additions and 403 deletions

View File

@@ -1,20 +1,20 @@
use crate::HasUi;
use crate::{HasRoot, UiRsc};
use super::*;
use std::marker::Unsize;
pub trait WidgetLike<Rsc: HasUi, Tag>: Sized {
pub trait WidgetLike<Rsc: UiRsc, Tag>: Sized {
type Widget: Widget + ?Sized + Unsize<dyn Widget>;
fn add(self, rsc: &mut Rsc) -> WidgetRef<Self::Widget>;
fn add(self, rsc: &mut Rsc) -> WeakWidget<Self::Widget>;
fn add_strong(self, rsc: &mut Rsc) -> WidgetHandle<Self::Widget> {
self.add(rsc).upgrade(rsc.ui_mut())
fn add_strong(self, rsc: &mut Rsc) -> StrongWidget<Self::Widget> {
self.add(rsc).upgrade(rsc)
}
fn with_id<W2>(
self,
f: impl FnOnce(&mut Rsc, WidgetRef<Self::Widget>) -> WidgetRef<W2>,
f: impl FnOnce(&mut Rsc, WeakWidget<Self::Widget>) -> WeakWidget<W2>,
) -> impl WidgetIdFn<Rsc, W2> {
move |state| {
let id = self.add(state);
@@ -22,14 +22,12 @@ pub trait WidgetLike<Rsc: HasUi, Tag>: Sized {
}
}
fn set_root(self, state: &mut Rsc) {
let id = self.add(state);
let ui = state.ui_mut();
ui.root = Some(id.upgrade(ui));
}
fn handles(self, state: &mut Rsc) -> WidgetHandles<Self::Widget> {
self.add(state).upgrade(state.ui_mut()).handles()
fn set_root(self, rsc: &mut Rsc)
where
Rsc: HasRoot,
{
let id = self.add_strong(rsc);
rsc.set_root(id);
}
}
@@ -50,12 +48,12 @@ macro_rules! impl_widget_arr {
impl_widget_arr!($n;$($W)*;$(${concat($W,Tag)})*);
};
($n:expr;$($W:ident)*;$($Tag:ident)*) => {
impl<Rsc: HasUi, $($W: WidgetLike<Rsc, $Tag>,$Tag,)*> WidgetArrLike<Rsc, $n, ($($Tag,)*)> for ($($W,)*) {
impl<Rsc: UiRsc, $($W: WidgetLike<Rsc, $Tag>,$Tag,)*> WidgetArrLike<Rsc, $n, ($($Tag,)*)> for ($($W,)*) {
fn add(self, rsc: &mut Rsc) -> WidgetArr<$n> {
#[allow(non_snake_case)]
let ($($W,)*) = self;
WidgetArr::new(
[$($W.add(rsc).upgrade(rsc.ui_mut()),)*],
[$($W.add(rsc).upgrade(rsc),)*],
)
}
}