mirror of
https://github.com/talwat/lowfi
synced 2025-12-19 05:03:34 +00:00
style: improve a few names
This commit is contained in:
parent
287a61ca80
commit
8ff0f477ac
@ -61,7 +61,7 @@ pub struct Player {
|
|||||||
rx: Receiver<crate::Message>,
|
rx: Receiver<crate::Message>,
|
||||||
|
|
||||||
/// Broadcast channel used to send UI updates.
|
/// Broadcast channel used to send UI updates.
|
||||||
broadcast: broadcast::Sender<ui::Update>,
|
updater: broadcast::Sender<ui::Update>,
|
||||||
|
|
||||||
/// Current playback state (loading or track).
|
/// Current playback state (loading or track).
|
||||||
current: Current,
|
current: Current,
|
||||||
@ -106,7 +106,7 @@ impl Player {
|
|||||||
|
|
||||||
/// Sends a `ui::Update` to the broadcast channel.
|
/// Sends a `ui::Update` to the broadcast channel.
|
||||||
pub fn update(&mut self, update: ui::Update) -> crate::Result<()> {
|
pub fn update(&mut self, update: ui::Update) -> crate::Result<()> {
|
||||||
self.broadcast.send(update)?;
|
self.updater.send(update)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ impl Player {
|
|||||||
waiter: waiter::Handle::new(Arc::clone(&sink), tx),
|
waiter: waiter::Handle::new(Arc::clone(&sink), tx),
|
||||||
bookmarks: Bookmarks::load().await?,
|
bookmarks: Bookmarks::load().await?,
|
||||||
current: Current::default(),
|
current: Current::default(),
|
||||||
broadcast: utx,
|
updater: utx,
|
||||||
rx,
|
rx,
|
||||||
sink,
|
sink,
|
||||||
})
|
})
|
||||||
|
|||||||
@ -156,7 +156,7 @@ mod interface {
|
|||||||
sink.set_volume(0.5);
|
sink.set_volume(0.5);
|
||||||
|
|
||||||
let mut state = State::initial(sink, String::from("test"));
|
let mut state = State::initial(sink, String::from("test"));
|
||||||
state.timer = Some(Instant::now());
|
state.volume_timer = Some(Instant::now());
|
||||||
|
|
||||||
let menu = Interface::default().menu(&mut state);
|
let menu = Interface::default().menu(&mut state);
|
||||||
assert_eq!(menu[0], "loading ");
|
assert_eq!(menu[0], "loading ");
|
||||||
|
|||||||
22
src/ui.rs
22
src/ui.rs
@ -29,11 +29,11 @@ pub enum Error {
|
|||||||
#[error("unable to write output: {0}")]
|
#[error("unable to write output: {0}")]
|
||||||
Write(#[from] std::io::Error),
|
Write(#[from] std::io::Error),
|
||||||
|
|
||||||
#[error("sending message to backend from ui failed: {0}")]
|
#[error("sending signal message to backend from ui failed: {0}")]
|
||||||
CrateSend(#[from] tokio::sync::mpsc::error::SendError<crate::Message>),
|
SignalSend(#[from] tokio::sync::mpsc::error::SendError<crate::Message>),
|
||||||
|
|
||||||
#[error("sharing state between backend and frontend failed: {0}")]
|
#[error("sharing state between backend and frontend failed: {0}")]
|
||||||
Send(#[from] tokio::sync::broadcast::error::SendError<Update>),
|
StateSend(#[from] tokio::sync::broadcast::error::SendError<Update>),
|
||||||
|
|
||||||
#[error("you can't disable the UI without MPRIS!")]
|
#[error("you can't disable the UI without MPRIS!")]
|
||||||
RejectedDisable,
|
RejectedDisable,
|
||||||
@ -64,11 +64,11 @@ pub struct State {
|
|||||||
pub bookmarked: bool,
|
pub bookmarked: bool,
|
||||||
|
|
||||||
/// The timer, which is used when the user changes volume to briefly display it.
|
/// The timer, which is used when the user changes volume to briefly display it.
|
||||||
pub(crate) timer: Option<Instant>,
|
pub(crate) volume_timer: Option<Instant>,
|
||||||
|
|
||||||
/// The name of the playing tracklist, for MPRIS.
|
/// The name of the playing tracklist, mainly for MPRIS.
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
list: String,
|
tracklist: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
@ -76,10 +76,10 @@ impl State {
|
|||||||
pub fn initial(sink: Arc<rodio::Sink>, list: String) -> Self {
|
pub fn initial(sink: Arc<rodio::Sink>, list: String) -> Self {
|
||||||
Self {
|
Self {
|
||||||
sink,
|
sink,
|
||||||
list,
|
tracklist: list,
|
||||||
current: Current::default(),
|
current: Current::default(),
|
||||||
bookmarked: false,
|
bookmarked: false,
|
||||||
timer: None,
|
volume_timer: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,18 +155,18 @@ impl Handle {
|
|||||||
/// `rx` is the receiver for state updates, `state` the initial state,
|
/// `rx` is the receiver for state updates, `state` the initial state,
|
||||||
/// and `params` specifies aesthetic options that are specified by the user.
|
/// and `params` specifies aesthetic options that are specified by the user.
|
||||||
async fn ui(
|
async fn ui(
|
||||||
mut rx: broadcast::Receiver<Update>,
|
mut updater: broadcast::Receiver<Update>,
|
||||||
mut state: State,
|
mut state: State,
|
||||||
params: interface::Params,
|
params: interface::Params,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut interface = Interface::new(params);
|
let mut interface = Interface::new(params);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if let Ok(message) = rx.try_recv() {
|
if let Ok(message) = updater.try_recv() {
|
||||||
match message {
|
match message {
|
||||||
Update::Track(track) => state.current = track,
|
Update::Track(track) => state.current = track,
|
||||||
Update::Bookmarked(bookmarked) => state.bookmarked = bookmarked,
|
Update::Bookmarked(bookmarked) => state.bookmarked = bookmarked,
|
||||||
Update::Volume => state.timer = Some(Instant::now()),
|
Update::Volume => state.volume_timer = Some(Instant::now()),
|
||||||
Update::Quit => break,
|
Update::Quit => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -121,12 +121,12 @@ impl Interface {
|
|||||||
pub(crate) fn menu(&self, state: &mut State) -> Vec<String> {
|
pub(crate) fn menu(&self, state: &mut State) -> Vec<String> {
|
||||||
let action = components::action(state, self.params.width);
|
let action = components::action(state, self.params.width);
|
||||||
|
|
||||||
let middle = match state.timer {
|
let middle = match state.volume_timer {
|
||||||
Some(timer) => {
|
Some(timer) => {
|
||||||
let volume = state.sink.volume();
|
let volume = state.sink.volume();
|
||||||
let percentage = format!("{}%", (volume * 100.0).round().abs());
|
let percentage = format!("{}%", (volume * 100.0).round().abs());
|
||||||
if timer.elapsed() > Duration::from_secs(1) {
|
if timer.elapsed() > Duration::from_secs(1) {
|
||||||
state.timer = None;
|
state.volume_timer = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
components::audio_bar(self.params.width - 17, volume, &percentage)
|
components::audio_bar(self.params.width - 17, volume, &percentage)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
|
|
||||||
/// The titlebar, which is essentially the entire top of the window.
|
/// The titlebar, which is the entire top row of the window.
|
||||||
///
|
///
|
||||||
/// The struct offers a basic API for displaying messages to it.
|
/// The struct offers a basic API for displaying messages to it.
|
||||||
pub struct TitleBar {
|
pub struct TitleBar {
|
||||||
|
|||||||
@ -331,7 +331,7 @@ impl Server {
|
|||||||
let suffix = if env::var("LOWFI_FIXED_MPRIS_NAME").is_ok_and(|x| x == "1") {
|
let suffix = if env::var("LOWFI_FIXED_MPRIS_NAME").is_ok_and(|x| x == "1") {
|
||||||
String::from("lowfi")
|
String::from("lowfi")
|
||||||
} else {
|
} else {
|
||||||
format!("lowfi.{}.instance{}", state.list, process::id())
|
format!("lowfi.{}.instance{}", state.tracklist, process::id())
|
||||||
};
|
};
|
||||||
|
|
||||||
let server = mpris_server::Server::new(
|
let server = mpris_server::Server::new(
|
||||||
@ -340,7 +340,7 @@ impl Server {
|
|||||||
sender: Sender::new(sender),
|
sender: Sender::new(sender),
|
||||||
sink: state.sink,
|
sink: state.sink,
|
||||||
current: ArcSwap::new(Arc::new(state.current)),
|
current: ArcSwap::new(Arc::new(state.current)),
|
||||||
list: state.list,
|
list: state.tracklist,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@ -12,7 +12,7 @@ type Result<T> = std::result::Result<T, Error>;
|
|||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[error("couldn't find config directory")]
|
#[error("couldn't find config directory")]
|
||||||
Directory,
|
DirectoryNotFound,
|
||||||
|
|
||||||
#[error("io error: {0}")]
|
#[error("io error: {0}")]
|
||||||
Io(#[from] std::io::Error),
|
Io(#[from] std::io::Error),
|
||||||
@ -33,17 +33,17 @@ pub struct PersistentVolume {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PersistentVolume {
|
impl PersistentVolume {
|
||||||
/// Retrieves the config directory, creating it if necessary.
|
/// Retrieves the config file path, creating it if necessary.
|
||||||
async fn config() -> Result<PathBuf> {
|
async fn path() -> Result<PathBuf> {
|
||||||
let config = dirs::config_dir()
|
let config = dirs::config_dir()
|
||||||
.ok_or(Error::Directory)?
|
.ok_or(Error::DirectoryNotFound)?
|
||||||
.join(PathBuf::from("lowfi"));
|
.join(PathBuf::from("lowfi"));
|
||||||
|
|
||||||
if !config.exists() {
|
if !config.exists() {
|
||||||
fs::create_dir_all(&config).await?;
|
fs::create_dir_all(&config).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(config)
|
Ok(config.join(PathBuf::from("volume.txt")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the volume as a normalized float in the range 0.0..=1.0.
|
/// Returns the volume as a normalized float in the range 0.0..=1.0.
|
||||||
@ -56,17 +56,16 @@ impl PersistentVolume {
|
|||||||
/// If the file does not exist a default of `100` is written and
|
/// If the file does not exist a default of `100` is written and
|
||||||
/// returned.
|
/// returned.
|
||||||
pub async fn load() -> Result<Self> {
|
pub async fn load() -> Result<Self> {
|
||||||
let config = Self::config().await?;
|
let path = Self::path().await?;
|
||||||
let volume = config.join(PathBuf::from("volume.txt"));
|
|
||||||
|
|
||||||
// Basically just read from the volume file if it exists, otherwise return 100.
|
// Basically just read from the volume file if it exists, otherwise return 100.
|
||||||
let volume = if volume.exists() {
|
let volume = if path.exists() {
|
||||||
let contents = fs::read_to_string(volume).await?;
|
let contents = fs::read_to_string(path).await?;
|
||||||
let trimmed = contents.trim();
|
let trimmed = contents.trim();
|
||||||
let stripped = trimmed.strip_suffix("%").unwrap_or(trimmed);
|
let stripped = trimmed.strip_suffix("%").unwrap_or(trimmed);
|
||||||
stripped.parse()?
|
stripped.parse()?
|
||||||
} else {
|
} else {
|
||||||
fs::write(&volume, "100").await?;
|
fs::write(&path, "100").await?;
|
||||||
100u16
|
100u16
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -75,10 +74,8 @@ impl PersistentVolume {
|
|||||||
|
|
||||||
/// Saves `volume` (0.0..=1.0) to `volume.txt` as an integer percent.
|
/// Saves `volume` (0.0..=1.0) to `volume.txt` as an integer percent.
|
||||||
pub async fn save(volume: f32) -> Result<()> {
|
pub async fn save(volume: f32) -> Result<()> {
|
||||||
let config = Self::config().await?;
|
|
||||||
let path = config.join(PathBuf::from("volume.txt"));
|
|
||||||
let percentage = (volume * 100.0).abs().round() as u16;
|
let percentage = (volume * 100.0).abs().round() as u16;
|
||||||
fs::write(path, percentage.to_string()).await?;
|
fs::write(Self::path().await?, percentage.to_string()).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user