use super::MenuConfig;
use crate::compat::{lock, Mutex, MutexGuard};
use crate::style::MenuEffects;
static GLOBAL_MENU_CONFIG: Mutex<Option<MenuConfigManager>> = Mutex::new(None);
pub fn init() {
let mut slot = lock(&GLOBAL_MENU_CONFIG);
if slot.is_none() {
*slot = Some(MenuConfigManager::new());
}
}
pub fn manager() -> MutexGuard<'static, Option<MenuConfigManager>> {
lock(&GLOBAL_MENU_CONFIG)
}
pub fn install_policy(config: MenuConfig) {
*lock(&GLOBAL_MENU_CONFIG) = Some(MenuConfigManager::from_config(config));
}
pub fn use_verification_policy() {
install_policy(MenuConfig::verification());
}
pub fn current_effects() -> MenuEffects {
match *lock(&GLOBAL_MENU_CONFIG) {
Some(ref manager) => manager.config().effects(),
None => MenuEffects::legacy(),
}
}
pub fn set_enabled(enabled: bool) {
init();
let mut slot = lock(&GLOBAL_MENU_CONFIG);
if let Some(manager) = slot.as_mut() {
manager.config_mut().set_enabled(enabled);
}
}
pub fn apply_overrides(overrides: super::UserOverrides) {
init();
let mut slot = lock(&GLOBAL_MENU_CONFIG);
if let Some(manager) = slot.as_mut() {
manager.config_mut().reload_overrides(overrides);
}
}
pub struct MenuConfigManager {
config: MenuConfig,
auto_adjust: bool,
}
impl MenuConfigManager {
pub fn new() -> Self {
Self { config: MenuConfig::new(), auto_adjust: true }
}
fn from_config(config: MenuConfig) -> Self {
Self { config, auto_adjust: false }
}
pub fn config(&self) -> &MenuConfig {
&self.config
}
pub fn config_mut(&mut self) -> &mut MenuConfig {
&mut self.config
}
pub fn set_auto_adjust(&mut self, enabled: bool) {
self.auto_adjust = enabled;
}
pub fn auto_adjust(&self) -> bool {
self.auto_adjust
}
pub fn refresh_hardware_detection(&mut self) {
if self.auto_adjust && !self.config.has_user_overrides() {
self.config = MenuConfig::new();
}
}
pub fn set_enabled(&mut self, enabled: bool) {
self.config.set_enabled(enabled);
}
pub fn effects(&self) -> MenuEffects {
self.config.effects()
}
pub fn adapt_for_battery_power(&mut self) {
if self.config.hardware_caps().on_battery && self.auto_adjust {
self.config.apply_battery_adaptive_reduction();
}
}
}
crate::impl_default_via_new!(MenuConfigManager);