1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4
5pub type ElementId = String;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
8#[serde(tag = "type", content = "data")]
9pub enum Value {
10 Float(f64),
11 Bool(bool),
12 Color3([f32; 3]),
13 Color4([f32; 4]),
14 Vec2([f32; 2]),
15 Vec3([f32; 3]),
16 Int(i64),
17 String(String),
18 Enum {
19 selected: usize,
20 options: Vec<String>,
21 },
22 Button(bool),
24 Progress(f64),
26 StatValue {
28 value: String,
29 subvalue: Option<String>,
30 },
31 StatusValue {
33 active: bool,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 active_text: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 inactive_text: Option<String>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 active_color: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 inactive_color: Option<String>,
42 },
43 ChartValue {
45 values: Vec<f32>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 current: Option<f32>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 unit: Option<String>,
50 },
51 GridValue {
53 cols: usize,
54 children: Vec<String>,
55 },
56 PlotValue {
58 series: Vec<PlotSeries>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 x_label: Option<String>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 y_label: Option<String>,
63 },
64 Null,
66 ImageValue {
68 data: String,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 width: Option<u32>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 height: Option<u32>,
73 },
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
78pub struct PlotSeries {
79 pub name: String,
80 pub values: Vec<f32>,
81 pub color: String,
82 #[serde(default = "default_autoscale")]
86 pub autoscale: bool,
87}
88
89fn default_autoscale() -> bool {
90 true
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
94#[serde(tag = "type", content = "data")]
95pub enum ElementKind {
96 Slider,
97 Checkbox,
98 ColorPicker3,
99 ColorPicker4,
100 TextInput,
101 Dropdown,
102 Button,
103 Label,
104 Separator,
105 Section,
107 ProgressBar,
109 Stat,
111 Status,
113 MiniChart,
115 Grid,
117 Plot,
119 KeyValue,
121 ButtonCompact,
123 Horizontal,
125 ButtonInline,
127 TextInputInline,
129 LabelInline,
131 Image,
133 ImageButton,
135}
136
137#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
138pub struct ElementMeta {
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub min: Option<f64>,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub max: Option<f64>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub step: Option<f64>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub accent: Option<AccentColor>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub subtitle: Option<String>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub cols: Option<usize>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub children: Option<Vec<String>>,
157}
158
159#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
160pub struct ElementDecl {
161 pub id: ElementId,
162 pub kind: ElementKind,
163 pub label: String,
164 pub value: Value,
165 pub meta: ElementMeta,
166 pub window: Arc<str>,
167}
168
169#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
171#[serde(rename_all = "lowercase")]
172pub enum AccentColor {
173 Coral,
174 Teal,
175 Blue,
176 Green,
177 Purple,
178 Orange,
179 Yellow,
180 Red,
181 Black,
182 White,
183 Gray,
184}
185
186impl AccentColor {
187 pub fn as_str(&self) -> &'static str {
188 match self {
189 AccentColor::Coral => "coral",
190 AccentColor::Teal => "teal",
191 AccentColor::Blue => "blue",
192 AccentColor::Green => "green",
193 AccentColor::Purple => "purple",
194 AccentColor::Orange => "orange",
195 AccentColor::Yellow => "yellow",
196 AccentColor::Red => "red",
197 AccentColor::Black => "black",
198 AccentColor::White => "white",
199 AccentColor::Gray => "gray",
200 }
201 }
202}