use ::core::mem::MaybeUninit;
use bevy_ecs::{component::Component, lifecycle::HookContext, world::DeferredWorld};
use lightvgl_sys::{lv_part_t_LV_PART_MAIN, lv_style_selector_t};
use crate::{functions::lv_style_copy, info, widgets::Widget};
#[derive(Component)]
#[component(on_insert=add_style)]
#[component(on_replace=remove_style)]
#[component(storage = "SparseSet")]
pub struct Style {
raw: lightvgl_sys::lv_style_t,
selector: lv_style_selector_t,
}
impl Default for Style {
fn default() -> Self {
let raw = unsafe {
let mut style = MaybeUninit::<lightvgl_sys::lv_style_t>::uninit();
lightvgl_sys::lv_style_init(style.as_mut_ptr());
style.assume_init()
};
Self {
raw,
selector: lv_part_t_LV_PART_MAIN,
}
}
}
impl Clone for Style {
fn clone(&self) -> Self {
let mut result = Style::default();
lv_style_copy(&mut result, self);
result.selector = self.selector;
result
}
}
impl Style {
pub fn raw(&self) -> &lightvgl_sys::lv_style_t {
&self.raw
}
pub fn raw_mut(&mut self) -> &mut lightvgl_sys::lv_style_t {
&mut self.raw
}
pub fn new(selector: lv_style_selector_t) -> Self {
let raw = unsafe {
let mut style = MaybeUninit::<lightvgl_sys::lv_style_t>::uninit();
lightvgl_sys::lv_style_init(style.as_mut_ptr());
style.assume_init()
};
Self { raw, selector }
}
}
impl Drop for Style {
fn drop(&mut self) {
info!("Dropping Style");
}
}
unsafe impl Send for Style {}
unsafe impl Sync for Style {}
fn add_style(mut world: DeferredWorld, ctx: HookContext) {
let widget = world
.get_mut::<Widget>(ctx.entity)
.expect("Style components must be added to Widget entities")
.raw_mut();
let style = world.get_mut::<Style>(ctx.entity).unwrap();
unsafe {
lightvgl_sys::lv_obj_add_style(widget, &style.raw, style.selector);
}
info!("Added Style");
}
fn remove_style(mut world: DeferredWorld, ctx: HookContext) {
let widget = world
.get_mut::<Widget>(ctx.entity)
.expect("Style components must be added to Widget entities")
.raw_mut();
let style = world.get_mut::<Style>(ctx.entity).unwrap();
unsafe {
lightvgl_sys::lv_obj_remove_style(widget, &style.raw, style.selector);
}
info!("Removed Style");
}