use crate::fyrox::{
core::pool::Handle,
core::{reflect::prelude::*, visitor::prelude::*},
gui::message::{MouseButton, UiMessage},
gui::widget::WidgetMessage,
gui::{UiNode, UserInterface},
};
use fyrox::gui::message::MessageData;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SelectableMessage {
Select(bool),
}
impl MessageData for SelectableMessage {}
#[derive(Default, Clone, Debug, PartialEq, Eq, Visit, Reflect)]
pub struct Selectable {
pub selected: bool,
}
impl Selectable {
#[must_use]
pub fn handle_routed_message(
&mut self,
self_handle: Handle<UiNode>,
ui: &mut UserInterface,
message: &mut UiMessage,
) -> bool {
if let Some(msg) = message.data::<WidgetMessage>() {
match msg {
WidgetMessage::MouseDown { button, .. } => {
if (*button == MouseButton::Left || *button == MouseButton::Right)
&& !self.selected
{
ui.send(self_handle, SelectableMessage::Select(true));
ui.capture_mouse(self_handle);
}
}
WidgetMessage::MouseUp { button, .. } => {
if *button == MouseButton::Left || *button == MouseButton::Right {
ui.release_mouse_capture();
}
}
_ => {}
}
} else if let Some(SelectableMessage::Select(selected)) = message.data_for(self_handle) {
if self.selected != *selected {
self.selected = *selected;
ui.send_message(message.reverse());
return true;
}
}
false
}
}