1+ use std:: marker:: PhantomData ;
12use std:: pin:: Pin ;
23use std:: task:: Poll ;
34
45use frender_common:: convert:: FromMut as _;
56use frender_dom:: behaviors:: ElementWithChildren ;
7+ use frender_dom:: render:: RenderWithContext ;
68
79use crate :: element:: {
8- PinnedRenderInitKind , PinnedRenderStateKind , PinnedStateOfKind , PinnedUiHandleOfKind , PinnedUnmountedUiHandleOfKind , RenderStateKind , UnpinnedRenderStateKind , UnpinnedStateOfKind , UnpinnedUiHandleOfKind ,
9- UnpinnedUnmountedUiHandleOfKind ,
10+ CsrElementRenderInitPinned , PinnedRenderInitKind , PinnedRenderStateKind , PinnedStateOfKind , PinnedUiHandleOfKind , PinnedUnmountedUiHandleOfKind , RenderStateKind , UnpinnedRenderStateKind , UnpinnedStateOfKind ,
11+ UnpinnedUiHandleOfKind , UnpinnedUnmountedUiHandleOfKind ,
1012} ;
1113use crate :: { BehaviorType , RenderHtml } ;
1214
@@ -35,23 +37,31 @@ pub trait RenderStateKindPollRenderWithParent<ParentType: ?Sized + BehaviorType>
3537 ) -> Poll < ( ) > ;
3638}
3739
38- pub trait RenderInitWithParent < ParentType : ?Sized + BehaviorType , R : ?Sized + RenderHtml > {
39- type PinnedRenderStateKind : PinnedRenderStateKind ;
40+ pub trait RenderInitPinnedWithParent < ParentType : ?Sized + BehaviorType , R : ?Sized + RenderHtml > {
41+ type UiHandle ;
42+ type State ;
4043 fn render_init_pinned_with_parent (
4144 //
4245 self ,
4346 renderer : & mut R ,
4447 parent : & mut ParentType :: OfBehaviorType < R > ,
45- children_state : Pin < & mut PinnedStateOfKind < R , Self :: PinnedRenderStateKind > > ,
46- ) ;
48+ children_state : Pin < & mut Self :: State > ,
49+ ) -> Self :: UiHandle ;
4750}
4851
4952pub trait PinnedRenderInitKindWithParent < ParentType : ?Sized + BehaviorType > {
50- type PinnedRenderInitWithParent < R : ?Sized + RenderHtml > : RenderInitWithParent < ParentType , R > ;
53+ type PinnedRenderStateKind : PinnedRenderStateKind ;
54+ type PinnedRenderInitWithParent < R : ?Sized + RenderHtml > : RenderInitPinnedWithParent <
55+ ParentType ,
56+ R ,
57+ UiHandle = PinnedUiHandleOfKind < R , Self :: PinnedRenderStateKind > ,
58+ State = PinnedStateOfKind < R , Self :: PinnedRenderStateKind > ,
59+ > ;
5160}
5261
5362pub trait CsrComponent < Children > : BehaviorType {
54- type ChildrenRenderStateKind : RenderStateKindPollRenderWithParent < Self > + PinnedRenderInitKindWithParent < Self > ;
63+ type ChildrenRenderStateKind : RenderStateKindPollRenderWithParent < Self > ;
64+ type ChildrenRenderInitKind : PinnedRenderInitKindWithParent < Self > ;
5565
5666 fn children_pinned_render_init < R : RenderHtml + ?Sized > (
5767 //
@@ -60,7 +70,7 @@ pub trait CsrComponent<Children>: BehaviorType {
6070 renderer : & mut R ,
6171 ) -> (
6272 PinnedStateOfKind < R , Self :: ChildrenRenderStateKind > ,
63- <Self :: ChildrenRenderStateKind as PinnedRenderInitKindWithParent < Self > >:: PinnedRenderInitWithParent < R > ,
73+ <Self :: ChildrenRenderInitKind as PinnedRenderInitKindWithParent < Self > >:: PinnedRenderInitWithParent < R > ,
6474 ) ;
6575
6676 fn children_pinned_render_init_by_reusing < R : RenderHtml + ?Sized > (
@@ -118,14 +128,15 @@ pub trait CsrComponent<Children>: BehaviorType {
118128
119129enum Never { }
120130
121- pub struct KindRenderStateWithAnyParent < CK > ( Never , std:: marker:: PhantomData < CK > ) ;
131+ pub struct StateKindWithAnyParent < CK > ( Never , PhantomData < CK > ) ;
132+ pub struct InitKindWithAnyParent < CK > ( Never , PhantomData < CK > ) ;
122133
123- impl < CK : UnpinnedRenderStateKind > UnpinnedRenderStateKind for KindRenderStateWithAnyParent < CK > {
134+ impl < CK : UnpinnedRenderStateKind > UnpinnedRenderStateKind for StateKindWithAnyParent < CK > {
124135 type UnpinnedUiHandle < R : RenderHtml + ?Sized > = CK :: UnpinnedUiHandle < R > ;
125136 type UnpinnedState < R : RenderHtml + ?Sized > = CK :: UnpinnedState < R > ;
126137}
127138
128- impl < CK : PinnedRenderStateKind > PinnedRenderStateKind for KindRenderStateWithAnyParent < CK > {
139+ impl < CK : PinnedRenderStateKind > PinnedRenderStateKind for StateKindWithAnyParent < CK > {
129140 type PinnedUiHandle < R : RenderHtml + ?Sized > = CK :: PinnedUiHandle < R > ;
130141 type PinnedState < R : RenderHtml + ?Sized > = CK :: PinnedState < R > ;
131142}
@@ -134,7 +145,7 @@ impl<
134145 //
135146 CK : RenderStateKind ,
136147 ElType : ?Sized + behavior_type_traits:: Element ,
137- > RenderStateKindPollRenderWithParent < ElType > for KindRenderStateWithAnyParent < CK >
148+ > RenderStateKindPollRenderWithParent < ElType > for StateKindWithAnyParent < CK >
138149{
139150 fn pinned_poll_render_with_parent < R : RenderHtml + ?Sized > (
140151 //
@@ -159,22 +170,47 @@ impl<
159170 }
160171}
161172
162- impl < CK : PinnedRenderInitKind , ElType : ?Sized + behavior_type_traits:: Element > PinnedRenderInitKindWithParent for KindRenderStateWithAnyParent < CK > { }
173+ impl < CK : PinnedRenderInitKind , ElType : ?Sized + behavior_type_traits:: Element > PinnedRenderInitKindWithParent < ElType > for InitKindWithAnyParent < CK > {
174+ type PinnedRenderStateKind = StateKindWithAnyParent < CK :: PinnedRenderStateKind > ;
175+ type PinnedRenderInitWithParent < R : ?Sized + RenderHtml > = RenderInitWithAnyParent < CK :: PinnedRenderInit < R > > ;
176+ }
177+
178+ pub struct RenderInitWithAnyParent < T > ( T ) ;
163179
164- pub struct RenderInitWithAnyParent ;
180+ impl < T : CsrElementRenderInitPinned < R > , ElType : ?Sized + behavior_type_traits:: Element , R : ?Sized + RenderHtml > RenderInitPinnedWithParent < ElType , R > for RenderInitWithAnyParent < T > {
181+ type UiHandle = T :: UiHandle ;
182+ type State = T :: State ;
183+
184+ fn render_init_pinned_with_parent (
185+ //
186+ self ,
187+ renderer : & mut R ,
188+ parent : & mut <ElType as BehaviorType >:: OfBehaviorType < R > ,
189+ children_state : Pin < & mut Self :: State > ,
190+ ) -> Self :: UiHandle {
191+ <ElType :: Element < R > >:: from_mut ( parent) . with_render_context_at_first_child_of_self (
192+ //
193+ renderer,
194+ |render_context| self . 0 . render_init_pinned ( render_context, children_state) ,
195+ )
196+ }
197+ }
165198
166199impl < C : CsrComponentNormalElement , Children : Element > CsrComponent < Children > for C {
167- type ChildrenRenderStateKind = KindRenderStateWithAnyParent < Children :: RenderStateKind > ;
200+ type ChildrenRenderStateKind = StateKindWithAnyParent < Children :: RenderStateKind > ;
201+ type ChildrenRenderInitKind = InitKindWithAnyParent < Children :: RenderInitKind > ;
168202
169203 fn children_pinned_render_init < R : RenderHtml + ?Sized > (
170204 //
171205 self ,
172206 children : Children ,
173207 renderer : & mut R ,
174- parent : & mut Self :: OfBehaviorType < R > ,
175- children_state_default : Pin < & mut PinnedStateDefaultOfKind < R , Self :: ChildrenRenderStateKind > > ,
176- ) -> PinnedUiHandleOfKind < R , Self :: ChildrenRenderStateKind > {
177- <C :: Element < R > >:: from_mut ( parent) . with_render_context_at_first_child_of_self ( renderer, |render_context| children. pinned_render_init ( render_context, children_state_default) )
208+ ) -> (
209+ PinnedStateOfKind < R , Self :: ChildrenRenderStateKind > ,
210+ <Self :: ChildrenRenderInitKind as PinnedRenderInitKindWithParent < Self > >:: PinnedRenderInitWithParent < R > ,
211+ ) {
212+ let ( state, render_init) = children. pinned_render_init ( renderer) ;
213+ ( state, RenderInitWithAnyParent ( render_init) )
178214 }
179215
180216 fn children_pinned_render_init_by_reusing < R : RenderHtml + ?Sized > (
0 commit comments