use std::sync::Arc;
use serde::{Deserialize, Serialize};
pub type ElementId = String;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", content = "data")]
pub enum Value {
Float(f64),
Bool(bool),
Color3([f32; 3]),
Color4([f32; 4]),
Vec2([f32; 2]),
Vec3([f32; 3]),
Int(i64),
String(String),
Enum {
selected: usize,
options: Vec<String>,
},
Button(bool),
Progress(f64),
StatValue {
value: String,
subvalue: Option<String>,
},
StatusValue {
active: bool,
#[serde(skip_serializing_if = "Option::is_none")]
active_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
inactive_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
active_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
inactive_color: Option<String>,
},
ChartValue {
values: Vec<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
current: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
unit: Option<String>,
},
GridValue {
cols: usize,
children: Vec<String>,
},
PlotValue {
series: Vec<PlotSeries>,
#[serde(skip_serializing_if = "Option::is_none")]
x_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
y_label: Option<String>,
},
Null,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PlotSeries {
pub name: String,
pub values: Vec<f32>,
pub color: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", content = "data")]
pub enum ElementKind {
Slider,
Checkbox,
ColorPicker3,
ColorPicker4,
TextInput,
Dropdown,
Button,
Label,
Separator,
Section,
ProgressBar,
Stat,
Status,
MiniChart,
Grid,
Plot,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ElementMeta {
#[serde(skip_serializing_if = "Option::is_none")]
pub min: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub step: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subtitle: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cols: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub children: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ElementDecl {
pub id: ElementId,
pub kind: ElementKind,
pub label: String,
pub value: Value,
pub meta: ElementMeta,
pub window: Arc<str>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccentColor {
Coral,
Teal,
Blue,
Green,
Purple,
Orange,
Yellow,
Red,
}
impl AccentColor {
pub fn as_str(&self) -> &'static str {
match self {
AccentColor::Coral => "coral",
AccentColor::Teal => "teal",
AccentColor::Blue => "blue",
AccentColor::Green => "green",
AccentColor::Purple => "purple",
AccentColor::Orange => "orange",
AccentColor::Yellow => "yellow",
AccentColor::Red => "red",
}
}
}