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")]