use crate::{
site::SiteID,
widgets::{prelude::*, Icons},
};
use bevy::{ecs::system::SystemParam, prelude::*};
use bevy_egui::egui::{Button, Ui};
use rmf_site_egui::{ShareableWidget, WidgetSystem};
use rmf_site_picking::{Hover, Select, Selection};
#[derive(SystemParam)]
pub struct SelectorWidget<'w, 's> {
pub site_id: Query<'w, 's, &'static SiteID>,
pub icons: Res<'w, Icons>,
pub selection: Res<'w, Selection>,
pub select: EventWriter<'w, Select>,
pub hover: EventWriter<'w, Hover>,
}
impl<'w, 's> WidgetSystem<Entity, ()> for SelectorWidget<'w, 's> {
fn show(entity: Entity, ui: &mut Ui, state: &mut SystemState<Self>, world: &mut World) {
let mut params = state.get_mut(world);
params.show_widget(entity, ui);
}
}
impl<'w, 's> SelectorWidget<'w, 's> {
pub fn show_widget(&mut self, entity: Entity, ui: &mut Ui) {
let site_id = self.site_id.get(entity).ok().cloned();
let is_selected = self.selection.0.is_some_and(|s| s == entity);
let text = match site_id {
Some(id) => format!("#{}", id.0),
None => "*".to_owned(),
};
let icon = if is_selected {
self.icons.selected.egui()
} else {
self.icons.select.egui()
};
let response = ui.add(Button::image_and_text(icon, text));
if response.clicked() {
self.select.write(Select::new(Some(entity)));
} else if response.hovered() {
self.hover.write(Hover(Some(entity)));
}
response.on_hover_text("Select");
}
}
impl<'w, 's> ShareableWidget for SelectorWidget<'w, 's> {}