LRC-SS-PLAYBACK: slideshow playback: fades, random order, repeat, previews prepared in advance, playback controls

This commit is contained in:
Jason Baldwin
2026-10-10 20:31:38 +02:00
parent b70ae1741e
commit 92077d0807
21 changed files with 1530 additions and 93 deletions
+2
View File
@@ -32,6 +32,7 @@ mod prefs;
mod preset_files;
pub mod previews;
mod query;
mod slideshow;
mod sync;
mod xmp;
@@ -144,6 +145,7 @@ pub fn command_specs() -> &'static [CommandSpec] {
v.extend(xmp::specs());
v.extend(preset_files::specs());
v.extend(prefs::specs());
v.extend(slideshow::specs());
v.extend(export::specs());
v.extend(before::specs());
v.extend(browse::specs());
+32
View File
@@ -0,0 +1,32 @@
//! `slideshow.playback`: the slideshow's Playback settings (slide and fade durations, fade colour,
//! random order, repeat, preparing previews in advance). A library preference, saved in the
//! library's `prefs.json`; the app's slideshow (View ▸ Slideshow) plays with them.
use serde_json::Value;
use super::{CommandSpec, always, bad, cmd};
use crate::{Result, Session};
fn playback(s: &mut Session, p: &Value) -> Result<Value> {
let changes = p.as_object().is_some_and(|o| !o.is_empty());
if changes {
let next = s.slideshow.merged(p).map_err(|e| bad("slideshow.playback", e))?;
if next != s.slideshow {
s.slideshow = next;
s.save_prefs()?;
}
}
Ok(s.slideshow.to_json())
}
pub fn specs() -> Vec<CommandSpec> {
vec![cmd!(
"slideshow.playback",
"Slideshow Playback Settings",
[],
None,
"{slideDuration?: seconds (0.5–120), fadeDuration?: seconds (0 = cut; at most 10 and the slide duration), fadeColor?: \"#rrggbb\"|[r,g,b]|null (fade through a colour instead of crossfading), randomOrder?: bool, repeat?: bool, preparePreviews?: bool (render the next slides before they are due)} — omitted keys keep their value, {} reads them; saved with the library → {slideDuration, fadeDuration, fadeColor, randomOrder, repeat, preparePreviews}",
always,
playback
)]
}