Skip to content
Snippets Groups Projects
Commit d1c8862c authored by StarToaster's avatar StarToaster
Browse files

Added working main menu. Cleaned up unused assets.

parent 7f9372cf
No related branches found
No related tags found
No related merge requests found
Showing
with 239 additions and 8 deletions
assets/kenny/panelInset_beigeLight.png

629 B

assets/kenny/panelInset_blue.png

626 B

assets/kenny/panelInset_brown.png

626 B

assets/kenny/panel_beige.png

786 B

assets/kenny/panel_beigeLight.png

785 B

assets/kenny/panel_blue.png

785 B

assets/kenny/panel_brown.png

799 B

assets/main_menu/button-hover.png

3.37 KiB

assets/main_menu/button.png

3.39 KiB

assets/main_menu/logo.png

208 KiB

assets/main_menu/panel1.png

34.4 KiB

......@@ -34,6 +34,7 @@ The nine patch widget is a special widget designed to render a sliced UI image.
- `handle`: A bevy handle to a nine patch image asset which.
- `border`: This represents the area that is sliced into eight pieces along the edge of the image. The ninth piece is the middle which is repeated.
- KStyle
- OnEvent
- KChildren
### Text
......
......@@ -6,11 +6,11 @@ fn startup(
mut font_mapping: ResMut<FontMapping>,
asset_server: Res<AssetServer>,
) {
font_mapping.set_default(asset_server.load("roboto.kayak_font"));
font_mapping.set_default(asset_server.load("lato-light.kayak_font"));
commands.spawn(UICameraBundle::new());
let image = asset_server.load("kenny/panel_brown.png");
let image = asset_server.load("panel.png");
let mut widget_context = KayakRootContext::new();
let parent_id = None;
......
......@@ -18,7 +18,7 @@ fn startup(
<KayakAppBundle>
<KImageBundle
image={KImage(image)}
style={KStyle {
styles={KStyle {
position_type: StyleProp::Value(KPositionType::SelfDirected),
left: StyleProp::Value(Units::Pixels(10.0)),
top: StyleProp::Value(Units::Pixels(10.0)),
......
use bevy::{app::AppExit, prelude::*};
use kayak_ui::prelude::{widgets::*, *};
#[derive(Default, Clone, PartialEq, Component)]
pub struct MenuButton {
text: String,
}
impl Widget for MenuButton {}
#[derive(Bundle)]
pub struct MenuButtonBundle {
button: MenuButton,
styles: KStyle,
on_event: OnEvent,
widget_name: WidgetName,
}
impl Default for MenuButtonBundle {
fn default() -> Self {
Self {
button: Default::default(),
styles: KStyle {
bottom: Units::Pixels(20.0).into(),
cursor: KCursorIcon(CursorIcon::Hand).into(),
..Default::default()
},
on_event: OnEvent::default(),
widget_name: MenuButton::default().get_name(),
}
}
}
fn menu_button_render(
In((widget_context, entity)): In<(KayakWidgetContext, Entity)>,
mut commands: Commands,
asset_server: Res<AssetServer>,
menu_button_query: Query<&MenuButton>,
state_query: Query<&ButtonState>,
) -> bool {
let state_entity =
widget_context.use_state(&mut commands, entity, ButtonState { hovering: false });
let button_text = menu_button_query.get(entity).unwrap().text.clone();
let button_image = asset_server.load("main_menu/button.png");
let button_image_hover = asset_server.load("main_menu/button-hover.png");
let on_event = OnEvent::new(
move |In((event_dispatcher_context, _, mut event, _entity)): In<(
EventDispatcherContext,
WidgetState,
Event,
Entity,
)>,
mut query: Query<&mut ButtonState>| {
if let Ok(mut button) = query.get_mut(state_entity) {
match event.event_type {
EventType::MouseIn(..) => {
event.stop_propagation();
button.hovering = true;
}
EventType::MouseOut(..) => {
button.hovering = false;
}
_ => {}
}
}
(event_dispatcher_context, event)
},
);
if let Ok(button_state) = state_query.get(state_entity) {
let button_image_handle = if button_state.hovering {
button_image_hover
} else {
button_image
};
let parent_id = Some(entity);
rsx! {
<NinePatchBundle
nine_patch={NinePatch {
handle: button_image_handle,
border: Edge::all(10.0),
}}
styles={KStyle {
width: Units::Stretch(1.0).into(),
height: Units::Pixels(40.0).into(),
..KStyle::default()
}}
on_event={on_event}
>
<TextWidgetBundle
text={TextProps {
alignment: Alignment::Middle,
content: button_text,
size: 28.0,
user_styles: KStyle {
top: Units::Stretch(1.0).into(),
bottom: Units::Stretch(1.0).into(),
..Default::default()
},
..Default::default()
}}
/>
</NinePatchBundle>
}
}
true
}
#[derive(Default, Resource)]
pub struct PreloadResource {
images: Vec<Handle<Image>>,
}
fn startup(
mut commands: Commands,
mut font_mapping: ResMut<FontMapping>,
asset_server: Res<AssetServer>,
mut preload_resource: ResMut<PreloadResource>,
) {
font_mapping.set_default(asset_server.load("lato-light.kayak_font"));
commands.spawn(UICameraBundle::new());
let mut widget_context = KayakRootContext::new();
widget_context.add_widget_data::<MenuButton, ButtonState>();
widget_context.add_widget_system(
MenuButton::default().get_name(),
widget_update::<MenuButton, ButtonState>,
menu_button_render,
);
let panel1_image = asset_server.load("main_menu/panel1.png");
let logo_image = asset_server.load("main_menu/logo.png");
let button_image = asset_server.load("main_menu/button.png");
let button_image_hover = asset_server.load("main_menu/button-hover.png");
preload_resource.images.extend(vec![
panel1_image.clone(),
logo_image.clone(),
button_image.clone(),
button_image_hover.clone(),
]);
let handle_click_close = OnEvent::new(
move |In((event_dispatcher_context, _, event, _entity)): In<(
EventDispatcherContext,
WidgetState,
Event,
Entity,
)>,
mut exit: EventWriter<AppExit>| {
match event.event_type {
EventType::Click(..) => {
exit.send(AppExit);
}
_ => {}
}
(event_dispatcher_context, event)
},
);
let parent_id = None;
rsx! {
<KayakAppBundle>
<NinePatchBundle
nine_patch={NinePatch {
handle: panel1_image,
border: Edge::all(25.0),
}}
styles={KStyle {
width: Units::Pixels(350.0).into(),
height: Units::Pixels(512.0).into(),
left: Units::Stretch(1.0).into(),
right: Units::Stretch(1.0).into(),
top: Units::Stretch(1.0).into(),
bottom: Units::Stretch(1.0).into(),
padding: Edge::new(
Units::Pixels(20.0),
Units::Pixels(20.0),
Units::Pixels(50.0),
Units::Pixels(20.0),
).into(),
..KStyle::default()
}}
>
<KImageBundle
image={KImage(logo_image)}
styles={KStyle {
width: Units::Pixels(310.0).into(),
height: Units::Pixels(78.0).into(),
bottom: Units::Stretch(1.0).into(),
..KStyle::default()
}}
/>
<ElementBundle
id={"button_area"}
styles={KStyle {
left: Units::Pixels(50.0).into(),
right: Units::Pixels(50.0).into(),
..Default::default()
}}
>
<MenuButtonBundle button={MenuButton { text: "Play".into() }} />
<MenuButtonBundle button={MenuButton { text: "Options".into() }} />
<MenuButtonBundle
button={MenuButton { text: "Quit".into() }}
on_event={handle_click_close}
/>
</ElementBundle>
</NinePatchBundle>
</KayakAppBundle>
}
commands.insert_resource(widget_context);
}
fn main() {
App::new()
.init_resource::<PreloadResource>()
.add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest()))
.add_plugin(KayakContextPlugin)
.add_plugin(KayakWidgets)
.add_startup_system(startup)
.run()
}
......@@ -164,7 +164,7 @@ pub fn calculate_nodes(
if !needs_layout {
commands.entity(entity).remove::<DirtyNode>();
} else {
// log::info!("{:?} needs layout!", entity.id());
log::trace!("{:?} needs layout!", entity.index());
}
commands.entity(entity).insert(node);
......
......@@ -49,7 +49,7 @@ impl Widget for KButton {}
#[derive(Component, Default, Debug, Clone, PartialEq, Eq)]
pub struct ButtonState {
hovering: bool,
pub hovering: bool,
}
pub fn button_render(
......
......@@ -17,7 +17,7 @@ impl Widget for KImage {}
#[derive(Bundle)]
pub struct KImageBundle {
pub image: KImage,
pub style: KStyle,
pub styles: KStyle,
pub widget_name: WidgetName,
}
......@@ -25,7 +25,7 @@ impl Default for KImageBundle {
fn default() -> Self {
Self {
image: Default::default(),
style: Default::default(),
styles: Default::default(),
widget_name: KImage::default().get_name(),
}
}
......
......@@ -3,6 +3,7 @@ use bevy::prelude::{Bundle, Commands, Component, Entity, Handle, Image, In, Quer
use crate::{
children::KChildren,
context::WidgetName,
on_event::OnEvent,
prelude::KayakWidgetContext,
styles::{Edge, KStyle, RenderCommand, StyleProp},
widget::Widget,
......@@ -52,6 +53,7 @@ pub struct NinePatchBundle {
pub nine_patch: NinePatch,
pub styles: KStyle,
pub children: KChildren,
pub on_event: OnEvent,
pub widget_name: WidgetName,
}
......@@ -61,6 +63,7 @@ impl Default for NinePatchBundle {
nine_patch: Default::default(),
styles: Default::default(),
children: KChildren::default(),
on_event: OnEvent::default(),
widget_name: NinePatch::default().get_name(),
}
}
......@@ -76,7 +79,6 @@ pub fn nine_patch_render(
border: nine_patch.border,
handle: nine_patch.handle.clone_weak(),
});
children.process(&widget_context, Some(entity));
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment