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.
This commit is contained in:
Stephen Seo 2024-06-24 14:05:28 +09:00
parent 015da43d1b
commit e4cdccce63
2 changed files with 37 additions and 16 deletions

View file

@ -54,6 +54,14 @@ fn seconds_to_time(seconds: f64) -> String {
result 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"))] #[cfg(not(feature = "unicode_support"))]
#[allow(clippy::ptr_arg)] #[allow(clippy::ptr_arg)]
fn string_to_text( fn string_to_text(
@ -227,6 +235,7 @@ pub struct MPDDisplay {
text_bg_mesh: Option<Mesh>, text_bg_mesh: Option<Mesh>,
hide_text: bool, hide_text: bool,
tried_album_art_in_dir: bool, tried_album_art_in_dir: bool,
prev_mpd_play_state: MPDPlayState,
mpd_play_state: MPDPlayState, mpd_play_state: MPDPlayState,
loaded_fonts: Vec<(PathBuf, String)>, loaded_fonts: Vec<(PathBuf, String)>,
} }
@ -267,6 +276,7 @@ impl MPDDisplay {
text_bg_mesh: None, text_bg_mesh: None,
hide_text: false, hide_text: false,
tried_album_art_in_dir: false, tried_album_art_in_dir: false,
prev_mpd_play_state: MPDPlayState::Playing,
mpd_play_state: MPDPlayState::Playing, mpd_play_state: MPDPlayState::Playing,
loaded_fonts: Vec::new(), loaded_fonts: Vec::new(),
filename_string_cache: String::new(), filename_string_cache: String::new(),
@ -714,21 +724,19 @@ impl MPDDisplay {
Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity), Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity),
)?; )?;
} }
let mesh: Mesh = Mesh::from_data( if self.mpd_play_state == MPDPlayState::Playing {
ctx, mesh_builder.rectangle(
mesh_builder DrawMode::fill(),
.rectangle( Rect {
DrawMode::fill(), x: TEXT_X_OFFSET,
Rect { y: self.cached_timer_y,
x: TEXT_X_OFFSET, w: timer_dimensions.w,
y: self.cached_timer_y, h: timer_dimensions.h,
w: timer_dimensions.w, },
h: timer_dimensions.h, Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity),
}, )?;
Color::from_rgba(0, 0, 0, self.opts.text_bg_opacity), }
)? let mesh: Mesh = Mesh::from_data(ctx, mesh_builder.build());
.build(),
);
self.text_bg_mesh = Some(mesh); self.text_bg_mesh = Some(mesh);
@ -831,8 +839,10 @@ impl EventHandler for MPDDisplay {
self.length = 0.0; self.length = 0.0;
self.album_art = None; self.album_art = None;
} }
self.prev_mpd_play_state = self.mpd_play_state;
self.mpd_play_state = shared.mpd_play_state; self.mpd_play_state = shared.mpd_play_state;
} else { } else {
self.prev_mpd_play_state = self.mpd_play_state;
self.mpd_play_state = MPDPlayState::Playing; self.mpd_play_state = MPDPlayState::Playing;
if !shared.title.is_empty() { if !shared.title.is_empty() {
if shared.title != self.title_string_cache { if shared.title != self.title_string_cache {
@ -929,7 +939,11 @@ impl EventHandler for MPDDisplay {
let delta = ctx.time.delta(); let delta = ctx.time.delta();
self.timer += delta.as_secs_f64(); 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(); let timer_diff_len = timer_diff.len();
self.timer_text = Text::new(timer_diff); self.timer_text = Text::new(timer_diff);
self.timer_text.set_scale(PxScale { self.timer_text.set_scale(PxScale {
@ -939,6 +953,11 @@ impl EventHandler for MPDDisplay {
if timer_diff_len != self.timer_text_len { if timer_diff_len != self.timer_text_len {
self.timer_text_len = timer_diff_len; self.timer_text_len = timer_diff_len;
self.update_bg_mesh(ctx)?; 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(()) Ok(())

View file

@ -35,6 +35,8 @@ pub struct Opt {
disable_show_album: bool, disable_show_album: bool,
#[arg(long = "disable-show-filename", help = "disable filename display")] #[arg(long = "disable-show-filename", help = "disable filename display")]
disable_show_filename: bool, 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")] #[arg(long = "pprompt", help = "input password via prompt")]
enable_prompt_password: bool, enable_prompt_password: bool,
#[arg(long = "pfile", help = "read password from file")] #[arg(long = "pfile", help = "read password from file")]