use bevy::prelude::*;
use jackdaw::prelude::*;
fn main() -> AppExit {
App::new()
.set_error_handler(bevy::ecs::error::error)
.add_plugins((
DefaultPlugins,
EditorPlugins::default()
.set(ExtensionPlugin::default().with_extension::<ModalExampleExtension>()),
))
.run()
}
#[derive(Default)]
pub struct ModalExampleExtension;
impl JackdawExtension for ModalExampleExtension {
fn id(&self) -> String {
"modal_example".to_string()
}
fn label(&self) -> String {
"Modal Example".to_string()
}
fn description(&self) -> String {
"Adds modal operator that prints the entity the mouse is hovering over".to_string()
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_operator::<PrintHoveredEntityOp>()
.add_observer(update_hovered_entity)
.init_resource::<HoveredEntityModalState>();
}
}
#[operator(
id = "widget_showcase.button_operator",
label = "Print hovered entity",
description = "Prints the entity the mouse is hovering over while the modal is active.",
modal = true
)]
fn print_hovered_entity(
_: In<OperatorParameters>,
active: ActiveModalQuery,
mut state: ResMut<HoveredEntityModalState>,
names: Query<NameOrEntity>,
) -> OperatorResult {
if !active.is_modal_running() {
info!("The modal just started running!");
return OperatorResult::Running;
}
let Some(entity) = state.entity.take() else {
return OperatorResult::Running;
};
let name = names.get(entity).unwrap();
info!("Hovered entity: {name}");
OperatorResult::Running
}
#[derive(Resource, Default)]
struct HoveredEntityModalState {
entity: Option<Entity>,
}
fn update_hovered_entity(mut over: On<Pointer<Over>>, mut state: ResMut<HoveredEntityModalState>) {
over.propagate(false);
state.entity = Some(over.entity);
}