mod constant;
mod data;
mod model;
mod player;
mod queue;
mod ui;
use std::{collections::VecDeque, sync::Arc};
pub use constant::*;
pub use data::*;
pub use model::*;
pub use player::*;
#[allow(unused_imports)]
pub use queue::*;
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>>>,
pub logs: Arc<Mutex<VecDeque<String>>>,
}
impl State {
pub fn new(is_daemon: bool, log_buffer: Arc<Mutex<VecDeque<String>>>) -> 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
},
logs: log_buffer,
}
}
#[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")]
#[allow(dead_code)]
pub fn should_use_custom_queue(&self) -> bool {
self.is_streaming_enabled() && config::get_config().app_config.custom_queue
}
#[cfg(feature = "streaming")]
pub fn is_local_streaming_active(&self) -> bool {
self.vis_bands.as_ref().is_some_and(|b| b.lock().is_active)
}
}