@effindomv2/fui-rs 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/COMMERCIAL.md +7 -0
  2. package/Cargo.toml +34 -0
  3. package/LICENSE.md +9 -0
  4. package/README.md +88 -0
  5. package/package.json +54 -0
  6. package/scripts/build.sh +227 -0
  7. package/scripts/check-runtime-dependency.sh +41 -0
  8. package/scripts/framework-host-services.ts +40 -0
  9. package/scripts/generate-host-events.ts +17 -0
  10. package/scripts/generate-host-services.ts +28 -0
  11. package/scripts/hostgen/common.ts +73 -0
  12. package/scripts/hostgen/registry.ts +159 -0
  13. package/scripts/hostgen/rust-host-events.ts +171 -0
  14. package/scripts/hostgen/rust-host-services.ts +257 -0
  15. package/src/animation.rs +625 -0
  16. package/src/app.rs +324 -0
  17. package/src/assets.rs +572 -0
  18. package/src/bindings/mod.rs +1 -0
  19. package/src/bindings/ui.rs +705 -0
  20. package/src/bitmap.rs +317 -0
  21. package/src/bridge_callbacks.rs +242 -0
  22. package/src/context_menu_manager.rs +332 -0
  23. package/src/controls/anti_selection_area.rs +54 -0
  24. package/src/controls/button.rs +542 -0
  25. package/src/controls/checkbox.rs +372 -0
  26. package/src/controls/combobox.rs +1574 -0
  27. package/src/controls/context_menu.rs +1367 -0
  28. package/src/controls/control_template_set.rs +46 -0
  29. package/src/controls/control_tokens.rs +596 -0
  30. package/src/controls/dialog.rs +590 -0
  31. package/src/controls/dropdown.rs +1010 -0
  32. package/src/controls/form.rs +229 -0
  33. package/src/controls/internal/button_presenter.rs +142 -0
  34. package/src/controls/internal/checkbox_indicator_presenter.rs +210 -0
  35. package/src/controls/internal/dropdown_chevron_presenter.rs +134 -0
  36. package/src/controls/internal/dropdown_field_presenter.rs +269 -0
  37. package/src/controls/internal/dropdown_option_row_presenter.rs +184 -0
  38. package/src/controls/internal/mod.rs +13 -0
  39. package/src/controls/internal/pressable_indicator_presenter.rs +26 -0
  40. package/src/controls/internal/pressable_labeled_control.rs +492 -0
  41. package/src/controls/internal/radio_indicator_presenter.rs +208 -0
  42. package/src/controls/internal/selectable_popup_list.rs +597 -0
  43. package/src/controls/internal/slider_presenter.rs +282 -0
  44. package/src/controls/internal/switch_indicator_presenter.rs +235 -0
  45. package/src/controls/internal/text_input_core.rs +1074 -0
  46. package/src/controls/internal/text_input_presenter.rs +108 -0
  47. package/src/controls/mod.rs +235 -0
  48. package/src/controls/nav_link.rs +395 -0
  49. package/src/controls/popup.rs +191 -0
  50. package/src/controls/progress_bar.rs +287 -0
  51. package/src/controls/radio_button.rs +348 -0
  52. package/src/controls/radio_group.rs +283 -0
  53. package/src/controls/selection_area.rs +82 -0
  54. package/src/controls/shared.rs +68 -0
  55. package/src/controls/slider.rs +701 -0
  56. package/src/controls/switch.rs +293 -0
  57. package/src/controls/templating.rs +49 -0
  58. package/src/controls/tests.rs +3905 -0
  59. package/src/controls/text_area.rs +207 -0
  60. package/src/controls/text_input.rs +192 -0
  61. package/src/debug.rs +146 -0
  62. package/src/drag_drop.rs +424 -0
  63. package/src/drag_gesture.rs +258 -0
  64. package/src/drawing.rs +385 -0
  65. package/src/event.rs +1603 -0
  66. package/src/external_drop.rs +467 -0
  67. package/src/fetch.rs +500 -0
  68. package/src/ffi.rs +3542 -0
  69. package/src/file.rs +1677 -0
  70. package/src/focus_adorner.rs +307 -0
  71. package/src/focus_visibility.rs +121 -0
  72. package/src/frame_scheduler.rs +159 -0
  73. package/src/frame_signal.rs +64 -0
  74. package/src/generated/ffi.rs +798 -0
  75. package/src/generated/framework_host_services.rs +74 -0
  76. package/src/generated/mod.rs +2 -0
  77. package/src/host_services.rs +162 -0
  78. package/src/image_sampling.rs +78 -0
  79. package/src/keyboard_scroll.rs +137 -0
  80. package/src/keyboard_scroll_tracker.rs +385 -0
  81. package/src/lib.rs +547 -0
  82. package/src/logger.rs +56 -0
  83. package/src/mobile_text_selection_toolbar.rs +1034 -0
  84. package/src/navigation.rs +48 -0
  85. package/src/node/core.rs +2210 -0
  86. package/src/node/custom_drawable.rs +149 -0
  87. package/src/node/flex_box.rs +874 -0
  88. package/src/node/grid.rs +304 -0
  89. package/src/node/helpers.rs +442 -0
  90. package/src/node/image.rs +506 -0
  91. package/src/node/mod.rs +315 -0
  92. package/src/node/scroll_bar.rs +845 -0
  93. package/src/node/scroll_box.rs +514 -0
  94. package/src/node/scroll_state.rs +121 -0
  95. package/src/node/scroll_view.rs +557 -0
  96. package/src/node/svg_node.rs +474 -0
  97. package/src/node/text_node.rs +633 -0
  98. package/src/node/virtual_list.rs +678 -0
  99. package/src/panic_hook.rs +36 -0
  100. package/src/persisted.rs +274 -0
  101. package/src/platform.rs +556 -0
  102. package/src/popup_presenter.rs +344 -0
  103. package/src/selection_handle_adorner.rs +838 -0
  104. package/src/signal.rs +134 -0
  105. package/src/text.rs +1065 -0
  106. package/src/theme.rs +571 -0
  107. package/src/timers.rs +106 -0
  108. package/src/tool_tip.rs +167 -0
  109. package/src/tool_tip_manager.rs +691 -0
  110. package/src/transitions.rs +41 -0
  111. package/src/typography.rs +520 -0
  112. package/src/viewport.rs +108 -0
  113. package/src/worker.rs +308 -0
  114. package/src/worker_job.rs +82 -0
  115. package/src/worker_runtime.rs +172 -0
