From e4cdccce6362325d5997307d872adad9dd7d3ad9 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 24 Jun 2024 14:05:28 +0900 Subject: [PATCH] Impl. show percentage, minor fixes Implement showing percentage of song played next to time remaining. Add flag to disable showing percentage. Fix time remaining background persisting when song is no longer playing. --- src/display.rs | 51 ++++++++++++++++++++++++++++++++++---------------- src/main.rs | 2 ++ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/display.rs b/src/display.rs index 9e7cd16..0c57b46 100644 --- a/src/display.rs +++ b/src/display.rs @@ -54,6 +54,14 @@ fn seconds_to_time(seconds: f64) -> String { result } +fn time_to_percentage(total: f64, current: f64) -> String { + let result = (100.0f64 * current / total).to_string(); + match result.split_once('.') { + Some((a, _)) => a.to_string() + "%", + None => result + "%", + } +} + #[cfg(not(feature = "unicode_support"))] #[allow(clippy::ptr_arg)] fn string_to_text( @@ -227,6 +235,7 @@ pub struct MPDDisplay { text_bg_mesh: Option, hide_text: bool, tried_album_art_in_dir: bool, + prev_mpd_play_state: MPDPlayState, mpd_play_state: MPDPlayState, loaded_fonts: Vec<(PathBuf, String)>, } @@ -267,6 +276,7 @@ impl MPDDisplay { text_bg_mesh: None, hide_text: false, tried_album_art_in_dir: false, + prev_mpd_play_state: MPDPlayState::Playing, mpd_play_state: MPDPlayState::Playing, loaded_fonts: Vec::new(), filename_string_cache: String::new(), @@ -714,21 +724,19 @@ impl MPDDisplay { Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity), )?; } - let mesh: Mesh = Mesh::from_data( - ctx, - mesh_builder - .rectangle( - DrawMode::fill(), - Rect { - x: TEXT_X_OFFSET, - y: self.cached_timer_y, - w: timer_dimensions.w, - h: timer_dimensions.h, - }, - Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity), - )? - .build(), - ); + if self.mpd_play_state == MPDPlayState::Playing { + mesh_builder.rectangle( + DrawMode::fill(), + Rect { + x: TEXT_X_OFFSET, + y: self.cached_timer_y, + w: timer_dimensions.w, + h: timer_dimensions.h, + }, + Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity), + )?; + } + let mesh: Mesh = Mesh::from_data(ctx, mesh_builder.build()); self.text_bg_mesh = Some(mesh); @@ -831,8 +839,10 @@ impl EventHandler for MPDDisplay { self.length = 0.0; self.album_art = None; } + self.prev_mpd_play_state = self.mpd_play_state; self.mpd_play_state = shared.mpd_play_state; } else { + self.prev_mpd_play_state = self.mpd_play_state; self.mpd_play_state = MPDPlayState::Playing; if !shared.title.is_empty() { if shared.title != self.title_string_cache { @@ -929,7 +939,11 @@ impl EventHandler for MPDDisplay { let delta = ctx.time.delta(); self.timer += delta.as_secs_f64(); - let timer_diff = seconds_to_time(self.length - self.timer); + let mut timer_diff = seconds_to_time(self.length - self.timer); + if !self.opts.disable_show_percentage { + let timer_percentage = time_to_percentage(self.length, self.timer); + timer_diff = timer_diff + " " + &timer_percentage; + } let timer_diff_len = timer_diff.len(); self.timer_text = Text::new(timer_diff); self.timer_text.set_scale(PxScale { @@ -939,6 +953,11 @@ impl EventHandler for MPDDisplay { if timer_diff_len != self.timer_text_len { self.timer_text_len = timer_diff_len; self.update_bg_mesh(ctx)?; + } else if self.mpd_play_state != MPDPlayState::Playing + && self.prev_mpd_play_state == MPDPlayState::Playing + { + self.update_bg_mesh(ctx)?; + self.prev_mpd_play_state = self.mpd_play_state; } Ok(()) diff --git a/src/main.rs b/src/main.rs index 3626a3b..10ea49a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,6 +35,8 @@ pub struct Opt { disable_show_album: bool, #[arg(long = "disable-show-filename", help = "disable filename display")] disable_show_filename: bool, + #[arg(long = "disable-show-percentage", help = "disable percentage display")] + disable_show_percentage: bool, #[arg(long = "pprompt", help = "input password via prompt")] enable_prompt_password: bool, #[arg(long = "pfile", help = "read password from file")]