use crate::compat::Mutex;
use crate::widget::display_widgets::icon::IconData;
use crate::widget::icon_registry::MAX_REGISTERED_ICONS;
struct Slot {
name: &'static str,
data: IconData,
}
struct Registry {
slots: [Option<Slot>; MAX_REGISTERED_ICONS],
len: usize,
}
impl Registry {
const fn new() -> Self {
Self { slots: [const { None }; MAX_REGISTERED_ICONS], len: 0 }
}
}
static REGISTRY: Mutex<Registry> = Mutex::new(Registry::new());
pub(crate) fn register_icon_data(
name: &'static str,
paths: &'static [&'static str],
grid: u16,
) -> bool {
let data = IconData { name, grid, paths };
let mut registry = crate::compat::lock(®ISTRY);
let len = registry.len;
for slot in registry.slots[..len].iter_mut() {
if let Some(existing) = slot {
if existing.name == name {
*slot = Some(Slot { name, data });
return true;
}
}
}
if len >= MAX_REGISTERED_ICONS {
return false;
}
registry.slots[len] = Some(Slot { name, data });
registry.len = len + 1;
true
}
pub(crate) fn clear_registered_icon_data() -> usize {
let mut registry = crate::compat::lock(®ISTRY);
let removed = registry.len;
registry.slots = [const { None }; MAX_REGISTERED_ICONS];
registry.len = 0;
removed
}
pub(crate) fn registered_icon_data_count() -> usize {
crate::compat::lock(®ISTRY).len
}
pub(crate) fn lookup_registered(name: &str) -> Option<IconData> {
let registry = crate::compat::lock(®ISTRY);
registry.slots[..registry.len]
.iter()
.flatten()
.find(|slot| slot.name == name)
.map(|slot| slot.data)
}