1212
1313public class MessageFeed : MonoBehaviour
1414{
15+ private const string k_MessageBoxMovementClassName = "messageBoxMove" ;
16+ private const string k_FadeOutClassName = "messageBoxFadeOut" ;
17+ private const string k_MessageBoxClassName = "messageBox" ;
18+ private const string k_MessageClassName = "message" ;
19+
1520 [ SerializeField ]
1621 UIDocument doc ;
1722
1823 List < MessageViewModel > m_Messages ;
19- List < MessageViewModel > _messagesToRemove = new List < MessageViewModel > ( ) ;
24+ List < MessageViewModel > m_MessagesToRemove = new List < MessageViewModel > ( ) ;
2025
2126 ListView m_MessageContainer ;
2227
@@ -118,19 +123,19 @@ void Start()
118123 {
119124 // Create a new message if no reusable messages are available
120125 var newBox = new VisualElement ( ) ;
121- newBox . AddToClassList ( "messageBox" ) ;
126+ newBox . AddToClassList ( k_MessageBoxClassName ) ;
122127
123128 var newLabel = new Label ( ) ;
124- newLabel . AddToClassList ( "message" ) ;
129+ newLabel . AddToClassList ( k_MessageClassName ) ;
125130 newBox . Add ( newLabel ) ;
126131
127132 // the event when the control get's added to the "UI Canvas"
128133 newBox . RegisterCallback < AttachToPanelEvent > ( ( e ) =>
129134 {
130135 if ( e . target is VisualElement element )
131136 {
132- element . RemoveFromClassList ( "messageBoxMove" ) ;
133- StartCoroutine ( ToggleClassWithDelay ( element , "messageBoxMove" , TimeSpan . FromSeconds ( 0.02 ) ) ) ;
137+ element . RemoveFromClassList ( k_MessageBoxMovementClassName ) ;
138+ StartCoroutine ( ToggleClassWithDelay ( element , k_MessageBoxMovementClassName , TimeSpan . FromSeconds ( 0.02 ) ) ) ;
134139 }
135140 } ) ;
136141
@@ -143,8 +148,6 @@ void Start()
143148 return newBox ;
144149 } ;
145150
146- listView . destroyItem += ( element ) => { } ;
147-
148151 // use this to set bindings / values on your view components
149152 listView . bindItem += ( element , i ) =>
150153 {
@@ -172,28 +175,51 @@ void Update()
172175
173176 foreach ( var m in m_Messages )
174177 {
175- if ( m . ShouldDispose ( ) && ! _messagesToRemove . Contains ( m ) )
178+ if ( m . ShouldDispose ( ) && ! m_MessagesToRemove . Contains ( m ) )
176179 {
177- _messagesToRemove . Add ( m ) ;
180+ m_MessagesToRemove . Add ( m ) ;
178181 }
179182 }
180183
181- foreach ( var m in _messagesToRemove )
184+ foreach ( var message in m_MessagesToRemove )
182185 {
183- var fadeOutClassName = "messageBoxFadeOut" ;
186+ var childQuery = m_MessageContainer . Query < VisualElement > ( ) . Class ( k_MessageBoxClassName ) ;
187+ var child = childQuery . AtIndex ( m_Messages . IndexOf ( message ) ) ;
184188
185- var child = m_MessageContainer . Query < VisualElement > ( ) . Class ( "messageBox" )
186- . AtIndex ( m_Messages . IndexOf ( m ) ) ;
189+ if ( ! child . ClassListContains ( k_FadeOutClassName ) )
190+ {
191+ child . AddToClassList ( k_FadeOutClassName ) ;
192+ child . RegisterCallback < TransitionEndEvent > ( OnTransitionEndEvent ) ;
193+ child . RegisterCallback < TransitionCancelEvent > ( OnTransitionCancelEvent ) ;
194+ }
187195
188- if ( ! child . ClassListContains ( fadeOutClassName ) )
196+ void OnTransitionCancelEvent ( TransitionCancelEvent e )
197+ {
198+ m_Messages . Remove ( message ) ;
199+ m_MessagesToRemove . Remove ( message ) ;
200+ if ( e . target is VisualElement element )
201+ {
202+ element . RemoveFromClassList ( k_FadeOutClassName ) ;
203+ }
204+ }
205+
206+ // local event handler function
207+ void OnTransitionEndEvent ( TransitionEndEvent e )
189208 {
190- child . AddToClassList ( fadeOutClassName ) ;
191- child . RegisterCallback < TransitionEndEvent > ( ( e ) =>
209+ if ( e . target is VisualElement element )
192210 {
193- m_Messages . Remove ( m ) ;
194- _messagesToRemove . Remove ( m ) ;
195- child . RemoveFromClassList ( fadeOutClassName ) ;
196- } ) ;
211+ // remove subscription
212+ element . UnregisterCallback < TransitionEndEvent > ( OnTransitionEndEvent ) ;
213+
214+ element . RemoveFromClassList ( k_FadeOutClassName ) ;
215+
216+ // moving the message to be the last visualized in the container
217+ // effectively stopping the list view virtualization caused animation issues
218+ m_MessageContainer . viewController . Move ( m_Messages . IndexOf ( message ) , m_Messages . Count - 1 ) ;
219+
220+ m_Messages . Remove ( message ) ;
221+ m_MessagesToRemove . Remove ( message ) ;
222+ }
197223 }
198224 }
199225 }
0 commit comments