Skip to content

Commit ebbb830

Browse files
committed
Improve random seek with synchronization
1 parent 01b067e commit ebbb830

File tree

4 files changed

+55
-28
lines changed

4 files changed

+55
-28
lines changed

src/gui/app.rs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ impl App {
534534
}
535535
}
536536

537-
fn synchronize_players(&mut self, originator: grid::Id, category: Option<player::Category>, event: player::Event) {
537+
fn synchronize_players(&mut self, originator: grid::Id, category: player::Category, event: player::Event) {
538538
if !self.config.playback.synchronized {
539539
return;
540540
}
@@ -581,13 +581,13 @@ impl App {
581581
match update {
582582
grid::Update::PauseChanged { category, paused } => {
583583
self.update_playback();
584-
self.synchronize_players(grid_id, Some(category), player::Event::SetPause(paused));
584+
self.synchronize_players(grid_id, category, player::Event::SetPause(paused));
585585
}
586586
grid::Update::MuteChanged => {
587587
self.update_playback();
588588
}
589589
grid::Update::RelativePositionChanged { category, position } => {
590-
self.synchronize_players(grid_id, Some(category), player::Event::SeekRelative(position));
590+
self.synchronize_players(grid_id, category, player::Event::SeekRelative(position));
591591
}
592592
grid::Update::PlayerClosed => {
593593
self.playlist_dirty = true;
@@ -838,11 +838,7 @@ impl App {
838838
if self.modals.is_empty() {
839839
match c.as_str() {
840840
"J" | "j" => self.generate_event_in_selection(
841-
|_| {
842-
Some(Message::AllPlayers {
843-
event: player::Event::SeekRandom,
844-
})
845-
},
841+
|_| Some(Message::SeekRandom),
846842
|grid_id, _| Some(PaneEvent::SeekRandom { grid_id }),
847843
|_| Some(player::Event::SeekRandom),
848844
),
@@ -945,6 +941,19 @@ impl App {
945941
self.set_synchronized(flag);
946942
Task::none()
947943
}
944+
Message::SeekRandom => {
945+
let event = if self.config.playback.synchronized {
946+
player::Event::seek_random_relative()
947+
} else {
948+
player::Event::SeekRandom
949+
};
950+
951+
for (_grid_id, grid) in self.grids.iter_mut() {
952+
grid.update_all_players(event.clone(), &mut self.media, &self.config.playback);
953+
}
954+
955+
Task::none()
956+
}
948957
Message::Player {
949958
grid_id,
950959
player_id,
@@ -963,12 +972,6 @@ impl App {
963972
}
964973
Task::none()
965974
}
966-
Message::AllPlayers { event } => {
967-
for (_grid_id, grid) in self.grids.iter_mut() {
968-
grid.update_all_players(event.clone(), &mut self.media, &self.config.playback);
969-
}
970-
Task::none()
971-
}
972975
Message::Modal { event } => {
973976
if let Some(modal) = self.modals.last_mut() {
974977
if let Some(update) = modal.update(event) {
@@ -1179,8 +1182,18 @@ impl App {
11791182
}
11801183
}
11811184
PaneEvent::SeekRandom { grid_id } => {
1185+
let event = if self.config.playback.synchronized {
1186+
player::Event::seek_random_relative()
1187+
} else {
1188+
player::Event::SeekRandom
1189+
};
1190+
11821191
if let Some(grid) = self.grids.get_mut(grid_id) {
1183-
grid.update_all_players(player::Event::SeekRandom, &mut self.media, &self.config.playback);
1192+
grid.update_all_players(event.clone(), &mut self.media, &self.config.playback);
1193+
1194+
for category in grid.categories() {
1195+
self.synchronize_players(grid_id, category, event.clone());
1196+
}
11841197
}
11851198
}
11861199
PaneEvent::Refresh { grid_id } => {
@@ -1439,9 +1452,7 @@ impl App {
14391452
)
14401453
.push(
14411454
button::icon(Icon::TimerRefresh)
1442-
.on_press(Message::AllPlayers {
1443-
event: player::Event::SeekRandom,
1444-
})
1455+
.on_press(Message::SeekRandom)
14451456
.enabled(!self.all_idle() && self.can_jump())
14461457
.obscured(obscured)
14471458
.tooltip_below(lang::action::jump_position()),

src/gui/common.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,12 @@ pub enum Message {
7171
volume: f32,
7272
},
7373
SetSynchronized(bool),
74+
SeekRandom,
7475
Player {
7576
grid_id: grid::Id,
7677
player_id: player::Id,
7778
event: player::Event,
7879
},
79-
AllPlayers {
80-
event: player::Event,
81-
},
8280
Modal {
8381
event: modal::Event,
8482
},

src/gui/grid.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ impl Grid {
245245
self.players.iter().filter_map(|x| x.media()).collect()
246246
}
247247

248+
pub fn categories(&self) -> HashSet<player::Category> {
249+
self.players.iter().map(|player| player.category()).collect()
250+
}
251+
248252
pub fn total_players(&self) -> usize {
249253
self.players.len()
250254
}
@@ -352,7 +356,7 @@ impl Grid {
352356
player::Update::PauseChanged(paused) => {
353357
self.synchronize_players(
354358
Some(player_id),
355-
Some(category),
359+
category,
356360
player::Event::SetPause(paused),
357361
&playback,
358362
);
@@ -361,7 +365,7 @@ impl Grid {
361365
player::Update::RelativePositionChanged(position) => {
362366
self.synchronize_players(
363367
Some(player_id),
364-
Some(category),
368+
category,
365369
player::Event::SeekRelative(position),
366370
&playback,
367371
);
@@ -447,15 +451,15 @@ impl Grid {
447451
pub fn synchronize_players(
448452
&mut self,
449453
originator: Option<player::Id>,
450-
category: Option<player::Category>,
454+
category: player::Category,
451455
event: player::Event,
452456
playback: &Playback,
453457
) {
454458
if !playback.synchronized {
455459
return;
456460
}
457461
for (i, player) in self.players.iter_mut().enumerate() {
458-
if Some(player::Id(i)) == originator || category.is_some_and(|x| x != player.category()) {
462+
if Some(player::Id(i)) == originator || category != player.category() {
459463
continue;
460464
}
461465
let _ = player.update(event.clone(), playback);

src/gui/player.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ pub enum Event {
261261
SeekRelative(f64),
262262
SeekStop,
263263
SeekRandom,
264+
SeekRandomRelative(f64),
264265
EndOfStream,
265266
NewFrame,
266267
MouseEnter,
@@ -271,6 +272,14 @@ pub enum Event {
271272
WindowUnfocused,
272273
}
273274

275+
impl Event {
276+
pub fn seek_random_relative() -> Self {
277+
use rand::Rng;
278+
let position = rand::rng().random_range(0.0..0.95);
279+
Self::SeekRandomRelative(position)
280+
}
281+
}
282+
274283
#[derive(Debug, Clone)]
275284
pub enum Update {
276285
PauseChanged(bool),
@@ -298,7 +307,7 @@ struct Overlay {
298307
timestamps: bool,
299308
}
300309

301-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
310+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
302311
pub enum Category {
303312
Other,
304313
Image,
@@ -943,6 +952,7 @@ impl Player {
943952
Event::SeekRelative(_) => None,
944953
Event::SeekStop => None,
945954
Event::SeekRandom => None,
955+
Event::SeekRandomRelative(_) => None,
946956
Event::EndOfStream => None,
947957
Event::NewFrame => None,
948958
Event::MouseEnter => {
@@ -967,6 +977,7 @@ impl Player {
967977
Event::SeekRelative(_) => None,
968978
Event::SeekStop => None,
969979
Event::SeekRandom => None,
980+
Event::SeekRandomRelative(_) => None,
970981
Event::EndOfStream => None,
971982
Event::NewFrame => None,
972983
Event::MouseEnter => {
@@ -1020,6 +1031,7 @@ impl Player {
10201031
None
10211032
}
10221033
Event::SeekRandom => None,
1034+
Event::SeekRandomRelative(_) => None,
10231035
Event::EndOfStream => Some(Update::EndOfStream),
10241036
Event::NewFrame => None,
10251037
Event::MouseEnter => {
@@ -1085,6 +1097,7 @@ impl Player {
10851097
None
10861098
}
10871099
Event::SeekRandom => None,
1100+
Event::SeekRandomRelative(_) => None,
10881101
Event::EndOfStream => Some(Update::EndOfStream),
10891102
Event::NewFrame => None,
10901103
Event::MouseEnter => {
@@ -1150,6 +1163,7 @@ impl Player {
11501163
None
11511164
}
11521165
Event::SeekRandom => None,
1166+
Event::SeekRandomRelative(_) => None,
11531167
Event::EndOfStream => Some(Update::EndOfStream),
11541168
Event::NewFrame => None,
11551169
Event::MouseEnter => {
@@ -1220,7 +1234,7 @@ impl Player {
12201234
let _ = sink.try_seek(Duration::from_secs_f64(offset));
12211235
Update::relative_position_changed(offset, *duration)
12221236
}
1223-
Event::SeekRelative(offset) => {
1237+
Event::SeekRelative(offset) | Event::SeekRandomRelative(offset) => {
12241238
let _ = sink.try_seek(Duration::from_secs_f64(duration.as_secs_f64() * offset));
12251239
None
12261240
}
@@ -1302,7 +1316,7 @@ impl Player {
13021316
seek_video(video, *position);
13031317
Update::relative_position_changed(offset, *duration)
13041318
}
1305-
Event::SeekRelative(offset) => {
1319+
Event::SeekRelative(offset) | Event::SeekRandomRelative(offset) => {
13061320
*position = duration.as_secs_f64() * offset;
13071321
seek_video(video, *position);
13081322
None

0 commit comments

Comments
 (0)