1use crate::{components::Component, reflect::Field};
3use glam::Vec3;
4use serde::{Deserialize, Serialize};
5
6crate::choice_enum!(
7 UiKind { Label, Button, Progress } default Label
9);
10
11#[derive(Clone, Serialize, Deserialize)]
13#[serde(default)]
14pub struct UiElement {
15 pub kind: UiKind,
17 pub text: String,
19 pub anchor: Vec3,
21 pub size: Vec3,
23 pub offset: Vec3,
25 pub font_size: f32,
27 pub background: [f32; 4],
29 pub foreground: [f32; 4],
31 pub visible: bool,
33 pub interactable: bool,
35 pub world_space: bool,
37 pub signal: String,
39 pub value: f32,
41}
42impl Default for UiElement {
43 fn default() -> Self {
44 Self { kind: UiKind::Label, text: "UI element".into(), anchor: Vec3::new(0.5, 0.1, 0.0), size: Vec3::new(240.0, 42.0, 0.0), offset: Vec3::ZERO, font_size: 18.0, background: [0.06, 0.08, 0.12, 0.88], foreground: [0.9, 0.95, 1.0, 1.0], visible: true, interactable: true, world_space: false, signal: "ui.click".into(), value: 0.5 }
45 }
46}
47impl Component for UiElement {
48 fn fields(&mut self) -> Vec<Field<'_>> {
49 vec![Field::choice("kind", &mut self.kind), Field::text("text", &mut self.text), Field::vec3("anchor", &mut self.anchor), Field::vec3("size", &mut self.size), Field::vec3("offset", &mut self.offset), Field::f32("font_size", &mut self.font_size), Field::color("background", &mut self.background), Field::color("foreground", &mut self.foreground), Field::bool("visible", &mut self.visible), Field::bool("interactable", &mut self.interactable), Field::bool("world_space", &mut self.world_space), Field::text("signal", &mut self.signal), Field::f32("value", &mut self.value)]
50 }
51}