1#![warn(missing_docs)]
10
11use bevy::prelude::*;
12
13pub mod animation;
14pub mod bake;
15pub mod binding;
16pub mod brushes;
17pub mod classes;
18pub mod clip;
19pub mod commands;
20pub mod diagnostics;
21pub mod dp;
22pub mod events;
23pub mod focus;
24pub mod focus_input;
25pub mod font;
26pub mod geometry;
27pub mod headless;
28#[cfg(feature = "hot_reload")]
29pub mod hot_reload;
30pub mod image;
31pub mod imaging;
32pub mod inlines;
33pub mod input;
34pub mod integration;
35pub mod items;
36pub mod layout;
37pub mod list;
38pub mod markup;
39pub mod panel;
40pub mod plain_vm;
41pub mod reconcile;
42pub mod render;
43pub mod render_device;
44pub mod resources;
45pub mod routed_events;
46pub mod shapes;
47pub mod styles;
48pub mod svg;
49pub mod text;
50pub mod theme;
51pub mod transforms;
52pub mod transforms3d;
53pub mod typography;
54pub mod ui;
55pub mod viewmodel;
56pub mod visibility;
57pub mod visual_state;
58pub mod window_compat;
59pub mod xaml;
60
61pub use animation::{AnimationSpec, NoesisAnimation, NoesisAnimationPlugin};
62pub use bake::{NoesisLabelBaker, NoesisLabelBakerPlugin};
63pub use binding::{
64 BindingMode, ConvertArg, Converted, MultiValueConverter, NoesisBinding, NoesisBindingPlugin,
65 SourceSpec, ValueConverter,
66};
67pub use brushes::{
68 BrushReadback, BrushSpec, BrushTarget, GradientStop, NoesisBrushChanged, NoesisBrushes,
69 NoesisBrushesPlugin,
70};
71pub use classes::{NoesisClassPlugin, NoesisClassRegistry};
72pub use clip::{NoesisClip, NoesisClipPlugin};
73pub use commands::{
74 CommandForwarder, CommandsDef, NoesisCommandInvoked, NoesisCommands, NoesisCommandsPlugin,
75 SharedCommandQueue,
76};
77pub use diagnostics::{NoesisDiagnostics, NoesisDiagnosticsPlugin};
78pub use dp::{DpKind, DpValue, DpWatch, NoesisDp, NoesisDpChanged, NoesisDpPlugin};
79pub use events::{
80 ClickWatchEntry, Key, KeyDownWatchEntry, NoesisClickWatch, NoesisClicked, NoesisEventsPlugin,
81 NoesisKeyDown, NoesisKeyDownWatch, SharedClickQueue, SharedKeyDownQueue, UiClicked, UiKeyDown,
82};
83pub use focus::{NoesisFocus, NoesisFocusPlugin};
84pub use focus_input::{
85 FocusMove, FocusNavigationDirection, FocusPredict, KeyBindingSpec, ModifierKeys,
86 NoesisFocusBindingFired, NoesisFocusControl, NoesisFocusControlPlugin, NoesisFocusPredicted,
87};
88pub use font::{BevyFontProvider, FontAsset, FontAssetLoader, FontAssetPlugin, FontRegistry};
89pub use geometry::{NoesisGeometry, NoesisGeometryPlugin};
90pub use headless::NoesisHeadlessPlugin;
91#[cfg(feature = "hot_reload")]
92pub use hot_reload::{NoesisHotReload, NoesisHotReloadPlugin};
93pub use image::{
94 BevyTextureProvider, ImageAsset, ImageAssetLoader, ImageAssetPlugin, ImageRegistry,
95};
96pub use imaging::{
97 ImageBitmap, ImageReadback, NoesisImageChanged, NoesisImaging, NoesisImagingPlugin,
98};
99pub use inlines::{
100 InlineSpec, InlinesReadback, NoesisInlines, NoesisInlinesChanged, NoesisInlinesPlugin,
101 TextDecorations,
102};
103pub use input::{
104 NoesisInputEvent, NoesisInputPlugin, NoesisInputQueue, NoesisPointerOverUi, TargetedInput,
105};
106pub use integration::{
107 CursorType, NoesisCursorRequested, NoesisIntegrationPlugin, NoesisOpenUrl, NoesisPlayAudio,
108 get_culture, open_url, play_audio, set_culture,
109};
110pub use items::{
111 CollectionViewOp, ItemValue, ItemsBinding, NoesisItems, NoesisItemsCurrent, NoesisItemsPlugin,
112 ObjectRow, ObjectSource,
113};
114pub use layout::{Margin, NoesisLayout, NoesisLayoutPlugin};
115pub use list::{
116 ListRows, ListSort, ListedIn, NoesisListAppExt, NoesisListOps, NoesisListPlugin,
117 NoesisListSelection, NoesisListSet, NoesisRowSelected, Selected, UiList,
118};
119pub use markup::{NoesisMarkupExtensionPlugin, NoesisMarkupExtensionRegistry};
120pub use noesis_bevy_derive::NoesisViewModel;
122pub use panel::{
123 NoesisPanelAppExt, NoesisPanelPlugin, NoesisPanelSet, NoesisPanelText, NoesisPanelTextChanged,
124 SealPanel, UiPanel,
125};
126pub use plain_vm::{NoesisViewModel, NoesisViewModelAppExt, PlainType, PlainValue, PlainValueRef};
127pub use render::{NoesisCamera, NoesisIntermediate, NoesisRenderPlugin, NoesisSet, NoesisView};
128pub use resources::{
129 NoesisResources, NoesisResourcesInstalled, NoesisResourcesPlugin, ResourceEntry,
130};
131pub use routed_events::{
132 EventWatchEntry, MouseButton, NoesisEventWatch, NoesisRoutedEvent, NoesisRoutedEventsPlugin,
133 RoutedEvent, RoutedEventSnapshot, SharedRoutedEventQueue, UiRoutedEvent,
134};
135pub use shapes::{NoesisShapes, NoesisShapesPlugin, ShapeKind, ShapeSpec};
136pub use styles::{
137 DataTriggerSpec, MultiTriggerSpec, NoesisStyles, NoesisStylesPlugin, PropertyTrigger, StyleSpec,
138};
139pub use svg::{NoesisSvg, NoesisSvgChanged, NoesisSvgPlugin};
140pub use text::{NoesisText, NoesisTextChanged, NoesisTextPlugin};
141pub use theme::NoesisDefaultThemePlugin;
142pub use transforms::{
143 NoesisTransform, NoesisTransformChanged, NoesisTransformPlugin, TransformSpec,
144};
145pub use transforms3d::{
146 Matrix3DSpec, NoesisMatrixTransform3DChanged, NoesisTransform3D, NoesisTransform3DChanged,
147 NoesisTransform3DPlugin, Transform3DSpec,
148};
149pub use typography::{
150 FontStretch, FontStyle, FontStyling, FontWeight, NoesisTypography, NoesisTypographyChanged,
151 NoesisTypographyPlugin, TypographyField, TypographyValue, TypographyWatch,
152};
153pub use ui::NoesisUi;
154pub use viewmodel::{
155 NoesisViewModelChanged, NoesisViewModelPlugin, NoesisVm, SharedVmChangedQueue,
156 ViewModelChangeForwarder, ViewModelDef, VmValue,
157};
158pub use visibility::{NoesisVisibility, NoesisVisibilityPlugin};
159pub use visual_state::{NoesisVisualState, NoesisVisualStatePlugin, StateRequest};
160pub use window_compat::{NoesisWindowCompatPlugin, WINDOW_CLASS};
161pub use xaml::{BevyXamlProvider, XamlAsset, XamlAssetLoader, XamlAssetPlugin, XamlRegistry};
162
163#[derive(Clone, Debug)]
165pub struct NoesisLicense {
166 pub name: String,
168 pub key: String,
170}
171
172impl NoesisLicense {
173 #[must_use]
176 pub fn from_env() -> Option<Self> {
177 let name = std::env::var("NOESIS_LICENSE_NAME").ok()?;
178 let key = std::env::var("NOESIS_LICENSE_KEY").ok()?;
179 Some(Self { name, key })
180 }
181}
182
183#[derive(Default)]
189pub struct NoesisPlugin {
190 pub license: Option<NoesisLicense>,
194}
195
196impl NoesisPlugin {
197 pub(crate) fn init_runtime(&self) {
202 if let Some(lic) = self.license.clone().or_else(NoesisLicense::from_env) {
203 noesis_runtime::set_license(&lic.name, &lic.key);
204 }
205 noesis_runtime::init();
206
207 info!("Noesis runtime version {}", noesis_runtime::version());
208 }
209
210 pub fn add_bridge_plugins(app: &mut App) {
219 app.add_plugins((
221 xaml::XamlAssetPlugin,
222 font::FontAssetPlugin,
223 image::ImageAssetPlugin,
224 input::NoesisInputPlugin,
225 integration::NoesisIntegrationPlugin,
226 ));
227 app.add_plugins((
229 events::NoesisEventsPlugin,
230 routed_events::NoesisRoutedEventsPlugin,
231 classes::NoesisClassPlugin,
232 markup::NoesisMarkupExtensionPlugin,
233 visibility::NoesisVisibilityPlugin,
234 layout::NoesisLayoutPlugin,
235 text::NoesisTextPlugin,
236 inlines::NoesisInlinesPlugin,
237 geometry::NoesisGeometryPlugin,
238 clip::NoesisClipPlugin,
239 ));
240 app.add_plugins((
242 focus::NoesisFocusPlugin,
243 visual_state::NoesisVisualStatePlugin,
244 focus_input::NoesisFocusControlPlugin,
245 viewmodel::NoesisViewModelPlugin,
246 commands::NoesisCommandsPlugin,
247 items::NoesisItemsPlugin,
248 dp::NoesisDpPlugin,
249 (
250 transforms::NoesisTransformPlugin,
251 transforms3d::NoesisTransform3DPlugin,
252 ),
253 brushes::NoesisBrushesPlugin,
254 animation::NoesisAnimationPlugin,
255 typography::NoesisTypographyPlugin,
256 binding::NoesisBindingPlugin,
257 imaging::NoesisImagingPlugin,
258 svg::NoesisSvgPlugin,
259 diagnostics::NoesisDiagnosticsPlugin::default(),
260 ));
261 app.add_plugins((
263 styles::NoesisStylesPlugin,
264 shapes::NoesisShapesPlugin,
265 resources::NoesisResourcesPlugin,
266 panel::NoesisPanelPlugin,
267 list::NoesisListPlugin,
268 ));
269 }
270}
271
272impl Plugin for NoesisPlugin {
273 fn build(&self, app: &mut App) {
274 self.init_runtime();
275
276 Self::add_bridge_plugins(app);
282
283 #[cfg(feature = "hot_reload")]
287 app.add_plugins(hot_reload::NoesisHotReloadPlugin);
288
289 app.add_plugins(render::NoesisRenderPlugin);
292 }
293}