inkanim_types/ink/widget/
mod.rs1mod font;
7mod image;
8pub(crate) mod implementation;
9mod layout;
10mod properties;
11
12use enum_dispatch::enum_dispatch;
13pub use implementation::*;
14
15use serde::{Deserialize, Serialize};
16use serde_aux::prelude::deserialize_bool_from_anything;
17
18use crate::{DepotPath, Name};
19
20use self::{
21 font::{
22 fontStyle, inkFontFamilyResource, textHorizontalAlignment, textLetterCase,
23 textOverflowPolicy, textVerticalAlignment,
24 },
25 image::{inkBrushMirrorType, inkBrushTileType, inkTextureAtlas},
26 layout::{inkEHorizontalAlign, inkEVerticalAlign, inkMargin, textJustificationType},
27};
28
29use super::{HandleId, InkWrapper, LocalizationString};
30
31pub trait SiblingOrNested {
33 fn sibling_or_nested(&self, searched: &[usize]) -> bool;
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[non_exhaustive]
38pub enum Flags {
39 Default,
40 Soft,
41 Hard,
42}
43
44macro_rules! native_compound_widget {
45 ($ty:ident) => {
46 #[doc=concat!("see [NativeDB](https://nativedb.red4ext.com/", stringify!($ty), ")")]
47 #[allow(non_camel_case_types)]
48 #[derive(Debug, Clone, Serialize, Deserialize)]
49 #[serde(rename_all = "camelCase")]
50 pub struct $ty {
51 pub children: InkWrapper<inkMultiChildren>,
52 pub name: $crate::Name,
53 pub child_order: self::layout::inkEChildOrder,
54 pub child_margin: self::layout::inkMargin,
55 }
56 };
57}
58
59macro_rules! native_leaf_widget {
60 ($ty:ident { $($tt:tt)* }) => {
61 #[doc=concat!("🌿 see [NativeDB](https://nativedb.red4ext.com/", stringify!($ty), ")")]
62 #[allow(non_camel_case_types)]
63 #[derive(Debug, Clone, Serialize, Deserialize)]
64 #[serde(rename_all = "camelCase")]
65 pub struct $ty {
66 pub name: $crate::Name,
67 pub layout: self::layout::inkWidgetLayout,
68 pub property_manager: Option<self::properties::PropertyManager>,
69 pub render_transform_pivot: crate::Vector2,
70 pub render_transform: self::layout::inkUITransform,
71 pub size: crate::Vector2,
72 $($tt)*
73 }
74 };
75 ($ty:ident) => {
76 native_leaf_widget!($ty {});
77 };
78}
79
80native_compound_widget!(inkCanvasWidget);
81native_compound_widget!(inkHorizontalPanelWidget);
82native_compound_widget!(inkVerticalPanelWidget);
83native_compound_widget!(inkScrollAreaWidget);
84native_compound_widget!(inkUniformGridWidget);
85native_compound_widget!(inkVirtualCompoundWidget);
86native_compound_widget!(inkFlexWidget);
87native_compound_widget!(inkCacheWidget);
88
89#[allow(non_camel_case_types)]
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct inkMultiChildren {
93 pub children: Vec<InkWrapper<Widget>>,
94}
95
96native_leaf_widget!(inkTextWidget {
97 pub localization_string: LocalizationString,
98 pub text: String,
99 pub font_family: inkFontFamilyResource,
100 pub font_style: fontStyle,
101 pub justification: textJustificationType,
102 pub text_letter_case: Option<textLetterCase>,
103 pub line_height_percentage: f32,
104 pub text_horizontal_alignment: textHorizontalAlignment,
105 pub text_vertical_alignment: textVerticalAlignment,
106 pub text_overflow_policy: textOverflowPolicy,
107 pub content_h_align: inkEHorizontalAlign,
108 pub content_v_align: inkEVerticalAlign,
109 pub scroll_delay: u16,
110 pub scroll_text_speed: f32,
111});
112native_leaf_widget!(inkImageWidget {
113 #[serde(deserialize_with = "deserialize_bool_from_anything")]
114 pub use_external_dynamic_texture: bool,
115 pub external_dynamic_texture: Name,
116 #[serde(deserialize_with = "deserialize_bool_from_anything")]
117 pub use_nine_slice_scale: bool,
118 pub nine_slice_scale: inkMargin,
119 pub mirror_type: inkBrushMirrorType,
120 pub tile_type: inkBrushTileType,
121 pub horizontal_tile_crop: f32,
122 pub vertical_tile_crop: f32,
123 pub texture_atlas: inkTextureAtlas,
124 pub texture_part: Name,
125 pub content_h_align: inkEHorizontalAlign,
126 pub content_v_align: inkEVerticalAlign,
127 pub tile_h_align: inkEHorizontalAlign,
128 pub tile_v_align: inkEVerticalAlign,
129});
130native_leaf_widget!(inkVideoWidget);
131native_leaf_widget!(inkMaskWidget);
132native_leaf_widget!(inkBorderWidget);
133native_leaf_widget!(inkShapeWidget);
134native_leaf_widget!(inkCircleWidget);
135native_leaf_widget!(inkRectangleWidget);
136native_leaf_widget!(inkVectorGraphicWidget);
137
138#[allow(clippy::enum_variant_names)]
140#[allow(non_camel_case_types)]
141#[non_exhaustive]
142#[derive(Debug, Clone, Serialize, Deserialize)]
143#[enum_dispatch(Classname)]
144#[serde(tag = "$type")]
145pub enum Widget {
146 inkMultiChildren(inkMultiChildren),
147
148 inkCanvasWidget(inkCanvasWidget),
149 inkHorizontalPanelWidget(inkHorizontalPanelWidget),
150 inkVerticalPanelWidget(inkVerticalPanelWidget),
151 inkScrollAreaWidget(inkScrollAreaWidget),
152 inkUniformGridWidget(inkUniformGridWidget),
153 inkVirtualCompoundWidget(inkVirtualCompoundWidget),
154 inkFlexWidget(inkFlexWidget),
155 inkCacheWidget(inkCacheWidget),
156
157 inkTextWidget(inkTextWidget),
158 inkImageWidget(inkImageWidget),
159 inkVideoWidget(inkVideoWidget),
160 inkMaskWidget(inkMaskWidget),
161 inkBorderWidget(inkBorderWidget),
162 inkShapeWidget(inkShapeWidget),
163 inkCircleWidget(inkCircleWidget),
164 inkRectangleWidget(inkRectangleWidget),
165 inkVectorGraphicWidget(inkVectorGraphicWidget),
166}
167
168#[allow(non_camel_case_types)]
170#[derive(Debug, Clone, Serialize, Deserialize)]
171#[serde(rename_all = "camelCase")]
172pub struct inkWidgetLibraryItemInstance {
173 pub root_widget: InkWrapper<inkCanvasWidget>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize)]
177#[serde(rename_all = "PascalCase")]
178pub struct Data {
179 pub file: crate::Data<inkWidgetLibraryItemInstance>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize)]
183#[serde(rename_all = "PascalCase")]
184pub struct Package {
185 pub data: self::Data,
186}
187
188#[allow(non_camel_case_types)]
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct inkWidgetLibraryItem {
192 pub name: Name,
193 pub package: Package,
194}
195
196#[allow(non_camel_case_types)]
198#[derive(Debug, Clone, Serialize, Deserialize)]
199#[serde(rename_all = "PascalCase")]
200pub struct inkanimAnimationLibraryResource {
201 depot_path: DepotPath,
202 flags: Flags,
203}
204
205#[allow(non_camel_case_types)]
207#[derive(Debug, Clone, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct inkWidgetLibraryResource {
210 pub animation_library_res_ref: inkanimAnimationLibraryResource,
211 pub library_items: Vec<inkWidgetLibraryItem>,
212}
213
214#[allow(non_snake_case)]
216#[derive(Debug, Clone, Serialize, Deserialize)]
217pub struct WidgetSummary {
218 pub HandleId: HandleId,
220 pub Name: Name,
222}