inkanim_types/ink/widget/
mod.rs

1//! .inkwidget
2//!
3//! All the widgets in Cybperunk 2077 UI
4//! are similar to the web and traditional UI frameworks.
5
6mod 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
31/// belongs to the same level or is nested below, in a tree hierarchy
32pub 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/// see [NativeDB](https://nativedb.red4ext.com/inkMultiChildren)
90#[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/// any widget
139#[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/// see [NativeDB](https://nativedb.red4ext.com/inkWidgetLibraryItemInstance)
169#[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/// see [NativeDB](https://nativedb.red4ext.com/inkWidgetLibraryItem)
189#[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/// see [NativeDB](https://nativedb.red4ext.com/inkanimAnimationLibraryResource)
197#[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/// see [NativeDB](https://nativedb.red4ext.com/inkWidgetLibraryResource)
206#[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/// widget aggregated informations summary
215#[allow(non_snake_case)]
216#[derive(Debug, Clone, Serialize, Deserialize)]
217pub struct WidgetSummary {
218    /// unique handle ID
219    pub HandleId: HandleId,
220    /// widget name
221    pub Name: Name,
222}