@@ -0,0 +1,293 @@
1
+ use super::internal::pressable_labeled_control::PressableLabeledControlState;
2
+ use super::internal::switch_indicator_presenter::{
3
+ create_default_switch_indicator_presenter, SwitchIndicatorPresenter, SwitchIndicatorTemplate,
4
+ SwitchIndicatorVisualState,
5
+ };
6
+ use super::*;
7
+ use std::cell::{Cell, RefCell};
8
+ use std::rc::Rc;
9
+
10
+ fn create_indicator_presenter(
11
+ template: Option<Rc<dyn SwitchIndicatorTemplate>>,
12
+ sizing: Option<LabeledControlSizing>,
13
+ ) -> Rc<dyn SwitchIndicatorPresenter> {
14
+ if let Some(template) = template {
15
+ return template.create(sizing);
16
+ }
17
+ if let Some(template_set) = get_control_templates() {
18
+ if let Some(template) = template_set.switch_indicator {
19
+ return template.create(sizing);
20
+ }
21
+ }
22
+ create_default_switch_indicator_presenter(sizing)
23
+ }
24
+
25
+ #[derive(Clone)]
26
+ pub struct Switch {
27
+ base: PressableLabeledControl,
28
+ root: FlexBox,
29
+ indicator_presenter: Rc<RefCell<Rc<dyn SwitchIndicatorPresenter>>>,
30
+ template_override: Rc<RefCell<Option<Rc<dyn SwitchIndicatorTemplate>>>>,
31
+ sizing_value: Rc<Cell<Option<LabeledControlSizing>>>,
32
+ colors_value: Rc<Cell<Option<LabeledControlColors>>>,
33
+ checked: Rc<Cell<bool>>,
34
+ changed: Rc<RefCell<Option<SwitchChangedCallback>>>,
35
+ weak_root: Rc<WeakNodeRef>,
36
+ }
37
+
38
+ impl Switch {
39
+ pub fn new(label: impl Into<String>) -> Self {
40
+ let label = label.into();
41
+ let indicator_presenter = create_indicator_presenter(None, None);
42
+ let base =
43
+ PressableLabeledControl::new(SemanticRole::Switch, label, indicator_presenter.root());
44
+ let root = base.root();
45
+ let weak_root = Rc::new(root.node_ref().downgrade());
46
+ let control = Self {
47
+ base,
48
+ root,
49
+ indicator_presenter: Rc::new(RefCell::new(indicator_presenter)),
50
+ template_override: Rc::new(RefCell::new(None)),
51
+ sizing_value: Rc::new(Cell::new(None)),
52
+ colors_value: Rc::new(Cell::new(None)),
53
+ checked: Rc::new(Cell::new(false)),
54
+ changed: Rc::new(RefCell::new(None)),
55
+ weak_root,
56
+ };
57
+ control.root.semantic_checked(SemanticCheckedState::False);
58
+ let activation = SwitchEventTarget::from_switch(&control);
59
+ control.base.set_activation(move |state| {
60
+ activation.activate(state);
61
+ });
62
+ let state_sync = SwitchEventTarget::from_switch(&control);
63
+ control.base.set_state_changed(move |state| {
64
+ state_sync.sync_visual(state, false, false);
65
+ });
66
+ let snapshot = control.base.state_snapshotter();
67
+ let presenter = control.indicator_presenter.clone();
68
+ let weak_root = control.weak_root.clone();
69
+ let checked = control.checked.clone();
70
+ let changed = control.changed.clone();
71
+ let colors_value = control.colors_value.clone();
72
+ control.persist_state(crate::persisted::persisted_value_adapter(
73
+ "switch-checked",
74
+ crate::persisted::PersistedBoolCodec,
75
+ 1,
76
+ {
77
+ let checked = checked.clone();
78
+ move || Some(checked.get())
79
+ },
80
+ move |next| {
81
+ apply_switch_checked(
82
+ &presenter,
83
+ &weak_root,
84
+ &checked,
85
+ next,
86
+ true,
87
+ false,
88
+ &changed,
89
+ colors_value.get(),
90
+ snapshot(),
91
+ );
92
+ },
93
+ ));
94
+ control.sync_visual(control.base.snapshot_state(), false, false);
95
+ control
96
+ }
97
+
98
+ pub fn checked(&self, checked: bool) -> &Self {
99
+ self.check(checked);
100
+ self
101
+ }
102
+
103
+ pub fn check(&self, checked: bool) -> &Self {
104
+ apply_switch_checked(
105
+ &self.indicator_presenter,
106
+ &self.weak_root,
107
+ &self.checked,
108
+ checked,
109
+ true,
110
+ false,
111
+ &self.changed,
112
+ self.colors_value.get(),
113
+ self.base.snapshot_state(),
114
+ );
115
+ self
116
+ }
117
+
118
+ pub fn sizing(&self, sizing: Option<LabeledControlSizing>) -> &Self {
119
+ self.sizing_value.set(sizing);
120
+ self.base.set_label_font_size_override(
121
+ sizing
122
+ .filter(|sizing| sizing.has_label_font_size())
123
+ .map(|sizing| sizing.label_font_size_px())
124
+ .unwrap_or(0.0),
125
+ );
126
+ self.replace_indicator_presenter(create_indicator_presenter(
127
+ self.template_override.borrow().clone(),
128
+ self.sizing_value.get(),
129
+ ));
130
+ self.sync_visual(self.base.snapshot_state(), false, false);
131
+ self
132
+ }
133
+
134
+ pub fn template(&self, template: Option<Rc<dyn SwitchIndicatorTemplate>>) -> &Self {
135
+ self.template_override.replace(template.clone());
136
+ self.replace_indicator_presenter(create_indicator_presenter(
137
+ template,
138
+ self.sizing_value.get(),
139
+ ));
140
+ self.sync_visual(self.base.snapshot_state(), false, false);
141
+ self
142
+ }
143
+
144
+ pub fn colors(&self, colors: Option<LabeledControlColors>) -> &Self {
145
+ self.colors_value.set(colors);
146
+ self.base.colors(colors);
147
+ self.sync_visual(self.base.snapshot_state(), false, false);
148
+ self
149
+ }
150
+
151
+ pub fn is_checked(&self) -> bool {
152
+ self.checked.get()
153
+ }
154
+
155
+ pub fn enabled(&self, enabled: bool) -> &Self {
156
+ self.base.enabled(enabled);
157
+ self
158
+ }
159
+
160
+ pub fn on_changed(&self, handler: impl Fn(SwitchChangedEventArgs) + 'static) -> &Self {
161
+ *self.changed.borrow_mut() = Some(Rc::new(handler));
162
+ self
163
+ }
164
+
165
+ fn replace_indicator_presenter(&self, next_presenter: Rc<dyn SwitchIndicatorPresenter>) {
166
+ let previous = self.indicator_presenter.borrow().clone();
167
+ if Rc::ptr_eq(&previous, &next_presenter) {
168
+ return;
169
+ }
170
+ self.base.replace_indicator_root(next_presenter.root());
171
+ self.indicator_presenter.replace(next_presenter);
172
+ }
173
+
174
+ fn sync_visual(&self, base_state: PressableLabeledControlState, emit: bool, announce: bool) {
175
+ apply_switch_checked(
176
+ &self.indicator_presenter,
177
+ &self.weak_root,
178
+ &self.checked,
179
+ self.checked.get(),
180
+ emit,
181
+ announce,
182
+ &self.changed,
183
+ self.colors_value.get(),
184
+ base_state,
185
+ );
186
+ }
187
+ }
188
+
189
+ impl Node for Switch {
190
+ fn retained_node_ref(&self) -> NodeRef {
191
+ self.root.retained_node_ref()
192
+ }
193
+
194
+ fn build_self(&self) {
195
+ self.sync_visual(self.base.snapshot_state(), false, false);
196
+ self.root.build_self();
197
+ }
198
+ }
199
+
200
+ impl HasFlexBoxRoot for Switch {
201
+ fn flex_box_root(&self) -> &FlexBox {
202
+ &self.root
203
+ }
204
+ }
205
+
206
+ #[derive(Clone)]
207
+ struct SwitchEventTarget {
208
+ presenter: Rc<RefCell<Rc<dyn SwitchIndicatorPresenter>>>,
209
+ checked: Rc<Cell<bool>>,
210
+ colors_value: Rc<Cell<Option<LabeledControlColors>>>,
211
+ changed: Rc<RefCell<Option<SwitchChangedCallback>>>,
212
+ weak_root: Rc<WeakNodeRef>,
213
+ }
214
+
215
+ impl SwitchEventTarget {
216
+ fn from_switch(switch: &Switch) -> Self {
217
+ Self {
218
+ presenter: switch.indicator_presenter.clone(),
219
+ checked: switch.checked.clone(),
220
+ colors_value: switch.colors_value.clone(),
221
+ changed: switch.changed.clone(),
222
+ weak_root: switch.weak_root.clone(),
223
+ }
224
+ }
225
+
226
+ fn activate(&self, base_state: PressableLabeledControlState) {
227
+ apply_switch_checked(
228
+ &self.presenter,
229
+ &self.weak_root,
230
+ &self.checked,
231
+ !self.checked.get(),
232
+ true,
233
+ true,
234
+ &self.changed,
235
+ self.colors_value.get(),
236
+ base_state,
237
+ );
238
+ }
239
+
240
+ fn sync_visual(&self, base_state: PressableLabeledControlState, emit: bool, announce: bool) {
241
+ apply_switch_checked(
242
+ &self.presenter,
243
+ &self.weak_root,
244
+ &self.checked,
245
+ self.checked.get(),
246
+ emit,
247
+ announce,
248
+ &self.changed,
249
+ self.colors_value.get(),
250
+ base_state,
251
+ );
252
+ }
253
+ }
254
+
255
+ fn apply_switch_checked(
256
+ presenter: &Rc<RefCell<Rc<dyn SwitchIndicatorPresenter>>>,
257
+ weak_root: &Rc<WeakNodeRef>,
258
+ checked_cell: &Rc<Cell<bool>>,
259
+ checked: bool,
260
+ emit: bool,
261
+ announce: bool,
262
+ changed: &Rc<RefCell<Option<SwitchChangedCallback>>>,
263
+ colors: Option<LabeledControlColors>,
264
+ base_state: PressableLabeledControlState,
265
+ ) {
266
+ let previous = checked_cell.get();
267
+ checked_cell.set(checked);
268
+ update_semantic_checked(
269
+ weak_root,
270
+ if checked {
271
+ SemanticCheckedState::True
272
+ } else {
273
+ SemanticCheckedState::False
274
+ },
275
+ announce && previous != checked,
276
+ );
277
+ presenter.borrow().apply(
278
+ current_theme(),
279
+ SwitchIndicatorVisualState::new(
280
+ checked,
281
+ base_state.hovered,
282
+ base_state.pressed,
283
+ base_state.focused,
284
+ base_state.enabled,
285
+ ),
286
+ colors,
287
+ );
288
+ if emit && previous != checked {
289
+ if let Some(callback) = changed.borrow().clone() {
290
+ callback(SwitchChangedEventArgs { checked });
291
+ }
292
+ }
293
+ }
@@ -0,0 +1,49 @@
1
+ pub use super::internal::button_presenter::{
2
+ create_default_button_presenter, ButtonPresenter, ButtonTemplate, ButtonVisualState,
3
+ DefaultButtonTemplate, DEFAULT_BUTTON_TEMPLATE,
4
+ };
5
+ pub use super::internal::checkbox_indicator_presenter::{
6
+ create_default_checkbox_indicator_presenter, CheckboxIndicatorPresenter,
7
+ CheckboxIndicatorTemplate, CheckboxIndicatorVisualState, DefaultCheckboxIndicatorTemplate,
8
+ DEFAULT_CHECKBOX_INDICATOR_TEMPLATE,
9
+ };
10
+ pub use super::internal::dropdown_chevron_presenter::{
11
+ create_default_dropdown_chevron_presenter, DefaultDropdownChevronTemplate,
12
+ DropdownChevronMetrics, DropdownChevronPresenter, DropdownChevronTemplate,
13
+ DropdownChevronVisualState, DEFAULT_DROPDOWN_CHEVRON_TEMPLATE,
14
+ };
15
+ pub use super::internal::dropdown_field_presenter::{
16
+ create_default_dropdown_field_presenter, DefaultDropdownFieldTemplate, DropdownFieldMetrics,
17
+ DropdownFieldPresenter, DropdownFieldTemplate, DropdownFieldVisualState,
18
+ DEFAULT_DROPDOWN_FIELD_TEMPLATE,
19
+ };
20
+ pub use super::internal::dropdown_option_row_presenter::{
21
+ create_default_dropdown_option_row_presenter, DefaultDropdownOptionRowTemplate,
22
+ DropdownOptionRowMetrics, DropdownOptionRowPresenter, DropdownOptionRowTemplate,
23
+ DropdownOptionRowVisualState, DEFAULT_DROPDOWN_OPTION_ROW_TEMPLATE,
24
+ };
25
+ pub use super::internal::pressable_indicator_presenter::{
26
+ PressableIndicatorMetrics, PressableIndicatorPresenter, PressableIndicatorVisualState,
27
+ };
28
+ pub use super::internal::radio_indicator_presenter::{
29
+ create_default_radio_indicator_presenter, DefaultRadioIndicatorTemplate,
30
+ RadioIndicatorPresenter, RadioIndicatorTemplate, RadioIndicatorVisualState,
31
+ DEFAULT_RADIO_INDICATOR_TEMPLATE,
32
+ };
33
+ pub use super::internal::slider_presenter::{
34
+ create_default_slider_presenter, DefaultSliderTemplate, SliderPresenter,
35
+ SliderPresenterMetrics, SliderTemplate, SliderVisualState, DEFAULT_SLIDER_TEMPLATE,
36
+ };
37
+ pub use super::internal::switch_indicator_presenter::{
38
+ create_default_switch_indicator_presenter, DefaultSwitchIndicatorTemplate,
39
+ SwitchIndicatorPresenter, SwitchIndicatorTemplate, SwitchIndicatorVisualState,
40
+ DEFAULT_SWITCH_INDICATOR_TEMPLATE,
41
+ };
42
+ pub use super::internal::text_input_presenter::{
43
+ create_default_text_input_presenter, DefaultTextInputTemplate, TextInputPresenter,
44
+ TextInputTemplate, TextInputVisualState, DEFAULT_TEXT_INPUT_TEMPLATE,
45
+ };
46
+
47
+ pub use super::control_template_set::{
48
+ clear_control_templates, get_control_templates, use_control_templates, ControlTemplateSet,
49
+ };