Skip to main content

fantasy_craft/gui/
gui_local_offset.rs

1use hecs::Entity;
2use serde::Deserialize;
3
4use crate::prelude::{ComponentLoader};
5use crate::gui::gui_dimension::{GuiDimension, GuiDimensionLoaderData};
6
7#[derive(Debug, Clone, Copy, Default)]
8pub struct GuiLocalOffset {
9    pub x: GuiDimension,
10    pub y: GuiDimension
11}
12
13#[derive(Deserialize, Debug, Default)]
14pub struct GuiLocalOffsetLoaderData {
15    pub x: GuiDimensionLoaderData,
16    pub y: GuiDimensionLoaderData
17}
18
19pub struct GuiLocalOffsetLoader;
20
21impl ComponentLoader for GuiLocalOffsetLoader {
22    fn load(&self, ctx: &mut crate::prelude::Context, entity: Entity, data: &serde_json::Value) {
23        let loader_data: GuiLocalOffsetLoaderData = serde_json::from_value(data.clone())
24            .unwrap_or_default();
25
26        let parse_dimension = |loader_dim: GuiDimensionLoaderData| -> GuiDimension {
27            match loader_dim {
28                GuiDimensionLoaderData::Pixels(px) => GuiDimension::Pixels(px),
29                GuiDimensionLoaderData::Percent(s) => {
30                    let value = s.trim_end_matches('%')
31                                 .parse::<f32>()
32                                 .unwrap_or(0.0); // 0% par défaut
33                    GuiDimension::Percent(value / 100.0) 
34                }
35            }
36        };
37
38        let component = GuiLocalOffset {
39            x: parse_dimension(loader_data.x),
40            y: parse_dimension(loader_data.y)
41        };
42
43        ctx.world.insert_one(entity, component).expect("Failed to insert GuiLocalOffset");
44    }
45}