making more themable system

This commit is contained in:
Chris Cochrun 2024-12-10 15:15:03 -06:00
parent db39eb12b8
commit 3ddcbfdc10

View file

@ -4,7 +4,6 @@ use cosmic::{
dialog::ashpd::url::Url, dialog::ashpd::url::Url,
iced::{ iced::{
font::{Family, Stretch, Style, Weight}, font::{Family, Stretch, Style, Weight},
widget::text,
Background, Border, Color, ContentFit, Font, Length, Shadow, Background, Border, Color, ContentFit, Font, Length, Shadow,
Vector, Vector,
}, },
@ -14,7 +13,7 @@ use cosmic::{
}, },
prelude::*, prelude::*,
widget::{ widget::{
container, image, mouse_area, responsive, scrollable, container, image, mouse_area, responsive, scrollable, text,
Container, Responsive, Row, Space, Container, Responsive, Row, Space,
}, },
Task, Task,
@ -51,44 +50,10 @@ pub(crate) enum Message {
StartVideo, StartVideo,
VideoPos(f32), VideoPos(f32),
VideoFrame, VideoFrame,
HoverDelegate(i32), HoveredSlide(i32),
} }
impl Presenter { impl Presenter {
pub fn with_slides(slides: Vec<Slide>) -> Self {
Self {
slides: slides.clone(),
items: ServiceItemModel::default(),
current_slide: slides[0].clone(),
current_slide_index: 0,
video: {
if let Some(slide) = slides.get(0) {
let path = slide.background().path.clone();
if path.exists() {
let url = Url::from_file_path(path).unwrap();
let result = Video::new(&url);
match result {
Ok(mut v) => {
v.set_paused(true);
Some(v)
}
Err(e) => {
error!("Had an error creating the video object: {e}");
None
}
}
} else {
None
}
} else {
None
}
},
video_position: 0.0,
hovered_slide: -1,
}
}
pub fn with_items(items: ServiceItemModel) -> Self { pub fn with_items(items: ServiceItemModel) -> Self {
let slides = if let Ok(slides) = items.to_slides() { let slides = if let Ok(slides) = items.to_slides() {
slides slides
@ -212,7 +177,7 @@ impl Presenter {
} }
Task::none() Task::none()
} }
Message::HoverDelegate(slide) => { Message::HoveredSlide(slide) => {
self.hovered_slide = slide; self.hovered_slide = slide;
Task::none() Task::none()
} }
@ -266,7 +231,7 @@ impl Presenter {
Container::new( Container::new(
VideoPlayer::new(video) VideoPlayer::new(video)
.width(size.width) .width(size.width)
.height(size.height) .height(size.width * 9.0 / 16.0)
.on_end_of_stream(Message::EndVideo) .on_end_of_stream(Message::EndVideo)
.on_new_frame(Message::VideoFrame) .on_new_frame(Message::VideoFrame)
.content_fit(ContentFit::Cover), .content_fit(ContentFit::Cover),
@ -349,14 +314,21 @@ impl Presenter {
.width(Length::Fill) .width(Length::Fill)
.height(Length::Fill), .height(Length::Fill),
) )
.style(move |_| { .style(move |t| {
let theme = cosmic::iced::Theme::Dark; let mut style = container::Style::default();
let theme = t.cosmic();
let hovered = self.hovered_slide == slide_id; let hovered = self.hovered_slide == slide_id;
container::Style { style.background = Some(Background::Color(
background: Some(Background::Color( if self.current_slide_index as i32 == slide_id {
theme.palette().background, theme.accent.base.into()
)), } else if hovered {
shadow: Shadow { theme.accent.hover.into()
} else {
theme.palette.neutral_3.into()
},
));
style.border = Border::default().rounded(10.0);
style.shadow = Shadow {
color: Color::BLACK, color: Color::BLACK,
offset: { offset: {
if hovered { if hovered {
@ -372,18 +344,16 @@ impl Presenter {
0.0 0.0
} }
}, },
}, };
border: Border::default().rounded(10.0), style
..Default::default()
}
}) })
.center_x(100.0 * 16.0 / 9.0) .center_x(100.0 * 16.0 / 9.0)
.height(100) .height(100)
.padding(10), .padding(10),
) )
.interaction(cosmic::iced::mouse::Interaction::Pointer) .interaction(cosmic::iced::mouse::Interaction::Pointer)
.on_enter(Message::HoverDelegate(slide_id)) .on_enter(Message::HoveredSlide(slide_id))
.on_exit(Message::HoverDelegate(-1)) .on_exit(Message::HoveredSlide(-1))
.on_press({ .on_press({
let id = let id =
self.slides.iter().position(|s| s == slide).unwrap(); self.slides.iter().position(|s| s == slide).unwrap();