use bevy::prelude::*;
use bevy_quickmenu::{
style::Stylesheet, ActionTrait, Menu, MenuIcon, MenuItem, MenuState, QuickMenuPlugin,
ScreenTrait,
};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(BasicPlugin)
.run();
}
#[derive(Debug, Event)]
enum BasicEvent {
Close,
}
#[derive(Debug, Clone, Default)]
struct BasicState {
boolean1: bool,
boolean2: bool,
}
pub struct BasicPlugin;
impl Plugin for BasicPlugin {
fn build(&self, app: &mut App) {
app
.add_event::<BasicEvent>()
.add_plugins(QuickMenuPlugin::<Screens>::new())
.add_systems(Startup, setup)
.add_systems(Update, event_reader);
}
}
fn setup(mut commands: Commands) {
commands.spawn(Camera3dBundle::default());
let sheet = Stylesheet::default();
commands.insert_resource(MenuState::new(
BasicState::default(),
Screens::Root,
Some(sheet),
))
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
enum Actions {
Close,
Toggle1,
Toggle2,
}
impl ActionTrait for Actions {
type State = BasicState;
type Event = BasicEvent;
fn handle(&self, state: &mut BasicState, event_writer: &mut EventWriter<BasicEvent>) {
match self {
Actions::Close => event_writer.send(BasicEvent::Close),
Actions::Toggle1 => state.boolean1 = !state.boolean1,
Actions::Toggle2 => state.boolean2 = !state.boolean2,
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
enum Screens {
Root,
Booleans,
}
impl ScreenTrait for Screens {
type Action = Actions;
type State = BasicState;
fn resolve(&self, state: &BasicState) -> Menu<Screens> {
match self {
Screens::Root => root_menu(state),
Screens::Booleans => boolean_menu(state),
}
}
}
fn root_menu(_state: &BasicState) -> Menu<Screens> {
Menu::new(
"root",
vec![
MenuItem::headline("Basic Example"),
MenuItem::action("Close", Actions::Close).with_icon(MenuIcon::Back),
MenuItem::label("A submenu"),
MenuItem::screen("Boolean", Screens::Booleans),
],
)
}
fn boolean_menu(state: &BasicState) -> Menu<Screens> {
Menu::new(
"boolean",
vec![
MenuItem::label("Toggles some booleans"),
MenuItem::action("Toggle Boolean 1", Actions::Toggle1).checked(state.boolean1),
MenuItem::action("Toggle Boolean 2", Actions::Toggle2).checked(state.boolean2),
],
)
}
fn event_reader(mut commands: Commands, mut event_reader: EventReader<BasicEvent>) {
for event in event_reader.iter() {
match event {
BasicEvent::Close => bevy_quickmenu::cleanup(&mut commands),
}
}
}