fantasy_craft/gui/
gui_local_offset.rs1use 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); 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}