[work]: Adding tick subscription to track time change

This will eventually help us to drive animations and track keyframes
and such.
This commit is contained in:
Chris Cochrun 2026-04-26 06:51:27 -05:00
parent be47681fa7
commit b2b21a6d58
2 changed files with 48 additions and 45 deletions

View file

@ -33,6 +33,7 @@ use cosmic::{
Application, ApplicationExt, Apply, Element, cosmic_config,
executor, theme,
};
use std::time::{Duration, Instant};
// use crisp::types::Value;
// use lisp::parse_lisp;
use miette::{IntoDiagnostic, Result, miette};
@ -198,6 +199,7 @@ enum Message {
LibraryToggle,
Quit,
Key(Key, Modifiers),
Tick(Instant),
None,
EditorToggle(bool),
ChangeServiceItem(usize),
@ -666,11 +668,15 @@ impl cosmic::Application for App {
}
fn subscription(&self) -> Subscription<Self::Message> {
event::listen_with(|event, status, id| {
// debug!(?event);
match status {
event::Status::Ignored => {
match event {
let time_subscription =
cosmic::iced::time::every(Duration::from_millis(50))
.map(Message::Tick);
let event_subscription = event::listen_with(
|event, status, id| {
// debug!(?event);
match status {
event::Status::Ignored => {
match event {
iced::Event::Keyboard(event) => match event {
iced::keyboard::Event::KeyReleased {
key,
@ -720,10 +726,13 @@ impl cosmic::Application for App {
}
iced::Event::InputMethod(_event) => todo!(),
}
}
event::Status::Captured => None,
}
event::Status::Captured => None,
}
})
},
);
Subscription::batch([time_subscription, event_subscription])
}
fn context_drawer(
@ -1129,6 +1138,9 @@ impl cosmic::Application for App {
}
}
}
Message::Tick(instant) => self.update(Message::Present(
presenter::Message::Tick(instant),
)),
Message::Library(message) => {
if let Some(library) = &mut self.library {
match library.update(message) {

View file

@ -3,7 +3,7 @@ use std::fs::File;
use std::io::BufReader;
use std::path::PathBuf;
use std::sync::{Arc, LazyLock};
use std::time::Duration;
use std::time::{Duration, Instant};
use cosmic::cosmic_theme::Spacing;
use cosmic::iced::alignment::Horizontal;
@ -14,8 +14,8 @@ use cosmic::iced::widget::scrollable::{
};
use cosmic::iced::widget::stack;
use cosmic::iced::{
Background, Border, Color, ContentFit, Font, Length, Point,
Shadow, Vector,
Animation, Background, Border, Color, ContentFit, Font, Length,
Point, Shadow, Vector, animation,
};
use cosmic::prelude::*;
use cosmic::widget::divider::{self, vertical};
@ -74,6 +74,8 @@ pub(crate) struct Presenter {
obs_scenes: Option<Vec<Scene>>,
preview_size: f32,
pub image_loader: ImageLoader,
animation: Option<Animation<bool>>,
now: Instant,
}
#[allow(dead_code)]
@ -110,42 +112,9 @@ pub(crate) enum Message {
PlayPauseVideo,
CloseContextMenu,
ChangePreviewSize(f64),
Tick(Instant),
}
// #[allow(clippy::enum_variant_names)]
// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
// enum MenuAction {
// ObsSceneAssign(usize),
// ObsStartStream,
// ObsStopStream,
// // ObsStartRecord,
// // ObsStopRecord,
// }
// impl menu::Action for MenuAction {
// type Message = Message;
// fn message(&self) -> Self::Message {
// match self {
// Self::ObsSceneAssign(scene) => {
// Message::AssignObsScene(*scene)
// }
// Self::ObsStartStream => Message::AssignSlideAction(
// slide_actions::Action::Obs {
// action: ObsAction::StartStream,
// },
// ),
// Self::ObsStopStream => Message::AssignSlideAction(
// slide_actions::Action::Obs {
// action: ObsAction::StopStream,
// },
// ),
// // Self::ObsStartRecord => todo!(),
// // Self::ObsStopRecord => todo!(),
// }
// }
// }
impl Presenter {
#[allow(clippy::too_many_lines)]
pub fn with_items(items: Arc<Vec<ServiceItem>>) -> Self {
@ -262,6 +231,8 @@ impl Presenter {
obs_scenes: None,
image_loader: ImageLoader::default(),
preview_size: 100.0,
animation: None,
now: Instant::now(),
}
}
@ -323,6 +294,9 @@ impl Presenter {
return self.change_slide(slide.clone());
}
}
Message::Tick(instant) => {
self.now = instant;
}
Message::AddObsClient(client) => {
self.obs_client = Some(client);
}
@ -1149,6 +1123,23 @@ impl Presenter {
self.audio_position = Some(self.sink.1.get_pos());
}
}
if self.service.get(self.current_item).is_some_and(|item| {
matches!(
item.kind,
crate::core::kinds::ServiceItemKind::Song(..)
)
}) {
self.animation = Some(
Animation::new(false)
.slow()
.easing(animation::Easing::EaseInExpo),
);
if let Some(animation) = &mut self.animation {
animation.go_mut(true, self.now);
};
} else {
self.animation = None;
};
let task_count = tasks.len();
debug!(?task_count);