#[cfg(feature = "spirix")]
use spirix::{CircleF4E4, ScalarF4E4};
use super::VsfType;
#[derive(Debug, Clone, PartialEq)]
pub enum Fill {
Solid(Box<VsfType>), Gradient(Box<VsfType>), }
#[derive(Debug, Clone, PartialEq)]
pub struct Stroke {
pub width: ScalarF4E4,
pub colour: Box<VsfType>,
pub join: StrokeJoin,
pub cap: StrokeCap,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StrokeJoin {
Miter,
Round,
Bevel,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StrokeCap {
Butt,
Round,
Square,
}
#[derive(Debug, Clone, PartialEq)]
pub enum GradientVariant {
Linear {
start: CircleF4E4,
end: CircleF4E4,
},
Radial {
center: CircleF4E4,
radius: ScalarF4E4,
},
Conic {
center: CircleF4E4,
angle: ScalarF4E4,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct GradientStop {
pub offset: ScalarF4E4, pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub enum PathCommand {
MoveTo(CircleF4E4),
LineTo(CircleF4E4),
QuadraticTo(CircleF4E4, CircleF4E4), CubicTo(CircleF4E4, CircleF4E4, CircleF4E4), Close,
}
#[derive(Debug, Clone, PartialEq)]
pub enum SplineType {
Bezier,
Cubic,
CatmullRom,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ButtonVariant {
Filled,
Outlined,
Text,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Transform {
pub translate: Option<CircleF4E4>,
pub rotate: Option<ScalarF4E4>, pub scale: Option<CircleF4E4>,
pub origin: Option<CircleF4E4>, }
impl Transform {
pub fn identity() -> Self {
Transform {
translate: None,
rotate: None,
scale: None,
origin: None,
}
}
pub fn is_identity(&self) -> bool {
self.translate.is_none()
&& self.rotate.is_none()
&& self.scale.is_none()
&& self.origin.is_none()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TextStyle {
pub font: Option<[u8; 32]>, pub leading: Option<ScalarF4E4>, pub kerning: Option<ScalarF4E4>, pub weight: Option<ScalarF4E4>, pub tilt: Option<ScalarF4E4>, pub wrap: Option<ScalarF4E4>, pub align: Option<u8>, }
impl TextStyle {
pub fn default() -> Self {
TextStyle {
font: None,
leading: None,
kerning: None,
weight: None,
tilt: None,
wrap: None,
align: None,
}
}
pub fn is_default(&self) -> bool {
self.font.is_none()
&& self.leading.is_none()
&& self.kerning.is_none()
&& self.weight.is_none()
&& self.tilt.is_none()
&& self.wrap.is_none()
&& self.align.is_none()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TokaBox {
pub pos: CircleF4E4,
pub size: CircleF4E4,
pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaContainer {
pub children: Vec<Node>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TokaCircle {
pub pos: CircleF4E4,
pub span: ScalarF4E4,
pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaLine {
pub start: CircleF4E4,
pub end: CircleF4E4,
pub width: ScalarF4E4,
pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaText {
pub pos: CircleF4E4,
pub size: CircleF4E4,
pub content: String,
pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaButton {
pub pos: CircleF4E4,
pub size: CircleF4E4,
pub label: String,
pub variant: ButtonVariant,
pub colour: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaPath {
pub colour: [ScalarF4E4; 4], pub width: ScalarF4E4,
pub commands: Vec<PathCommand>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TokaImage {
pub pos: CircleF4E4,
pub size: CircleF4E4,
pub handle: u64,
pub tint: [ScalarF4E4; 4], }
#[derive(Debug, Clone, PartialEq)]
pub struct TokaSurface {
pub pos: CircleF4E4,
pub size: CircleF4E4,
pub handle: u64,
}
#[derive(Debug, Clone, PartialEq)]
pub enum NodeKind {
Box(TokaBox),
Circle(TokaCircle),
Line(TokaLine),
Text(TokaText),
Button(TokaButton),
Path(TokaPath),
Image(TokaImage),
Surface(TokaSurface),
Container(TokaContainer),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Node {
pub kind: NodeKind,
pub transform: Transform,
pub children: Vec<Node>,
}
impl Node {
pub fn new(kind: NodeKind) -> Self {
Node {
kind,
transform: Transform::identity(),
children: Vec::new(),
}
}
pub fn set_transform(mut self, transform: Transform) -> Self {
self.transform = transform;
self
}
pub fn add_child(mut self, child: Node) -> Self {
self.children.push(child);
self
}
}