#![warn(missing_docs)]
#![allow(
clippy::unit_arg,
clippy::needless_doctest_main,
clippy::too_many_arguments,
clippy::collapsible_if
)]
#[macro_use]
mod utils;
pub mod widgets;
#[allow(missing_docs)]
mod impls;
mod plugin;
mod world_inspector;
use std::hash::Hasher;
use bevy::prelude::{AppBuilder, World};
use egui::CtxRef;
pub use world_inspector::{InspectableRegistry, WorldInspectorParams, WorldInspectorPlugin};
pub mod reflect;
pub use bevy_egui;
pub use bevy_egui::egui;
pub use bevy_inspector_egui_derive::Inspectable;
pub use plugin::InspectorPlugin;
pub mod options {
pub use crate::impls::*;
pub use crate::widgets::button::ButtonAttributes;
pub use crate::widgets::new_window::WindowAttributes;
pub use crate::world_inspector::impls::EntityAttributes;
}
pub struct Context<'a> {
pub ui_ctx: Option<&'a CtxRef>,
world: Option<*mut World>,
pub id: Option<u64>,
}
impl<'a> Context<'a> {
pub unsafe fn world(&'a self) -> Option<&'a mut World> {
self.world.map(|ptr| &mut *ptr)
}
}
impl<'a> Context<'a> {
pub fn new(ui_ctx: &'a CtxRef, world: &'a mut World) -> Self {
Context {
ui_ctx: Some(ui_ctx),
world: Some(world as *mut _),
id: None,
}
}
pub unsafe fn new_ptr(ui_ctx: Option<&'a CtxRef>, world: *mut World) -> Self {
Context {
ui_ctx,
world: Some(world),
id: None,
}
}
pub fn new_shared(ui_ctx: Option<&'a CtxRef>) -> Self {
Context {
ui_ctx,
world: None,
id: None,
}
}
pub fn with_id(&self, id: u64) -> Self {
let mut hasher = std::collections::hash_map::DefaultHasher::default();
if let Some(id) = self.id {
hasher.write_u64(id);
}
hasher.write_u64(id);
let id = hasher.finish();
Context {
id: Some(id),
..*self
}
}
pub fn id(&self) -> egui::Id {
let dummy_id = egui::Id::new(42);
match self.id {
Some(id) => egui::Id::new(id),
None => dummy_id,
}
}
}
pub trait Inspectable {
type Attributes: Default + Clone;
fn ui(&mut self, ui: &mut egui::Ui, options: Self::Attributes, context: &Context) -> bool;
fn ui_raw(&mut self, ui: &mut egui::Ui, options: Self::Attributes) {
let empty_context = Context::new_shared(None);
self.ui(ui, options, &empty_context);
}
#[allow(unused_variables)]
fn setup(app: &mut AppBuilder) {}
}