mod constant;
mod data;
mod model;
mod player;
mod ui;
use std::sync::Arc;
pub use constant::*;
pub use data::*;
pub use model::*;
pub use player::*;
pub use ui::*;
use crate::config;
pub use parking_lot::{Mutex, RwLock};
pub type SharedState = Arc<State>;
pub struct State {
pub ui: Mutex<UIState>,
pub player: RwLock<PlayerState>,
pub data: RwLock<AppData>,
pub is_daemon: bool,
#[cfg(feature = "streaming")]
pub vis_bands: Option<Arc<Mutex<crate::ui::streaming::VisBands>>>,
}
impl State {
pub fn new(is_daemon: bool) -> Self {
let mut ui = UIState::default();
let configs = config::get_config();
if let Some(theme) = configs.theme_config.find_theme(&configs.app_config.theme) {
ui.theme = theme;
}
let app_data = AppData::new(&configs.cache_folder);
Self {
ui: Mutex::new(ui),
player: RwLock::new(PlayerState::default()),
data: RwLock::new(app_data),
is_daemon,
#[cfg(feature = "streaming")]
vis_bands: if configs.app_config.enable_audio_visualization {
Some(Arc::new(Mutex::new(
crate::ui::streaming::VisBands::default(),
)))
} else {
None
},
}
}
#[cfg(feature = "streaming")]
pub fn is_streaming_enabled(&self) -> bool {
let configs = config::get_config();
configs.app_config.enable_streaming == config::StreamingType::Always
|| (configs.app_config.enable_streaming == config::StreamingType::DaemonOnly
&& self.is_daemon)
}
#[cfg(feature = "streaming")]
pub fn is_local_streaming_active(&self) -> bool {
self.vis_bands.as_ref().is_some_and(|b| b.lock().is_active)
}
}