From 06debe1cc832d49d3a41554dc19d2c833559a4df Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Sat, 2 Nov 2024 04:47:07 -0500 Subject: [PATCH] switching to using cosmic's version of video_player --- Cargo.lock | 377 +++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 4 +- src/main.rs | 36 ++++- src/ui/presenter.rs | 40 ++++- 4 files changed, 444 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d7ab29..28e29aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -547,6 +547,12 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + [[package]] name = "atomicwrites" version = "0.4.2" @@ -807,6 +813,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfg-expr" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -1982,6 +1998,19 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "gio-sys" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217f464cad5946ae4369c355155e2d16b488c08920601083cb4891e352ae777b" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "windows-sys 0.52.0", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -1999,6 +2028,50 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" +[[package]] +name = "glib" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358431b0e0eb15b9d02db52e1f19c805b953c5c168099deb3de88beab761768c" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.81", +] + +[[package]] +name = "glib-sys" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5911863ab7ecd4a6f8d5976f12eeba076b23669c49b066d877e742544aa389" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glow" version = "0.13.1" @@ -2020,6 +2093,17 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gobject-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "gpu-alloc" version = "0.6.0" @@ -2078,6 +2162,189 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df00eed8d1f0db937f6be10e46e8072b0671accb504cf0f959c5c52c679f5b9" +[[package]] +name = "gstreamer" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680006694e79692f831ca4f3ba6e147b8c23db289b2df1d33a4a97fd038145d7" +dependencies = [ + "cfg-if", + "futures-channel", + "futures-core", + "futures-util", + "glib", + "gstreamer-sys", + "itertools 0.13.0", + "libc", + "muldiv", + "num-integer", + "num-rational", + "once_cell", + "option-operations", + "paste", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gstreamer-app" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36bb7eb2817ba1ac56e8dc5ee6a1cb110f67f025f38527e9a327c5d4e2d5ef44" +dependencies = [ + "futures-core", + "futures-sink", + "glib", + "gstreamer", + "gstreamer-app-sys", + "gstreamer-base", + "libc", +] + +[[package]] +name = "gstreamer-app-sys" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d5cac633c1ab7030c777c8c58c682a0c763bbc4127bccc370dabe39c01a12d" +dependencies = [ + "glib-sys", + "gstreamer-base-sys", + "gstreamer-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-audio" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36d39b07213f83055fc705a384fa32ad581776b8e5b04c86f3a419ec5dfc0f81" +dependencies = [ + "cfg-if", + "glib", + "gstreamer", + "gstreamer-audio-sys", + "gstreamer-base", + "libc", + "once_cell", + "smallvec", +] + +[[package]] +name = "gstreamer-audio-sys" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980a205553927ec2167ad79b80819df79c3683632abefbe255baffe1b4112044" +dependencies = [ + "glib-sys", + "gobject-sys", + "gstreamer-base-sys", + "gstreamer-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-base" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a11df90e3abf1d9747111c41902338fc1bd13b1c23b27fb828d43e57bd190134" +dependencies = [ + "atomic_refcell", + "cfg-if", + "glib", + "gstreamer", + "gstreamer-base-sys", + "libc", +] + +[[package]] +name = "gstreamer-base-sys" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d691b2bb51a9e5727fb33c3b53fb64ee5b80c40cbbd250941a6d44b142f7a6a0" +dependencies = [ + "glib-sys", + "gobject-sys", + "gstreamer-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-pbutils" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc96a1ef43542ba68159e440adc7211e1f03824d91fd8f4e05b84f84002d33c" +dependencies = [ + "glib", + "gstreamer", + "gstreamer-audio", + "gstreamer-pbutils-sys", + "gstreamer-video", + "libc", + "thiserror", +] + +[[package]] +name = "gstreamer-pbutils-sys" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba8e30cb601e11aa8b61d40bef1891ba51744d108406807932d0afc58992205" +dependencies = [ + "glib-sys", + "gobject-sys", + "gstreamer-audio-sys", + "gstreamer-sys", + "gstreamer-video-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-sys" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db89964774a97d5b092e2d124debc6bbcaf34b5c7cdef1759f4a9e1e3f8326ef" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-video" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94193e7e4c07ba97f1627bd9907bd187e90cdac8849bb78479d744e9121893b" +dependencies = [ + "cfg-if", + "futures-channel", + "glib", + "gstreamer", + "gstreamer-base", + "gstreamer-video-sys", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gstreamer-video-sys" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81660cfa5a7b9973a51229785581d029da1681bf5aceffd5a4f32021db85ac0" +dependencies = [ + "glib-sys", + "gobject-sys", + "gstreamer-base-sys", + "gstreamer-sys", + "libc", + "system-deps", +] + [[package]] name = "guillotiere" version = "0.6.2" @@ -2165,6 +2432,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -2332,6 +2608,23 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "iced_video_player" +version = "0.6.0" +source = "git+https://github.com/jackpot51/iced_video_player?branch=cosmic#1ac4499a907314320c79dca22d7a6a1046c7c603" +dependencies = [ + "glib", + "gstreamer", + "gstreamer-app", + "gstreamer-base", + "gstreamer-pbutils", + "html-escape", + "libcosmic", + "log", + "thiserror", + "url", +] + [[package]] name = "iced_wgpu" version = "0.14.0-dev" @@ -2536,6 +2829,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2825,6 +3127,7 @@ name = "lumina" version = "0.1.0" dependencies = [ "clap", + "iced_video_player", "lexpr", "libcosmic", "miette", @@ -3044,6 +3347,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "muldiv" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" + [[package]] name = "mutate_once" version = "0.1.1" @@ -3537,6 +3846,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "option-operations" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" +dependencies = [ + "paste", +] + [[package]] name = "orbclient" version = "0.3.48" @@ -3584,7 +3902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" dependencies = [ "heck 0.4.1", - "itertools", + "itertools 0.12.1", "proc-macro2", "proc-macro2-diagnostics", "quote", @@ -4359,6 +4677,15 @@ dependencies = [ "syn 2.0.81", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4677,6 +5004,19 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "7.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + [[package]] name = "taffy" version = "0.3.11" @@ -4688,6 +5028,12 @@ dependencies = [ "slotmap", ] +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.13.0" @@ -4908,11 +5254,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.22", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -4932,6 +5293,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow 0.6.20", ] @@ -5167,6 +5530,12 @@ dependencies = [ "xmlwriter", ] +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5179,6 +5548,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 3e31731..a1229e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,6 @@ description = "A cli presentation system" [dependencies] clap = { version = "4.5.20", features = ["debug", "derive"] } libcosmic = { git = "https://github.com/pop-os/libcosmic", features = ["debug", "winit", "tokio", "xdg-portal", "dbus-config", "a11y", "wayland", "wgpu", "multi-window", "single-instance"] } -# iced = { version = "0.13.1", features = ["tokio", "image", "debug", "system"] } -# iced_aw = "0.11.0" lexpr = "0.2.7" miette = { version = "7.2.0", features = ["fancy"] } pretty_assertions = "1.4.1" @@ -18,4 +16,4 @@ serde = { version = "1.0.213", features = ["derive"] } serde-lexpr = "0.1.3" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["fmt", "std", "chrono", "time", "local-time", "env-filter"] } -# iced_video_player = "0.5.0" +iced_video_player = { git = "https://github.com/jackpot51/iced_video_player", branch = "cosmic", features = ["wgpu"] } diff --git a/src/main.rs b/src/main.rs index 833fd2d..854b592 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,7 +65,6 @@ fn theme(_state: &App) -> Theme { Theme::dark() } -#[derive(Default)] struct App { core: Core, nav_model: nav_bar::Model, @@ -74,6 +73,25 @@ struct App { windows: Vec, } +impl Default for App { + fn default() -> Self { + let initial_slide = SlideBuilder::new() + .background(PathBuf::from("/home/chris/vids/test/camprules2024.mp4")) + .expect("oops video") + .text("Hello") + .build() + .expect("oops slide"); + let presenter = Presenter::with_initial_slide(initial_slide); + Self { + presenter, + core: Core::default(), + nav_model: nav_bar::Model::default(), + file: PathBuf::default(), + windows: vec![], + } + } +} + #[derive(Debug, Clone)] enum Message { Present(presenter::Message), @@ -107,12 +125,26 @@ impl cosmic::Application for App { if input.ui { windows.push(core.main_window_id().unwrap()); } + let initial_slide = SlideBuilder::new() + .background(PathBuf::from("/home/chris/vids/test/camprules2024.mp4")) + .expect("oops video") + .text("Hello") + .font("Quicksand") + .font_size(50) + .text_alignment(TextAlignment::MiddleCenter) + .video_loop(true) + .video_start_time(0.0) + .video_end_time(0.0) + .build() + .expect("oops slide"); + let presenter = Presenter::with_initial_slide(initial_slide); + let mut app = App { core, nav_model, file: input.file, windows, - ..Default::default() + presenter, }; let command; diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index 6d78b27..eed370b 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -1,17 +1,22 @@ use cosmic::{ + dialog::ashpd::url::Url, iced::{widget::text, ContentFit, Length}, iced_widget::stack, prelude::*, widget::{image, Container}, Task, }; -use tracing::debug; +use iced_video_player::{Video, VideoPlayer}; +use miette::{Context, IntoDiagnostic}; +use tracing::{debug, error}; use crate::core::slide::Slide; -#[derive(Default, Clone, Debug)] +// #[derive(Default, Clone, Debug)] pub(crate) struct Presenter { slides: Vec, + current_slide: i16, + video: Video, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -22,6 +27,24 @@ pub(crate) enum Message { } impl Presenter { + pub fn with_initial_slide(slide: Slide) -> Self { + Self { + slides: vec![slide], + current_slide: 0, + video: { + let url = Url::from_file_path("/home/chris/vids/test/camprules2024.mp4").unwrap(); + let result = Video::new(&url); + match result { + Ok(v) => v, + Err(e) => { + // let root = e.source(); + panic!("Error here: {e}") + } + } + }, + } + } + pub fn update(&mut self, message: Message) -> Task> { match message { Message::NextSlide => { @@ -42,7 +65,6 @@ impl Presenter { pub fn view(&self) -> Element { // let window = self.windows.iter().position(|w| *w == id).unwrap(); // if let Some(_window) = self.windows.get(window) {} - // let video = Video::new(&Url::parse("/home/chris/vids/test/camprules2024.mp4").unwrap()) let text = text!("This is frodo").size(50); let text = Container::new(text).center(Length::Fill); let image = Container::new( @@ -51,10 +73,14 @@ impl Presenter { .width(Length::Fill) .height(Length::Fill), ); - // let video = Container::new(VideoPlayer::new(&video)) - // .width(Length::Fill) - // .height(Length::Fill); - let stack = stack!(image, text).width(Length::Fill).height(Length::Fill); + let video = Container::new( + VideoPlayer::new(&self.video) + .width(Length::Fill) + .height(Length::Fill), + ); + let stack = stack!(image, video, text) + .width(Length::Fill) + .height(Length::Fill); stack.into() } }