widget view
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
16
core/src/widget/view.rs
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user