Refactorings and improvements
This commit is contained in:
parent
b956101d37
commit
88a172a8cb
1 changed files with 49 additions and 29 deletions
78
src/main.rs
78
src/main.rs
|
@ -11,7 +11,7 @@ use std::time::{Duration, Instant};
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
const BUF_SIZE: usize = 1024 * 4;
|
const BUF_SIZE: usize = 1024 * 4;
|
||||||
const POLL_DURATION: Duration = Duration::from_secs(2);
|
const POLL_DURATION: Duration = Duration::from_secs(10);
|
||||||
const TEXT_X_OFFSET: f32 = 16.0f32;
|
const TEXT_X_OFFSET: f32 = 16.0f32;
|
||||||
const TEXT_Y_OFFSET: f32 = 16.0f32;
|
const TEXT_Y_OFFSET: f32 = 16.0f32;
|
||||||
const TIME_MAX_DIFF: f64 = 2.0f64;
|
const TIME_MAX_DIFF: f64 = 2.0f64;
|
||||||
|
@ -20,6 +20,7 @@ const ARTIST_INITIAL_FONT_SIZE: u16 = 48;
|
||||||
const TIMER_FONT_SIZE: u16 = 64;
|
const TIMER_FONT_SIZE: u16 = 64;
|
||||||
const SCREEN_DIFF_MARGIN: f32 = 1.0;
|
const SCREEN_DIFF_MARGIN: f32 = 1.0;
|
||||||
const PROMPT_Y_OFFSET: f32 = 48.0;
|
const PROMPT_Y_OFFSET: f32 = 48.0;
|
||||||
|
const CHECK_SHARED_WAIT_TIME: f64 = 2.0;
|
||||||
|
|
||||||
#[derive(StructOpt, Debug)]
|
#[derive(StructOpt, Debug)]
|
||||||
#[structopt(name = "mpd_info_screen")]
|
#[structopt(name = "mpd_info_screen")]
|
||||||
|
@ -56,6 +57,7 @@ struct Shared {
|
||||||
can_get_album_art: bool,
|
can_get_album_art: bool,
|
||||||
can_get_album_art_in_dir: bool,
|
can_get_album_art_in_dir: bool,
|
||||||
can_get_status: bool,
|
can_get_status: bool,
|
||||||
|
force_check: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Shared {
|
impl Shared {
|
||||||
|
@ -77,6 +79,7 @@ impl Shared {
|
||||||
can_get_album_art: true,
|
can_get_album_art: true,
|
||||||
can_get_album_art_in_dir: true,
|
can_get_album_art_in_dir: true,
|
||||||
can_get_status: true,
|
can_get_status: true,
|
||||||
|
force_check: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -439,7 +442,7 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
println!("Failed to acquire lock for reading to stream");
|
println!("INFO: Temporarily failed to acquire lock for reading from tcp stream");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,12 +458,13 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
|
||||||
} else if let Err(e) = write_result {
|
} else if let Err(e) = write_result {
|
||||||
println!("Got error requesting authentication: {}", e);
|
println!("Got error requesting authentication: {}", e);
|
||||||
}
|
}
|
||||||
} else if song_title_get_time.elapsed() > POLL_DURATION && lock.can_get_status {
|
} else if (song_title_get_time.elapsed() > POLL_DURATION || lock.force_check) && lock.can_get_status {
|
||||||
let write_result = lock.stream.write(b"currentsong\n");
|
let write_result = lock.stream.write(b"currentsong\n");
|
||||||
if let Err(e) = write_result {
|
if let Err(e) = write_result {
|
||||||
println!("Got error requesting currentsong info: {}", e);
|
println!("Got error requesting currentsong info: {}", e);
|
||||||
} else {
|
} else {
|
||||||
poll_state = PollState::CurrentSong;
|
poll_state = PollState::CurrentSong;
|
||||||
|
lock.force_check = false;
|
||||||
}
|
}
|
||||||
} else if (song_length_get_time.elapsed() > POLL_DURATION
|
} else if (song_length_get_time.elapsed() > POLL_DURATION
|
||||||
|| song_pos_get_time.elapsed() > POLL_DURATION)
|
|| song_pos_get_time.elapsed() > POLL_DURATION)
|
||||||
|
@ -500,7 +504,7 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
println!("INFO: Temporarily failed to acquire lock for writing to stream");
|
println!("INFO: Temporarily failed to acquire lock for writing to tcp stream");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO DEBUG
|
// TODO DEBUG
|
||||||
|
@ -515,6 +519,7 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
|
||||||
fn get_info_from_shared(
|
fn get_info_from_shared(
|
||||||
shared: Arc<Mutex<Shared>>,
|
shared: Arc<Mutex<Shared>>,
|
||||||
force_check: bool,
|
force_check: bool,
|
||||||
|
set_force_check: bool,
|
||||||
) -> Result<InfoFromShared, String> {
|
) -> Result<InfoFromShared, String> {
|
||||||
let mut filename: String = String::new();
|
let mut filename: String = String::new();
|
||||||
let mut title: String = String::new();
|
let mut title: String = String::new();
|
||||||
|
@ -524,6 +529,9 @@ fn get_info_from_shared(
|
||||||
let mut instant_rec: Instant = Instant::now();
|
let mut instant_rec: Instant = Instant::now();
|
||||||
let mut error_text = String::new();
|
let mut error_text = String::new();
|
||||||
if let Ok(mut lock) = shared.lock() {
|
if let Ok(mut lock) = shared.lock() {
|
||||||
|
if set_force_check {
|
||||||
|
lock.force_check = true;
|
||||||
|
}
|
||||||
if lock.dirty || force_check {
|
if lock.dirty || force_check {
|
||||||
filename = lock.current_song_filename.clone();
|
filename = lock.current_song_filename.clone();
|
||||||
title = lock.current_song_title.clone();
|
title = lock.current_song_title.clone();
|
||||||
|
@ -601,6 +609,7 @@ async fn main() -> Result<(), String> {
|
||||||
if opt.enable_prompt_password {
|
if opt.enable_prompt_password {
|
||||||
let mut input: String = String::new();
|
let mut input: String = String::new();
|
||||||
let mut asterisks: String = String::new();
|
let mut asterisks: String = String::new();
|
||||||
|
let mut dirty: bool = true;
|
||||||
'prompt_loop: loop {
|
'prompt_loop: loop {
|
||||||
draw_text(
|
draw_text(
|
||||||
"Input password:",
|
"Input password:",
|
||||||
|
@ -612,6 +621,7 @@ async fn main() -> Result<(), String> {
|
||||||
if let Some(k) = get_last_key_pressed() {
|
if let Some(k) = get_last_key_pressed() {
|
||||||
if k == KeyCode::Backspace {
|
if k == KeyCode::Backspace {
|
||||||
input.pop();
|
input.pop();
|
||||||
|
dirty = true;
|
||||||
} else if k == KeyCode::Enter {
|
} else if k == KeyCode::Enter {
|
||||||
password = Some(input);
|
password = Some(input);
|
||||||
break 'prompt_loop;
|
break 'prompt_loop;
|
||||||
|
@ -619,14 +629,18 @@ async fn main() -> Result<(), String> {
|
||||||
}
|
}
|
||||||
if let Some(c) = get_char_pressed() {
|
if let Some(c) = get_char_pressed() {
|
||||||
input.push(c);
|
input.push(c);
|
||||||
|
dirty = true;
|
||||||
}
|
}
|
||||||
let input_count = input.chars().count();
|
if dirty {
|
||||||
if asterisks.len() < input_count {
|
let input_count = input.chars().count();
|
||||||
for _ in 0..(input_count - asterisks.len()) {
|
if asterisks.len() < input_count {
|
||||||
asterisks.push('*');
|
for _ in 0..(input_count - asterisks.len()) {
|
||||||
|
asterisks.push('*');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
asterisks.truncate(input_count);
|
||||||
}
|
}
|
||||||
} else {
|
dirty = false;
|
||||||
asterisks.truncate(input_count);
|
|
||||||
}
|
}
|
||||||
draw_text(
|
draw_text(
|
||||||
&asterisks,
|
&asterisks,
|
||||||
|
@ -661,13 +675,15 @@ async fn main() -> Result<(), String> {
|
||||||
info_loop(thread_shared_data).expect("Failure during info_loop");
|
info_loop(thread_shared_data).expect("Failure during info_loop");
|
||||||
});
|
});
|
||||||
|
|
||||||
let wait_time: f64 = 0.75;
|
|
||||||
let mut timer: f64 = 0.0;
|
let mut timer: f64 = 0.0;
|
||||||
let mut track_timer: f64 = 0.0;
|
let mut track_timer: f64 = 0.0;
|
||||||
let mut filename: String = String::new();
|
let mut filename: String = String::new();
|
||||||
let mut title: String = String::new();
|
let mut title: String = String::new();
|
||||||
let mut artist: String = String::new();
|
let mut artist: String = String::new();
|
||||||
let mut art_texture: Option<Texture2D> = None;
|
let mut art_texture: Option<Texture2D> = None;
|
||||||
|
let mut art_draw_params: Option<DrawTextureParams> = None;
|
||||||
|
let mut art_draw_width: f32 = 32.0;
|
||||||
|
let mut art_draw_height: f32 = 32.0;
|
||||||
let mut filename_font_size: Option<u16> = None;
|
let mut filename_font_size: Option<u16> = None;
|
||||||
let mut text_dim: TextDimensions = measure_text("undefined", None, 24, 1.0);
|
let mut text_dim: TextDimensions = measure_text("undefined", None, 24, 1.0);
|
||||||
let mut prev_width = screen_width();
|
let mut prev_width = screen_width();
|
||||||
|
@ -693,13 +709,14 @@ async fn main() -> Result<(), String> {
|
||||||
filename_font_size = None;
|
filename_font_size = None;
|
||||||
title_dim_opt = None;
|
title_dim_opt = None;
|
||||||
artist_dim_opt = None;
|
artist_dim_opt = None;
|
||||||
|
art_draw_params = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
timer -= dt;
|
timer -= dt;
|
||||||
track_timer -= dt;
|
track_timer -= dt;
|
||||||
if timer < 0.0 || track_timer < 0.0 {
|
if timer < 0.0 || track_timer < 0.0 {
|
||||||
timer = wait_time;
|
timer = CHECK_SHARED_WAIT_TIME;
|
||||||
let info_result = get_info_from_shared(shared_data.clone(), false);
|
let info_result = get_info_from_shared(shared_data.clone(), false, track_timer < 0.0);
|
||||||
if let Ok(info) = info_result {
|
if let Ok(info) = info_result {
|
||||||
if info.filename != filename {
|
if info.filename != filename {
|
||||||
filename = info.filename;
|
filename = info.filename;
|
||||||
|
@ -709,6 +726,7 @@ async fn main() -> Result<(), String> {
|
||||||
title_dim_opt = None;
|
title_dim_opt = None;
|
||||||
artist.clear();
|
artist.clear();
|
||||||
artist_dim_opt = None;
|
artist_dim_opt = None;
|
||||||
|
art_draw_params = None;
|
||||||
}
|
}
|
||||||
let duration_since = info.instant_rec.elapsed();
|
let duration_since = info.instant_rec.elapsed();
|
||||||
let recorded_time = info.length - info.pos - duration_since.as_secs_f64();
|
let recorded_time = info.length - info.pos - duration_since.as_secs_f64();
|
||||||
|
@ -753,26 +771,28 @@ async fn main() -> Result<(), String> {
|
||||||
|
|
||||||
if let Some(texture) = art_texture {
|
if let Some(texture) = art_texture {
|
||||||
if texture.width() > prev_width || texture.height() > prev_height {
|
if texture.width() > prev_width || texture.height() > prev_height {
|
||||||
let ratio: f32 = texture.width() / texture.height();
|
if art_draw_params.is_none() {
|
||||||
// try filling to height
|
let ratio: f32 = texture.width() / texture.height();
|
||||||
let mut height = prev_height;
|
// try filling to height
|
||||||
let mut width = prev_height * ratio;
|
art_draw_height = prev_height;
|
||||||
if width > prev_width {
|
art_draw_width = prev_height * ratio;
|
||||||
// try filling to width instead
|
if art_draw_width > prev_width {
|
||||||
width = prev_width;
|
// try filling to width instead
|
||||||
height = prev_width / ratio;
|
art_draw_width = prev_width;
|
||||||
}
|
art_draw_height = prev_width / ratio;
|
||||||
|
}
|
||||||
|
|
||||||
let draw_params: DrawTextureParams = DrawTextureParams {
|
art_draw_params = Some(DrawTextureParams {
|
||||||
dest_size: Some(Vec2::new(width, height)),
|
dest_size: Some(Vec2::new(art_draw_width, art_draw_height)),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
});
|
||||||
|
}
|
||||||
draw_texture_ex(
|
draw_texture_ex(
|
||||||
texture,
|
texture,
|
||||||
(prev_width - width) / 2.0f32,
|
(prev_width - art_draw_width) / 2.0f32,
|
||||||
(prev_height - height) / 2.0f32,
|
(prev_height - art_draw_height) / 2.0f32,
|
||||||
WHITE,
|
WHITE,
|
||||||
draw_params,
|
art_draw_params.as_ref().unwrap().clone(),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
draw_texture(
|
draw_texture(
|
||||||
|
|
Loading…
Reference in a new issue