From 71a4eb2cf0861174b2fff6c5e026d05b674c9ce6 Mon Sep 17 00:00:00 2001 From: mars Date: Tue, 15 Nov 2022 21:37:03 -0700 Subject: [PATCH] Use progress info in position/duration labels --- scripts/sao-ui/src/music_player.rs | 48 +++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/scripts/sao-ui/src/music_player.rs b/scripts/sao-ui/src/music_player.rs index bdd6014..dce3be5 100644 --- a/scripts/sao-ui/src/music_player.rs +++ b/scripts/sao-ui/src/music_player.rs @@ -1,7 +1,7 @@ use api::*; use canary_script::*; -use canary_music_player::{AlbumInfo, PlaybackStatus, TrackInfo}; +use canary_music_player::{AlbumInfo, PlaybackStatus, ProgressChanged, TrackInfo}; use crate::widgets::prelude::*; use button::{RoundButton, RoundButtonStyle}; @@ -79,6 +79,7 @@ impl PanelImpl for MusicPlayerPanel { (Some(widget), AlbumChanged(info)) => widget.update_album(info), (Some(widget), TrackChanged(info)) => widget.update_track(info), (Some(widget), PlaybackStatusChanged(status)) => widget.update_playback_status(status), + (Some(widget), ProgressChanged(progress)) => widget.update_progress(progress), _ => {} } } @@ -117,6 +118,9 @@ pub struct MusicPlayerWidget { art_rect: Rect, body_rect: Rect, footer_rect: Rect, + position_secs: f32, + position_dirty: bool, + status: PlaybackStatus, } impl Container for MusicPlayerWidget { @@ -131,6 +135,19 @@ impl Container for MusicPlayerWidget { f(&mut self.duration); } + fn update(&mut self, dt: f32) { + if let PlaybackStatus::Playing = self.status { + self.position_secs += dt; + self.position_dirty = true; + } + + if self.position_dirty { + self.position_dirty = false; + self.position + .set_text(&Self::format_time(self.position_secs)); + } + } + fn draw(&mut self, ctx: &DrawContext) { ctx.draw_partially_rounded_rect( CornerFlags::TOP, @@ -239,6 +256,22 @@ impl MusicPlayerWidget { art_rect: Rect::from_xy_size(Vec2::ZERO, Vec2::ZERO), body_rect: Rect::from_xy_size(Vec2::ZERO, Vec2::ZERO), footer_rect: Rect::from_xy_size(Vec2::ZERO, Vec2::ZERO), + position_secs: 0.0, + position_dirty: false, + status: PlaybackStatus::Paused, + } + } + + pub fn format_time(secs: f32) -> String { + let duration = secs.floor() as usize; + let seconds = duration % 60; + let minutes = (duration / 60) % 60; + let hours = (duration / 60) / 60; + + if hours > 0 { + format!("{:02}:{:02}:{:02}", hours, minutes, seconds) + } else { + format!("{:02}:{:02}", minutes, seconds) } } @@ -304,7 +337,20 @@ impl MusicPlayerWidget { ); } + pub fn update_progress(&mut self, progress: ProgressChanged) { + self.position_secs = progress.position; + self.position_dirty = true; + + if let Some(length) = progress.length { + self.duration.set_text(&Self::format_time(length)); + } else { + self.duration.set_text("--:--"); + } + } + pub fn update_playback_status(&mut self, status: PlaybackStatus) { + self.status = status; + let icon = match status { PlaybackStatus::Playing => "契", PlaybackStatus::Paused => "",