#![warn(missing_docs)]
use bevy::prelude::*;
pub mod animation;
pub mod bake;
pub mod binding;
pub mod brushes;
pub mod classes;
pub mod clip;
pub mod commands;
pub mod diagnostics;
pub mod dp;
pub mod events;
pub mod focus;
pub mod focus_input;
pub mod font;
pub mod geometry;
pub mod headless;
pub mod image;
pub mod imaging;
pub mod inlines;
pub mod input;
pub mod integration;
pub mod items;
pub mod layout;
pub mod list;
pub mod markup;
pub mod panel;
pub mod plain_vm;
pub mod reconcile;
pub mod render;
pub mod render_device;
pub mod resources;
pub mod routed_events;
pub mod shapes;
pub mod styles;
pub mod svg;
pub mod text;
pub mod theme;
pub mod transforms;
pub mod transforms3d;
pub mod typography;
pub mod ui;
pub mod viewmodel;
pub mod visibility;
pub mod visual_state;
pub mod window_compat;
pub mod xaml;
pub use animation::{AnimationSpec, NoesisAnimation, NoesisAnimationPlugin};
pub use bake::{NoesisLabelBaker, NoesisLabelBakerPlugin};
pub use binding::{
BindingMode, ConvertArg, Converted, MultiValueConverter, NoesisBinding, NoesisBindingPlugin,
SourceSpec, ValueConverter,
};
pub use brushes::{
BrushReadback, BrushSpec, BrushTarget, GradientStop, NoesisBrushChanged, NoesisBrushes,
NoesisBrushesPlugin,
};
pub use classes::{NoesisClassPlugin, NoesisClassRegistry};
pub use clip::{NoesisClip, NoesisClipPlugin};
pub use commands::{
CommandForwarder, CommandsDef, NoesisCommandInvoked, NoesisCommands, NoesisCommandsPlugin,
SharedCommandQueue,
};
pub use diagnostics::{NoesisDiagnostics, NoesisDiagnosticsPlugin};
pub use dp::{DpKind, DpValue, DpWatch, NoesisDp, NoesisDpChanged, NoesisDpPlugin};
pub use events::{
ClickWatchEntry, Key, KeyDownWatchEntry, NoesisClickWatch, NoesisClicked, NoesisEventsPlugin,
NoesisKeyDown, NoesisKeyDownWatch, SharedClickQueue, SharedKeyDownQueue, UiClicked, UiKeyDown,
};
pub use focus::{NoesisFocus, NoesisFocusPlugin};
pub use focus_input::{
FocusMove, FocusNavigationDirection, FocusPredict, KeyBindingSpec, ModifierKeys,
NoesisFocusBindingFired, NoesisFocusControl, NoesisFocusControlPlugin, NoesisFocusPredicted,
};
pub use font::{BevyFontProvider, FontAsset, FontAssetLoader, FontAssetPlugin, FontRegistry};
pub use geometry::{NoesisGeometry, NoesisGeometryPlugin};
pub use headless::NoesisHeadlessPlugin;
pub use image::{
BevyTextureProvider, ImageAsset, ImageAssetLoader, ImageAssetPlugin, ImageRegistry,
};
pub use imaging::{
ImageBitmap, ImageReadback, NoesisImageChanged, NoesisImaging, NoesisImagingPlugin,
};
pub use inlines::{
InlineSpec, InlinesReadback, NoesisInlines, NoesisInlinesChanged, NoesisInlinesPlugin,
TextDecorations,
};
pub use input::{
NoesisInputEvent, NoesisInputPlugin, NoesisInputQueue, NoesisPointerOverUi, TargetedInput,
};
pub use integration::{
CursorType, NoesisCursorRequested, NoesisIntegrationPlugin, NoesisOpenUrl, NoesisPlayAudio,
get_culture, open_url, play_audio, set_culture,
};
pub use items::{
CollectionViewOp, ItemValue, ItemsBinding, NoesisItems, NoesisItemsCurrent, NoesisItemsPlugin,
ObjectRow, ObjectSource,
};
pub use layout::{Margin, NoesisLayout, NoesisLayoutPlugin};
pub use list::{
ListRows, ListSort, ListedIn, NoesisListAppExt, NoesisListOps, NoesisListPlugin,
NoesisListSelection, NoesisListSet, NoesisRowSelected, Selected, UiList,
};
pub use markup::{NoesisMarkupExtensionPlugin, NoesisMarkupExtensionRegistry};
pub use noesis_bevy_derive::NoesisViewModel;
pub use panel::{
NoesisPanelAppExt, NoesisPanelPlugin, NoesisPanelSet, NoesisPanelText, NoesisPanelTextChanged,
SealPanel, UiPanel,
};
pub use plain_vm::{NoesisViewModel, NoesisViewModelAppExt, PlainType, PlainValue, PlainValueRef};
pub use render::{NoesisCamera, NoesisIntermediate, NoesisRenderPlugin, NoesisSet, NoesisView};
pub use resources::{
NoesisResources, NoesisResourcesInstalled, NoesisResourcesPlugin, ResourceEntry,
};
pub use routed_events::{
EventWatchEntry, MouseButton, NoesisEventWatch, NoesisRoutedEvent, NoesisRoutedEventsPlugin,
RoutedEvent, RoutedEventSnapshot, SharedRoutedEventQueue, UiRoutedEvent,
};
pub use shapes::{NoesisShapes, NoesisShapesPlugin, ShapeKind, ShapeSpec};
pub use styles::{
DataTriggerSpec, MultiTriggerSpec, NoesisStyles, NoesisStylesPlugin, PropertyTrigger, StyleSpec,
};
pub use svg::{NoesisSvg, NoesisSvgChanged, NoesisSvgPlugin};
pub use text::{NoesisText, NoesisTextChanged, NoesisTextPlugin};
pub use theme::NoesisDefaultThemePlugin;
pub use transforms::{
NoesisTransform, NoesisTransformChanged, NoesisTransformPlugin, TransformSpec,
};
pub use transforms3d::{
Matrix3DSpec, NoesisMatrixTransform3DChanged, NoesisTransform3D, NoesisTransform3DChanged,
NoesisTransform3DPlugin, Transform3DSpec,
};
pub use typography::{
FontStretch, FontStyle, FontStyling, FontWeight, NoesisTypography, NoesisTypographyChanged,
NoesisTypographyPlugin, TypographyField, TypographyValue, TypographyWatch,
};
pub use ui::NoesisUi;
pub use viewmodel::{
NoesisViewModelChanged, NoesisViewModelPlugin, NoesisVm, SharedVmChangedQueue,
ViewModelChangeForwarder, ViewModelDef, VmValue,
};
pub use visibility::{NoesisVisibility, NoesisVisibilityPlugin};
pub use visual_state::{NoesisVisualState, NoesisVisualStatePlugin, StateRequest};
pub use window_compat::{NoesisWindowCompatPlugin, WINDOW_CLASS};
pub use xaml::{BevyXamlProvider, XamlAsset, XamlAssetLoader, XamlAssetPlugin, XamlRegistry};
#[derive(Clone, Debug)]
pub struct NoesisLicense {
pub name: String,
pub key: String,
}
impl NoesisLicense {
#[must_use]
pub fn from_env() -> Option<Self> {
let name = std::env::var("NOESIS_LICENSE_NAME").ok()?;
let key = std::env::var("NOESIS_LICENSE_KEY").ok()?;
Some(Self { name, key })
}
}
#[derive(Default)]
pub struct NoesisPlugin {
pub license: Option<NoesisLicense>,
}
impl NoesisPlugin {
pub(crate) fn init_runtime(&self) {
if let Some(lic) = self.license.clone().or_else(NoesisLicense::from_env) {
noesis_runtime::set_license(&lic.name, &lic.key);
}
noesis_runtime::init();
info!("Noesis runtime version {}", noesis_runtime::version());
}
pub fn add_bridge_plugins(app: &mut App) {
app.add_plugins((
xaml::XamlAssetPlugin,
font::FontAssetPlugin,
image::ImageAssetPlugin,
input::NoesisInputPlugin,
integration::NoesisIntegrationPlugin,
));
app.add_plugins((
events::NoesisEventsPlugin,
routed_events::NoesisRoutedEventsPlugin,
classes::NoesisClassPlugin,
markup::NoesisMarkupExtensionPlugin,
visibility::NoesisVisibilityPlugin,
layout::NoesisLayoutPlugin,
text::NoesisTextPlugin,
inlines::NoesisInlinesPlugin,
geometry::NoesisGeometryPlugin,
clip::NoesisClipPlugin,
));
app.add_plugins((
focus::NoesisFocusPlugin,
visual_state::NoesisVisualStatePlugin,
focus_input::NoesisFocusControlPlugin,
viewmodel::NoesisViewModelPlugin,
commands::NoesisCommandsPlugin,
items::NoesisItemsPlugin,
dp::NoesisDpPlugin,
(
transforms::NoesisTransformPlugin,
transforms3d::NoesisTransform3DPlugin,
),
brushes::NoesisBrushesPlugin,
animation::NoesisAnimationPlugin,
typography::NoesisTypographyPlugin,
binding::NoesisBindingPlugin,
imaging::NoesisImagingPlugin,
svg::NoesisSvgPlugin,
diagnostics::NoesisDiagnosticsPlugin::default(),
));
app.add_plugins((
styles::NoesisStylesPlugin,
shapes::NoesisShapesPlugin,
resources::NoesisResourcesPlugin,
panel::NoesisPanelPlugin,
list::NoesisListPlugin,
));
}
}
impl Plugin for NoesisPlugin {
fn build(&self, app: &mut App) {
self.init_runtime();
Self::add_bridge_plugins(app);
app.add_plugins(render::NoesisRenderPlugin);
}
}