use miette::{IntoDiagnostic, Result}; use obws::{Client, responses::scenes::Scene}; use std::{ collections::HashMap, fs::File, io::BufReader, path::PathBuf, sync::{Arc, LazyLock}, }; use cosmic::{ Task, iced::{ Background, Border, Color, ContentFit, Font, Length, Shadow, Vector, font::{Family, Stretch, Style, Weight}, }, iced_widget::{ scrollable::{ AbsoluteOffset, Direction, Scrollbar, scroll_to, }, stack, vertical_rule, }, prelude::*, widget::{ Container, Id, Row, Space, container, context_menu, image, menu, mouse_area, responsive, scrollable, text, }, }; use iced_video_player::{Position, Video, VideoPlayer, gst_pbutils}; use rodio::{Decoder, OutputStream, OutputStreamBuilder, Sink}; use tracing::{debug, error, info, warn}; use url::Url; use crate::{ BackgroundKind, core::{ service_items::ServiceItem, slide::Slide, slide_actions::{self, ObsAction}, }, }; const REFERENCE_WIDTH: f32 = 1920.0; static DEFAULT_SLIDE: LazyLock = LazyLock::new(Slide::default); // #[derive(Default, Clone, Debug)] pub(crate) struct Presenter { pub service: Vec, pub current_slide: Slide, pub current_item: usize, pub current_slide_index: usize, pub absolute_slide_index: usize, pub total_slides: usize, pub video: Option