mirror of
https://github.com/talwat/lowfi
synced 2025-01-27 19:01:27 +00:00
feat: adjust ui
This commit is contained in:
parent
233b552343
commit
e9857e5c11
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -981,6 +981,7 @@ dependencies = [
|
|||||||
"crossterm",
|
"crossterm",
|
||||||
"eyre",
|
"eyre",
|
||||||
"futures",
|
"futures",
|
||||||
|
"itertools",
|
||||||
"rand",
|
"rand",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rodio",
|
"rodio",
|
||||||
|
@ -23,3 +23,4 @@ bytes = "1.7.2"
|
|||||||
scraper = "0.20.0"
|
scraper = "0.20.0"
|
||||||
rodio = { version = "0.19.0", features = ["mp3"], default-features = false }
|
rodio = { version = "0.19.0", features = ["mp3"], default-features = false }
|
||||||
crossterm = "0.28.1"
|
crossterm = "0.28.1"
|
||||||
|
itertools = "0.13.0"
|
||||||
|
@ -2,9 +2,9 @@ use std::{io::stderr, sync::Arc, time::Duration};
|
|||||||
|
|
||||||
use super::Player;
|
use super::Player;
|
||||||
use crossterm::{
|
use crossterm::{
|
||||||
cursor::{MoveTo, MoveToColumn, MoveUp},
|
cursor::{MoveToColumn, MoveUp, Show},
|
||||||
style::Print,
|
style::Print,
|
||||||
terminal::{Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen},
|
terminal::{Clear, ClearType},
|
||||||
};
|
};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
sync::mpsc::Sender,
|
sync::mpsc::Sender,
|
||||||
@ -16,35 +16,52 @@ use super::Messages;
|
|||||||
|
|
||||||
async fn interface(queue: Arc<Player>) -> eyre::Result<()> {
|
async fn interface(queue: Arc<Player>) -> eyre::Result<()> {
|
||||||
const WIDTH: usize = 25;
|
const WIDTH: usize = 25;
|
||||||
|
const PROGRESS_WIDTH: usize = WIDTH - 4;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// We can get away with only redrawing every 0.25 seconds
|
// We can get away with only redrawing every 0.25 seconds
|
||||||
// since it's just an audio player.
|
// since it's just an audio player.
|
||||||
sleep(Duration::from_secs_f32(1.0 / 60.0)).await;
|
sleep(Duration::from_secs_f32(0.25)).await;
|
||||||
crossterm::execute!(stderr(), Clear(ClearType::FromCursorDown))?;
|
crossterm::execute!(stderr(), Clear(ClearType::FromCursorDown))?;
|
||||||
|
|
||||||
let main = match queue.current.load().as_ref() {
|
let mut main = match queue.current.load().as_ref() {
|
||||||
Some(x) => {
|
Some(x) => {
|
||||||
if queue.sink.is_paused() {
|
if queue.sink.is_paused() {
|
||||||
format!("paused {}\r\n", x.format_name())
|
format!("paused {}", x.format_name())
|
||||||
} else {
|
} else {
|
||||||
format!("playing {}\r\n", x.format_name())
|
format!("playing {}", x.format_name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => "loading...\r\n".to_owned(),
|
None => "loading...".to_owned(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
main.push_str("\r\n");
|
||||||
|
|
||||||
|
let mut filled = 0;
|
||||||
|
if let Some(current) = queue.current.load().as_ref() {
|
||||||
|
if let Some(duration) = current.duration {
|
||||||
|
let elapsed = queue.sink.get_pos().as_secs() as f32 / duration.as_secs() as f32;
|
||||||
|
filled = (elapsed * PROGRESS_WIDTH as f32).round() as usize;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let progress = format!(
|
||||||
|
" [{}{}] ",
|
||||||
|
"/".repeat(filled as usize),
|
||||||
|
" ".repeat(PROGRESS_WIDTH - filled)
|
||||||
|
);
|
||||||
let bar = ["[s]kip", "[p]ause", "[q]uit"];
|
let bar = ["[s]kip", "[p]ause", "[q]uit"];
|
||||||
|
|
||||||
crossterm::execute!(stderr(), MoveToColumn(0), Print(main))?;
|
crossterm::execute!(stderr(), MoveToColumn(0), Print(main))?;
|
||||||
crossterm::execute!(stderr(), Print(bar.join(" ")))?;
|
crossterm::execute!(stderr(), Print(progress), Print("\r\n"))?;
|
||||||
crossterm::execute!(stderr(), MoveToColumn(0), MoveUp(1))?;
|
crossterm::execute!(stderr(), Print(bar.join(" ")), Print("\r\n"))?;
|
||||||
|
crossterm::execute!(stderr(), MoveToColumn(0), MoveUp(3))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn start(queue: Arc<Player>, sender: Sender<Messages>) -> eyre::Result<()> {
|
pub async fn start(queue: Arc<Player>, sender: Sender<Messages>) -> eyre::Result<()> {
|
||||||
crossterm::terminal::enable_raw_mode()?;
|
crossterm::terminal::enable_raw_mode()?;
|
||||||
crossterm::execute!(stderr(), EnterAlternateScreen, MoveTo(0, 0))?;
|
//crossterm::execute!(stderr(), EnterAlternateScreen, MoveTo(0, 0))?;
|
||||||
|
|
||||||
task::spawn(interface(queue.clone()));
|
task::spawn(interface(queue.clone()));
|
||||||
|
|
||||||
@ -73,11 +90,7 @@ pub async fn start(queue: Arc<Player>, sender: Sender<Messages>) -> eyre::Result
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
crossterm::execute!(
|
crossterm::execute!(stderr(), Clear(ClearType::FromCursorDown), Show)?;
|
||||||
stderr(),
|
|
||||||
Clear(ClearType::FromCursorDown),
|
|
||||||
LeaveAlternateScreen
|
|
||||||
)?;
|
|
||||||
crossterm::terminal::disable_raw_mode()?;
|
crossterm::terminal::disable_raw_mode()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -42,6 +42,8 @@ impl TrackInfo {
|
|||||||
/// as well as some basic information about it.
|
/// as well as some basic information about it.
|
||||||
pub struct Track {
|
pub struct Track {
|
||||||
pub info: TrackInfo,
|
pub info: TrackInfo,
|
||||||
|
|
||||||
|
/// TODO: Make decoding lazy, since decoded files take up more memory than raw ones.
|
||||||
pub data: Data,
|
pub data: Data,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user