Skip to content

Commit dd39b88

Browse files
committed
seek and speed controls
1 parent 4fae6ff commit dd39b88

4 files changed

Lines changed: 44 additions & 10 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ rust-embed = "8"
3030
# Logging
3131
env_logger = "0.11"
3232
log = "0.4"
33+
ordered-float = "5.3.0"
3334

3435
[dependencies.iced_video_player]
3536
git = "https://github.com/wash2/iced_video_player.git"

src/key_bind.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use cosmic::iced::keyboard::Key;
22
use cosmic::iced::keyboard::key::Named;
3+
use ordered_float::OrderedFloat;
34
use std::collections::HashMap;
45

56
use crate::Action;
@@ -11,13 +12,13 @@ pub fn key_binds() -> HashMap<KeyBind, Action> {
1112
let mut key_binds = HashMap::new();
1213

1314
macro_rules! bind {
14-
([$($modifier:ident),* $(,)?], $key:expr, $action:ident) => {{
15+
([$($modifier:ident),* $(,)?], $key:expr, $action:ident $(($($args:expr),*))?) => {{
1516
key_binds.insert(
1617
KeyBind {
1718
modifiers: vec![$(Modifier::$modifier),*],
1819
key: $key,
1920
},
20-
Action::$action,
21+
Action::$action $(($($args),*))?,
2122
);
2223
}};
2324
}
@@ -32,10 +33,23 @@ pub fn key_binds() -> HashMap<KeyBind, Action> {
3233
bind!([], Key::Character(",".into()), PreviousFrame);
3334
bind!([], Key::Character("a".into()), AbRepeat);
3435
bind!([], Key::Character("m".into()), AudioToggle);
35-
bind!([], Key::Named(Named::ArrowUp), VolumeUp);
36-
bind!([], Key::Named(Named::ArrowDown), VolumeDown);
3736
bind!([], Key::Named(Named::PageUp), PlayPrev);
3837
bind!([], Key::Named(Named::PageDown), PlayNext);
38+
bind!([], Key::Named(Named::ArrowUp), ChangeVolume(OrderedFloat(0.002)));
39+
bind!([], Key::Named(Named::ArrowDown), ChangeVolume(OrderedFloat(-0.002)));
40+
bind!([Shift], Key::Character(",".into()), ChangeSpeed(OrderedFloat(-0.25)));
41+
bind!([Shift], Key::Character(".".into()), ChangeSpeed(OrderedFloat(0.25)));
42+
43+
bind!([], Key::Character("0".into()), Seek(OrderedFloat(0.0)));
44+
bind!([], Key::Character("1".into()), Seek(OrderedFloat(0.1)));
45+
bind!([], Key::Character("2".into()), Seek(OrderedFloat(0.2)));
46+
bind!([], Key::Character("3".into()), Seek(OrderedFloat(0.3)));
47+
bind!([], Key::Character("4".into()), Seek(OrderedFloat(0.4)));
48+
bind!([], Key::Character("5".into()), Seek(OrderedFloat(0.5)));
49+
bind!([], Key::Character("6".into()), Seek(OrderedFloat(0.6)));
50+
bind!([], Key::Character("7".into()), Seek(OrderedFloat(0.7)));
51+
bind!([], Key::Character("8".into()), Seek(OrderedFloat(0.8)));
52+
bind!([], Key::Character("9".into()), Seek(OrderedFloat(0.9)));
3953

4054
key_binds
4155
}

src/main.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use cosmic::widget::{self, Slider, nav_bar, segmented_button};
1717
use cosmic::{Application, ApplicationExt, Element, action, cosmic_theme, executor, font, theme};
1818
use iced_video_player::gst::prelude::*;
1919
use iced_video_player::{Video, VideoPlayer, gst, gst_pbutils};
20+
use ordered_float::OrderedFloat;
2021
use std::any::TypeId;
2122
use std::collections::HashMap;
2223
use 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

Comments
 (0)