@@ -17,6 +17,7 @@ use cosmic::widget::{self, Slider, nav_bar, segmented_button};
1717use cosmic:: { Application , ApplicationExt , Element , action, cosmic_theme, executor, font, theme} ;
1818use iced_video_player:: gst:: prelude:: * ;
1919use iced_video_player:: { Video , VideoPlayer , gst, gst_pbutils} ;
20+ use ordered_float:: OrderedFloat ;
2021use std:: any:: TypeId ;
2122use std:: collections:: HashMap ;
2223use std:: ffi:: { CStr , CString } ;
@@ -188,8 +189,9 @@ pub enum Action {
188189 PreviousFrame ,
189190 AbRepeat ,
190191 AudioToggle ,
191- VolumeUp ,
192- VolumeDown ,
192+ ChangeVolume ( OrderedFloat < f64 > ) ,
193+ ChangeSpeed ( OrderedFloat < f64 > ) ,
194+ Seek ( OrderedFloat < f64 > ) ,
193195 WindowClose ,
194196}
195197
@@ -217,8 +219,9 @@ impl MenuAction for Action {
217219 Self :: AbRepeat => Message :: AbRepeat ,
218220 Self :: AudioToggle => Message :: AudioToggle ,
219221 Self :: WindowClose => Message :: WindowClose ,
220- Self :: VolumeUp => Message :: AudioVolumeDelta ( 0.02 ) ,
221- Self :: VolumeDown => Message :: AudioVolumeDelta ( -0.02 ) ,
222+ Self :: ChangeVolume ( change) => Message :: ChangeVolumeRelative ( change. into_inner ( ) ) ,
223+ Self :: ChangeSpeed ( change) => Message :: ChangeSpeedRelative ( change. into_inner ( ) ) ,
224+ Self :: Seek ( value) => Message :: SeekPercent ( value. into_inner ( ) )
222225 }
223226 }
224227}
@@ -303,7 +306,6 @@ pub enum Message {
303306 AudioCode ( usize ) ,
304307 AudioToggle ,
305308 AudioVolume ( f64 ) ,
306- AudioVolumeDelta ( f64 ) ,
307309 TextCode ( usize ) ,
308310 Pause ,
309311 Play ,
@@ -313,6 +315,9 @@ pub enum Message {
313315 Seek ( f64 ) ,
314316 SeekRelative ( f64 ) ,
315317 SeekRelease ,
318+ ChangeVolumeRelative ( f64 ) ,
319+ ChangeSpeedRelative ( f64 ) ,
320+ SeekPercent ( f64 ) ,
316321 PlayPrev ,
317322 PlayNext ,
318323 NextFrame ,
@@ -1250,7 +1255,7 @@ impl Application for App {
12501255 self . update_controls ( true ) ;
12511256 }
12521257 }
1253- Message :: AudioVolumeDelta ( delta) => {
1258+ Message :: ChangeVolumeRelative ( delta) => {
12541259 if let Some ( video) = & mut self . video_opt {
12551260 let volume = video. volume ( ) ;
12561261 return self . update ( Message :: AudioVolume ( volume + delta) ) ;
@@ -1365,6 +1370,14 @@ impl Application for App {
13651370 video. seek ( target, true ) . expect ( "seek" ) ;
13661371 }
13671372 }
1373+ Message :: SeekPercent ( float) => {
1374+ if let Some ( video) = & mut self . video_opt {
1375+ self . position =
1376+ ( self . duration * float) . clamp ( 0.0 , self . duration ) ;
1377+ let target = Duration :: try_from_secs_f64 ( self . position ) . unwrap_or_default ( ) ;
1378+ video. seek ( target, true ) . expect ( "seek" ) ;
1379+ }
1380+ }
13681381 Message :: SeekRelease => {
13691382 //TODO: cleanest way to close dropdowns
13701383 self . dropdown_opt = None ;
@@ -1525,6 +1538,11 @@ impl Application for App {
15251538 }
15261539 self . update_controls ( true ) ;
15271540 }
1541+ Message :: ChangeSpeedRelative ( float) => {
1542+ if let Some ( video) = self . video_opt . as_ref ( ) {
1543+ return self . update ( Message :: PlaybackSpeed ( video. speed ( ) + float) ) ;
1544+ }
1545+ }
15281546 Message :: VideoAreaClick => {
15291547 if self . dropdown_opt . is_some ( ) {
15301548 self . dropdown_opt = None ;
0 commit comments