11use bevy:: prelude:: * ;
22use enumset:: EnumSetType ;
33
4- use crate :: WebVideo ;
4+ use crate :: { VideoElement , WebVideo } ;
55
66pub ( crate ) struct VideoEventMessage {
77 pub asset_id : AssetId < Image > ,
@@ -13,6 +13,7 @@ pub enum VideoEvents {
1313 Abort ,
1414 CanPlay ,
1515 CanPlayThrough ,
16+ CueChange ,
1617 DurationChanged ,
1718 Emptied ,
1819 Ended ,
@@ -52,6 +53,15 @@ pub struct CanPlay;
5253#[ derive( Copy , Clone , Debug ) ]
5354pub struct CanPlayThrough ;
5455#[ derive( Copy , Clone , Debug ) ]
56+ pub struct CueChange {
57+ pub cue : Option < Cue > ,
58+ }
59+ #[ derive( Copy , Clone , Debug ) ]
60+ pub struct Cue {
61+ pub start_time : f64 ,
62+ pub end_time : f64 ,
63+ }
64+ #[ derive( Copy , Clone , Debug ) ]
5565pub struct DurationChanged ;
5666#[ derive( Copy , Clone , Debug ) ]
5767pub struct Emptied ;
@@ -106,6 +116,7 @@ impl From<VideoEvents> for &'static str {
106116 VideoEvents :: Abort => "abort" ,
107117 VideoEvents :: CanPlay => "canplay" ,
108118 VideoEvents :: CanPlayThrough => "canplaythrough" ,
119+ VideoEvents :: CueChange => "cuechange" ,
109120 VideoEvents :: DurationChanged => "durationchanged" ,
110121 VideoEvents :: Emptied => "emptied" ,
111122 VideoEvents :: Ended => "ended" ,
@@ -131,17 +142,56 @@ impl From<VideoEvents> for &'static str {
131142 }
132143}
133144
145+ struct TextTrackCueListIter {
146+ cues : web_sys:: TextTrackCueList ,
147+ index : u32 ,
148+ }
149+ impl TextTrackCueListIter {
150+ fn new ( cues : web_sys:: TextTrackCueList ) -> Self {
151+ Self { cues, index : 0 }
152+ }
153+ }
154+ impl Iterator for TextTrackCueListIter {
155+ type Item = web_sys:: VttCue ;
156+
157+ fn next ( & mut self ) -> Option < Self :: Item > {
158+ let index = self . index ;
159+ self . index += 1 ;
160+ self . cues . get ( index)
161+ }
162+ }
163+
134164pub ( crate ) fn dispatch_events (
135165 event_type : VideoEvents ,
136166 asset_id : AssetId < Image > ,
137- video : & web_sys :: HtmlVideoElement ,
167+ video : & VideoElement ,
138168 commands : & mut Commands ,
139169 videos : Query < ( Entity , & WebVideo ) > ,
140170) {
141171 match event_type {
142172 VideoEvents :: Abort => trigger_event ( asset_id, Abort , commands, videos) ,
143173 VideoEvents :: CanPlay => trigger_event ( asset_id, CanPlay , commands, videos) ,
144174 VideoEvents :: CanPlayThrough => trigger_event ( asset_id, CanPlayThrough , commands, videos) ,
175+ VideoEvents :: CueChange => {
176+ if let Some ( ref track) = video. text_track {
177+ match track. active_cues ( ) {
178+ Some ( cues) => TextTrackCueListIter :: new ( cues. clone ( ) ) . for_each ( |cue| {
179+ trigger_event (
180+ asset_id,
181+ CueChange {
182+ cue : Some ( Cue {
183+ start_time : cue. start_time ( ) ,
184+ end_time : cue. end_time ( ) ,
185+ } ) ,
186+ } ,
187+ commands,
188+ videos,
189+ )
190+ } ) ,
191+ None => trigger_event ( asset_id, CueChange { cue : None } , commands, videos) ,
192+ }
193+ }
194+ }
145195 VideoEvents :: DurationChanged => trigger_event ( asset_id, DurationChanged , commands, videos) ,
146196 VideoEvents :: Emptied => trigger_event ( asset_id, Emptied , commands, videos) ,
147197 VideoEvents :: Ended => trigger_event ( asset_id, Ended , commands, videos) ,
@@ -150,8 +200,8 @@ pub(crate) fn dispatch_events(
150200 VideoEvents :: LoadedMetadata => trigger_event (
151201 asset_id,
152202 LoadedMetadata {
153- width : video. video_width ( ) ,
154- height : video. video_height ( ) ,
203+ width : video. element . video_width ( ) ,
204+ height : video. element . video_height ( ) ,
155205 } ,
156206 commands,
157207 videos,
@@ -165,8 +215,8 @@ pub(crate) fn dispatch_events(
165215 VideoEvents :: Resize => trigger_event (
166216 asset_id,
167217 Resize {
168- width : video. video_width ( ) ,
169- height : video. video_height ( ) ,
218+ width : video. element . video_width ( ) ,
219+ height : video. element . video_height ( ) ,
170220 } ,
171221 commands,
172222 videos,
@@ -201,5 +251,6 @@ fn trigger_event<E>(
201251 }
202252 } )
203253 . for_each ( |entity| commands. trigger_targets ( video_event, entity) ) ;
254+
204255 commands. trigger ( video_event) ;
205256}
0 commit comments