widget view

This commit is contained in:
2026-01-05 17:01:09 -05:00
parent 07de7c8722
commit d11107f965
7 changed files with 130 additions and 15 deletions

View File

@@ -90,8 +90,8 @@ impl<W: ?Sized> Drop for WidgetHandle<W> {
}
}
pub trait WidgetIdFn<State, W: ?Sized = dyn Widget>: FnOnce(&mut State) -> WidgetRef<W> {}
impl<State, W: ?Sized, F: FnOnce(&mut State) -> WidgetRef<W>> WidgetIdFn<State, W> for F {}
pub trait WidgetIdFn<Rsc, W: ?Sized = dyn Widget>: FnOnce(&mut Rsc) -> WidgetRef<W> {}
impl<Rsc, W: ?Sized, F: FnOnce(&mut Rsc) -> WidgetRef<W>> WidgetIdFn<Rsc, W> for F {}
pub trait IdLike {
type Widget: ?Sized;

View File

@@ -5,12 +5,14 @@ mod data;
mod handle;
mod like;
mod tag;
mod view;
mod widgets;
pub use data::*;
pub use handle::*;
pub use like::*;
pub use tag::*;
pub use view::*;
pub use widgets::*;
pub trait Widget: Any {

View File

@@ -5,16 +5,16 @@ use std::marker::Unsize;
pub struct WidgetTag;
impl<Rsc: HasUi, W: Widget> WidgetLike<Rsc, WidgetTag> for W {
type Widget = W;
fn add(self, state: &mut Rsc) -> WidgetRef<W> {
state.ui_mut().widgets.add_weak(self)
fn add(self, rsc: &mut Rsc) -> WidgetRef<W> {
rsc.ui_mut().widgets.add_weak(self)
}
}
pub struct FnTag;
impl<Rsc: HasUi, W: Widget, F: FnOnce(&mut Rsc) -> W> WidgetLike<Rsc, FnTag> for F {
type Widget = W;
fn add(self, state: &mut Rsc) -> WidgetRef<W> {
self(state).add(state)
fn add(self, rsc: &mut Rsc) -> WidgetRef<W> {
self(rsc).add(rsc)
}
}
@@ -26,26 +26,34 @@ pub struct FnTraitTag;
impl<Rsc: HasUi, T: WidgetFnTrait<Rsc>> WidgetLike<Rsc, FnTraitTag> for T {
type Widget = T::Widget;
#[track_caller]
fn add(self, state: &mut Rsc) -> WidgetRef<T::Widget> {
self.run(state).add(state)
fn add(self, rsc: &mut Rsc) -> WidgetRef<T::Widget> {
self.run(rsc).add(rsc)
}
}
pub struct IdTag;
impl<Rsc: HasUi, W: ?Sized + Widget + Unsize<dyn Widget>> WidgetLike<Rsc, IdTag> for WidgetRef<W> {
pub struct RefTag;
impl<Rsc: HasUi, W: ?Sized + Widget + Unsize<dyn Widget>> WidgetLike<Rsc, RefTag> for WidgetRef<W> {
type Widget = W;
fn add(self, _: &mut Rsc) -> WidgetRef<W> {
self
}
}
pub struct IdFnTag;
pub struct RefFnTag;
impl<Rsc: HasUi, W: ?Sized + Widget + Unsize<dyn Widget>, F: FnOnce(&mut Rsc) -> WidgetRef<W>>
WidgetLike<Rsc, IdFnTag> for F
WidgetLike<Rsc, RefFnTag> for F
{
type Widget = W;
fn add(self, state: &mut Rsc) -> WidgetRef<W> {
self(state)
fn add(self, rsc: &mut Rsc) -> WidgetRef<W> {
self(rsc)
}
}
pub struct ViewTag;
impl<Rsc: HasUi, V: WidgetView> WidgetLike<Rsc, ViewTag> for V {
type Widget = V::Widget;
fn add(self, _: &mut Rsc) -> WidgetRef<Self::Widget> {
self.root()
}
}

16
core/src/widget/view.rs Normal file
View File

@@ -0,0 +1,16 @@
use std::marker::Unsize;
use crate::{Widget, WidgetRef};
pub trait WidgetView {
type Widget: Widget + ?Sized + Unsize<dyn Widget>;
fn root(&self) -> WidgetRef<Self::Widget>;
}
pub trait HasWidget {
type Widget: Widget + ?Sized + Unsize<dyn Widget>;
}
impl<W: Widget + Unsize<dyn Widget>> HasWidget for WidgetRef<W> {
type Widget = W;
}