11use std:: pin:: Pin ;
22use std:: task:: Poll ;
33
4+ use frender_common:: convert:: FromMut as _;
45use frender_dom:: behaviors:: ElementWithChildren ;
5- use frender_dom:: ui_handle:: UiHandle ;
6- use frender_dom:: { RenderStateWithAnyParent , RenderStateWithParentElementsHandle , StateUnmount } ;
76
8- use crate :: element:: { PinMutRenderInitStatesOfKind , PinnedMutRenderStatesOfKind , PinnedRenderStateKind , PinnedUiHandleOfKind , UnpinnedMutRenderStatesOfKind , UnpinnedRenderStateKind , UnpinnedRenderStatesOfKind } ;
7+ use crate :: element:: {
8+ PinMutRenderInitStatesOfKind , PinnedMutRenderStatesOfKind , PinnedRenderStateKind , PinnedRenderStateKindPollRender , PinnedUiHandleOfKind , UnpinnedMutRenderStatesOfKind , UnpinnedRenderStateKind ,
9+ UnpinnedRenderStateKindPollRender , UnpinnedRenderStatesOfKind ,
10+ } ;
911use crate :: { BehaviorType , RenderHtml } ;
1012
1113use crate :: html:: behavior_type_traits;
@@ -31,15 +33,15 @@ pub trait RenderStateKindPollRenderWithParent<ParentType: ?Sized + BehaviorType>
3133 ) -> Poll < ( ) > ;
3234}
3335
34- pub trait CsrComponent < Children > : behavior_type_traits :: Element {
36+ pub trait CsrComponent < Children > : BehaviorType {
3537 type ChildrenRenderStateKind : RenderStateKindPollRenderWithParent < Self > ;
3638
3739 fn children_pinned_render_init < R : RenderHtml + ?Sized > (
3840 //
3941 self ,
4042 children : Children ,
4143 renderer : & mut R ,
42- parent : & mut Self :: Element < R > ,
44+ parent : & mut Self :: OfBehaviorType < R > ,
4345 children_states : PinMutRenderInitStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
4446 ) -> PinnedUiHandleOfKind < R , Self :: ChildrenRenderStateKind > ;
4547
@@ -48,7 +50,7 @@ pub trait CsrComponent<Children>: behavior_type_traits::Element {
4850 self ,
4951 children : Children ,
5052 renderer : & mut R ,
51- parent : & mut Self :: Element < R > ,
53+ parent : & mut Self :: OfBehaviorType < R > ,
5254 children_states : PinnedMutRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
5355 ) ;
5456
@@ -57,52 +59,99 @@ pub trait CsrComponent<Children>: behavior_type_traits::Element {
5759 self ,
5860 children : Children ,
5961 renderer : & mut R ,
60- parent : & mut Self :: Element < R > ,
62+ parent : & mut Self :: OfBehaviorType < R > ,
6163 ) -> UnpinnedRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > ;
6264
6365 fn children_unpinned_render_update < R : RenderHtml + ?Sized > (
6466 //
6567 self ,
6668 children : Children ,
6769 renderer : & mut R ,
68- parent : & mut Self :: Element < R > ,
70+ parent : & mut Self :: OfBehaviorType < R > ,
6971 children_states : UnpinnedMutRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
7072 ) ;
7173}
7274
73- #[ cfg( todo) ]
7475enum Never { }
7576
76- #[ cfg( todo) ]
77- pub struct KindRenderStateWithAnyParent < K : crate :: RenderStateKind > ( Never , std:: marker:: PhantomData < K > ) ;
77+ pub struct KindRenderStateWithAnyParent < CK : UnpinnedRenderStateKind + PinnedRenderStateKind > ( Never , std:: marker:: PhantomData < CK > ) ;
7878
79- #[ cfg( todo) ]
80- impl < K : crate :: RenderStateKind , ElType : ?Sized + behavior_type_traits:: Element > RenderStateWithPehKind < ElType > for KindRenderStateWithAnyParent < K > {
81- type RenderStateWithPeh < R : RenderHtml + ?Sized > = RenderStateWithAnyParent < <K as crate :: RenderStateKind >:: RenderStatePinned < R > > ;
82- type RenderStateWithPehUnpinned < R : RenderHtml + ?Sized > = RenderStateWithAnyParent < <K as crate :: RenderStateKind >:: RenderStateUnpinned < R > > ;
79+ impl < CK : UnpinnedRenderStateKind + PinnedRenderStateKind > UnpinnedRenderStateKind for KindRenderStateWithAnyParent < CK > {
80+ type UnpinnedUiHandle < R : RenderHtml + ?Sized > = CK :: UnpinnedUiHandle < R > ;
81+ type UnpinnedNonReactiveState < R : RenderHtml + ?Sized > = CK :: UnpinnedNonReactiveState < R > ;
82+ type UnpinnedReactiveState = CK :: UnpinnedReactiveState ;
83+ }
84+
85+ impl < CK : UnpinnedRenderStateKind + PinnedRenderStateKind > PinnedRenderStateKind for KindRenderStateWithAnyParent < CK > {
86+ type PinnedUiHandle < R : RenderHtml + ?Sized > = CK :: PinnedUiHandle < R > ;
87+ type PinnedNonReactiveState < R : RenderHtml + ?Sized > = CK :: PinnedNonReactiveState < R > ;
88+ type PinnedReactiveState = CK :: PinnedReactiveState ;
89+ }
90+
91+ impl < CK : UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender , ElType : ?Sized + behavior_type_traits:: Element > RenderStateKindPollRenderWithParent < ElType > for KindRenderStateWithAnyParent < CK > {
92+ fn pinned_poll_render_with_parent < R : RenderHtml + ?Sized > (
93+ //
94+ renderer : & mut R ,
95+ _: & mut <ElType as BehaviorType >:: OfBehaviorType < R > ,
96+ states : PinnedMutRenderStatesOfKind < Self , R > ,
97+ cx : & mut std:: task:: Context < ' _ > ,
98+ ) -> Poll < ( ) > {
99+ CK :: pinned_poll_render ( renderer, states, cx)
100+ }
101+ fn unpinned_poll_render_with_parent < R : RenderHtml + ?Sized > (
102+ //
103+ renderer : & mut R ,
104+ _: & mut <ElType as BehaviorType >:: OfBehaviorType < R > ,
105+ states : UnpinnedMutRenderStatesOfKind < Self , R > ,
106+ cx : & mut std:: task:: Context < ' _ > ,
107+ ) -> Poll < ( ) > {
108+ CK :: unpinned_poll_render ( renderer, states, cx)
109+ }
83110}
84111
85- #[ cfg( todo) ]
86112impl < C : CsrComponentNormalElement , Children : Element > CsrComponent < Children > for C {
87113 type ChildrenRenderStateKind = KindRenderStateWithAnyParent < Children :: RenderStateKind > ;
88114
89- fn children_render_update < R : RenderHtml + ?Sized > (
115+ fn children_pinned_render_init < R : RenderHtml + ?Sized > (
116+ //
117+ self ,
118+ children : Children ,
119+ renderer : & mut R ,
120+ parent : & mut Self :: OfBehaviorType < R > ,
121+ children_states : PinMutRenderInitStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
122+ ) -> PinnedUiHandleOfKind < R , Self :: ChildrenRenderStateKind > {
123+ <C :: Element < R > >:: from_mut ( parent) . with_render_context_at_first_child_of_self ( renderer, |render_context| children. pinned_render_init ( render_context, children_states) )
124+ }
125+
126+ fn children_pinned_render_update < R : RenderHtml + ?Sized > (
127+ //
90128 self ,
91129 children : Children ,
92- element : & mut Self :: Element < R > ,
93130 renderer : & mut R ,
94- children_state : std:: pin:: Pin < & mut <Self :: ChildrenRenderStateKind as RenderStateWithPehKind < Self > >:: RenderStateWithPeh < R > > ,
131+ parent : & mut Self :: OfBehaviorType < R > ,
132+ children_states : PinnedMutRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
95133 ) {
96- element. with_render_context_at_first_child_of_self ( renderer, |renderer| Children :: render_update ( children, renderer, children_state. as_pin_mut ( ) ) )
134+ <C :: Element < R > >:: from_mut ( parent) . with_render_context_at_first_child_of_self ( renderer, |render_context| children. pinned_render_update ( render_context, children_states) )
135+ }
136+
137+ fn children_unpinned_render_init < R : RenderHtml + ?Sized > (
138+ //
139+ self ,
140+ children : Children ,
141+ renderer : & mut R ,
142+ parent : & mut Self :: OfBehaviorType < R > ,
143+ ) -> UnpinnedRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > {
144+ <C :: Element < R > >:: from_mut ( parent) . with_render_context_at_first_child_of_self ( renderer, |render_context| children. unpinned_render_init ( render_context) )
97145 }
98146
99147 fn children_unpinned_render_update < R : RenderHtml + ?Sized > (
148+ //
100149 self ,
101150 children : Children ,
102- element : & mut Self :: Element < R > ,
103151 renderer : & mut R ,
104- children_state : & mut <Self :: ChildrenRenderStateKind as RenderStateWithPehKind < Self > >:: RenderStateWithPehUnpinned < R > ,
152+ parent : & mut Self :: OfBehaviorType < R > ,
153+ children_states : UnpinnedMutRenderStatesOfKind < Self :: ChildrenRenderStateKind , R > ,
105154 ) {
106- element . with_render_context_at_first_child_of_self ( renderer, |renderer| Children :: unpinned_render_update ( children , renderer , & mut children_state . render_state ) )
155+ < C :: Element < R > > :: from_mut ( parent ) . with_render_context_at_first_child_of_self ( renderer, |render_context| children . unpinned_render_update ( render_context , children_states ) )
107156 }
108157}
0 commit comments