diff --git a/examples/bevy_event.rs b/examples/bevy_event.rs new file mode 100644 index 0000000000000000000000000000000000000000..1e3d721d4fbe3a62037fd267ada0255ba1844647 --- /dev/null +++ b/examples/bevy_event.rs @@ -0,0 +1,92 @@ +use bevy::{ + prelude::{App as BevyApp, AssetServer, Commands, Res, ResMut, EventWriter, EventReader}, + window::WindowDescriptor, + DefaultPlugins, +}; +use kayak_ui::bevy::{BevyContext, BevyKayakUIPlugin, FontMapping, UICameraBundle}; +use kayak_ui::core::{ + render, rsx, + styles::{Style, StyleProp, Units}, + use_state, widget, EventType, OnEvent, +}; +use kayak_ui::widgets::{App, Button, Text, Window}; + +pub struct MyEvent; + +#[widget] +fn EventWindow() { + let text_styles = Style { + bottom: StyleProp::Value(Units::Stretch(1.0)), + left: StyleProp::Value(Units::Stretch(0.1)), + right: StyleProp::Value(Units::Stretch(0.1)), + top: StyleProp::Value(Units::Stretch(1.0)), + width: StyleProp::Value(Units::Stretch(1.0)), + height: StyleProp::Value(Units::Pixels(28.0)), + ..Default::default() + }; + + let button_text_styles = Style { + left: StyleProp::Value(Units::Stretch(1.0)), + right: StyleProp::Value(Units::Stretch(1.0)), + ..Default::default() + }; + + let on_event = OnEvent::new(move |ctx, event| match event.event_type { + EventType::Click(..) => { + ctx.query_world::<EventWriter<MyEvent>, _, ()>(|mut writer| writer.send(MyEvent)); + }, + _ => {} + }); + + rsx! { + <> + <Window draggable={true} position={(50.0, 50.0)} size={(300.0, 300.0)} title={"Bevy Event Example".to_string()}> + <Button on_event={Some(on_event)}> + <Text styles={Some(button_text_styles)} line_height={Some(40.0)} size={24.0} content={"Send bevy event".to_string()}>{}</Text> + </Button> + </Window> + </> + } +} + +fn startup( + mut commands: Commands, + mut font_mapping: ResMut<FontMapping>, + asset_server: Res<AssetServer>, +) { + commands.spawn_bundle(UICameraBundle::new()); + + font_mapping.set_default(asset_server.load("roboto.kayak_font")); + + let context = BevyContext::new(|context| { + render! { + <App> + <EventWindow /> + </App> + } + }); + + commands.insert_resource(context); +} + +fn on_my_event(mut reader: EventReader<MyEvent>) { + for _ in reader.iter() { + println!("MyEvent detected"); + } +} + +fn main() { + BevyApp::new() + .insert_resource(WindowDescriptor { + width: 1270.0, + height: 720.0, + title: String::from("UI Example"), + ..Default::default() + }) + .add_plugins(DefaultPlugins) + .add_event::<MyEvent>() + .add_plugin(BevyKayakUIPlugin) + .add_startup_system(startup) + .add_system(on_my_event) + .run(); +}