Impl album display

This commit is contained in:
Stephen Seo 2022-08-02 18:12:54 +09:00
parent dda5b15aa4
commit 95e4a75eed
3 changed files with 86 additions and 7 deletions

View file

@ -22,6 +22,7 @@ const TEXT_X_OFFSET: f32 = 0.3;
const TEXT_OFFSET_Y_SPACING: f32 = 0.4;
const TEXT_HEIGHT_SCALE: f32 = 0.1;
const ARTIST_HEIGHT_SCALE: f32 = 0.08;
const ALBUM_HEIGHT_SCALE: f32 = 0.08;
const TIMER_HEIGHT_SCALE: f32 = 0.07;
const MIN_WIDTH_RATIO: f32 = 4.0 / 5.0;
const INCREASE_AMT: f32 = 6.0 / 5.0;
@ -198,6 +199,9 @@ pub struct MPDDisplay {
title_text: Text,
title_string_cache: String,
title_transform: Transform,
album_text: Text,
album_string_cache: String,
album_transform: Transform,
timer_text: Text,
timer_transform: Transform,
timer_x: f32,
@ -219,18 +223,18 @@ impl MPDDisplay {
is_valid: true,
is_initialized: false,
is_authenticated: false,
notice_text: Text::new(""),
notice_text: Text::default(),
poll_instant: Instant::now() - POLL_TIME,
shared: None,
password_entered: false,
dirty_flag: None,
album_art: None,
album_art_draw_transform: None,
filename_text: Text::new(""),
filename_text: Text::default(),
filename_transform: Transform::default(),
artist_text: Text::new(""),
artist_text: Text::default(),
artist_transform: Transform::default(),
title_text: Text::new(""),
title_text: Text::default(),
title_transform: Transform::default(),
timer_text: Text::new("0"),
timer_transform: Transform::default(),
@ -246,6 +250,9 @@ impl MPDDisplay {
filename_string_cache: String::new(),
artist_string_cache: String::new(),
title_string_cache: String::new(),
album_text: Text::default(),
album_string_cache: String::new(),
album_transform: Transform::default(),
}
}
@ -420,12 +427,14 @@ impl MPDDisplay {
let screen_coords: Rect = graphics::screen_coordinates(ctx);
let text_height_limit = TEXT_HEIGHT_SCALE * screen_coords.h.abs();
let album_height_limit = ALBUM_HEIGHT_SCALE * screen_coords.h.abs();
let artist_height_limit = ARTIST_HEIGHT_SCALE * screen_coords.h.abs();
let timer_height = TIMER_HEIGHT_SCALE * screen_coords.h.abs();
let mut offset_y: f32 = screen_coords.h;
let mut filename_y: f32 = 0.0;
let mut album_y: f32 = 0.0;
let mut artist_y: f32 = 0.0;
let mut title_y: f32 = 0.0;
let mut timer_y: f32 = 0.0;
@ -436,6 +445,7 @@ impl MPDDisplay {
y: &mut f32,
is_string: bool,
is_artist: bool,
is_album: bool,
timer_x: &mut f32,
timer_y: &mut f32| {
let mut current_x = INIT_FONT_SIZE_X;
@ -463,6 +473,8 @@ impl MPDDisplay {
|| height
>= (if is_artist {
artist_height_limit
} else if is_album {
album_height_limit
} else {
text_height_limit
})
@ -513,6 +525,7 @@ impl MPDDisplay {
&mut filename_y,
true,
false,
false,
&mut self.timer_x,
&mut self.timer_y,
);
@ -524,6 +537,20 @@ impl MPDDisplay {
);
}
if !self.album_text.contents().is_empty() && !self.opts.disable_show_album {
set_transform(
&mut self.album_text,
&mut self.album_transform,
&mut offset_y,
&mut album_y,
true,
false,
true,
&mut self.timer_x,
&mut self.timer_y,
);
}
if !self.artist_text.contents().is_empty() && !self.opts.disable_show_artist {
set_transform(
&mut self.artist_text,
@ -532,6 +559,7 @@ impl MPDDisplay {
&mut artist_y,
true,
true,
false,
&mut self.timer_x,
&mut self.timer_y,
);
@ -551,6 +579,7 @@ impl MPDDisplay {
&mut title_y,
true,
false,
false,
&mut self.timer_x,
&mut self.timer_y,
);
@ -569,11 +598,13 @@ impl MPDDisplay {
&mut timer_y,
false,
false,
false,
&mut self.timer_x,
&mut self.timer_y,
);
let filename_dimensions = self.filename_text.dimensions(ctx);
let album_dimensions = self.album_text.dimensions(ctx);
let artist_dimensions = self.artist_text.dimensions(ctx);
let title_dimensions = self.title_text.dimensions(ctx);
let timer_dimensions = self.timer_text.dimensions(ctx);
@ -591,6 +622,18 @@ impl MPDDisplay {
Color::from_rgba(0, 0, 0, 160),
)?;
}
if !self.opts.disable_show_album {
mesh_builder.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: album_y,
w: album_dimensions.w,
h: album_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?;
}
if !self.opts.disable_show_artist {
mesh_builder.rectangle(
DrawMode::fill(),
@ -722,9 +765,10 @@ impl EventHandler for MPDDisplay {
}
if shared.mpd_play_state != MPDPlayState::Playing {
if shared.mpd_play_state == MPDPlayState::Stopped {
self.title_text = Text::new("");
self.artist_text = Text::new("");
self.filename_text = Text::new("");
self.title_text = Text::default();
self.artist_text = Text::default();
self.album_text = Text::default();
self.filename_text = Text::default();
self.timer = 0.0;
self.length = 0.0;
self.album_art = None;
@ -767,6 +811,21 @@ impl EventHandler for MPDDisplay {
.unwrap()
.store(true, Ordering::Relaxed);
}
if !shared.album.is_empty() {
if shared.album != self.album_string_cache {
self.album_string_cache = shared.album.clone();
self.album_text = string_to_text(
shared.album.clone(),
&mut self.loaded_fonts,
ctx,
);
}
} else {
self.dirty_flag
.as_ref()
.unwrap()
.store(true, Ordering::Relaxed);
}
if !shared.filename.is_empty() {
if shared.filename != self.filename_string_cache {
self.filename_string_cache = shared.filename.clone();
@ -860,6 +919,16 @@ impl EventHandler for MPDDisplay {
)?;
}
if !self.opts.disable_show_album {
self.album_text.draw(
ctx,
DrawParam {
trans: self.album_transform,
..Default::default()
},
)?;
}
if !self.opts.disable_show_artist {
self.artist_text.draw(
ctx,

View file

@ -30,6 +30,8 @@ pub struct Opt {
disable_show_title: bool,
#[structopt(long = "disable-show-artist", help = "disable artist display")]
disable_show_artist: bool,
#[structopt(long = "disable-show-album", help = "disable album display")]
disable_show_album: bool,
#[structopt(long = "disable-show-filename", help = "disable filename display")]
disable_show_filename: bool,
#[structopt(long = "pprompt", help = "input password via prompt")]

View file

@ -34,6 +34,7 @@ pub struct InfoFromShared {
pub filename: String,
pub title: String,
pub artist: String,
pub album: String,
pub length: f64,
pub pos: f64,
pub error_text: String,
@ -54,6 +55,7 @@ pub struct MPDHandlerState {
current_song_filename: String,
current_song_title: String,
current_song_artist: String,
current_song_album: String,
current_song_length: f64,
current_song_position: f64,
current_binary_size: usize,
@ -280,6 +282,7 @@ impl MPDHandler {
stop_flag: Arc::new(AtomicBool::new(false)),
log_level,
mpd_play_state: MPDPlayState::Stopped,
current_song_album: String::new(),
})),
};
@ -304,6 +307,7 @@ impl MPDHandler {
filename: read_lock.current_song_filename.clone(),
title: read_lock.current_song_title.clone(),
artist: read_lock.current_song_artist.clone(),
album: read_lock.current_song_album.clone(),
length: read_lock.current_song_length,
pos: read_lock.current_song_position
+ read_lock.song_pos_get_time.elapsed().as_secs_f64(),
@ -632,6 +636,7 @@ impl MPDHandler {
write_handle.can_get_album_art_in_dir = true;
write_handle.current_song_title.clear();
write_handle.current_song_artist.clear();
write_handle.current_song_album.clear();
write_handle.current_song_length = 0.0;
write_handle.current_song_position = 0.0;
write_handle.did_check_overtime = false;
@ -663,6 +668,7 @@ impl MPDHandler {
write_handle.can_get_album_art_in_dir = true;
write_handle.current_song_title.clear();
write_handle.current_song_artist.clear();
write_handle.current_song_album.clear();
write_handle.current_song_length = 0.0;
write_handle.current_song_position = 0.0;
write_handle.did_check_overtime = false;
@ -724,6 +730,8 @@ impl MPDHandler {
write_handle.current_song_title = line.split_off(7);
} else if line.starts_with("Artist: ") {
write_handle.current_song_artist = line.split_off(8);
} else if line.starts_with("Album: ") {
write_handle.current_song_album = line.split_off(7);
} else if line.starts_with("type: ") {
write_handle.art_data_type = line.split_off(6);
} else {