use super::{
event::{DynEvent, Event, EventResult},
event_bus::EventSender,
scope::EventScope,
};
pub struct HandlerContext<'a> {
render_requested: bool,
quit_requested: bool,
scope: Option<EventScope>,
emitted_events: Vec<DynEvent>,
sender: Option<&'a EventSender>,
}
impl<'a> HandlerContext<'a> {
#[must_use]
pub const fn new() -> Self {
Self {
render_requested: false,
quit_requested: false,
scope: None,
emitted_events: Vec::new(),
sender: None,
}
}
#[must_use]
pub const fn with_sender(mut self, sender: &'a EventSender) -> Self {
self.sender = Some(sender);
self
}
#[must_use]
pub fn with_scope(mut self, scope: Option<EventScope>) -> Self {
self.scope = scope;
self
}
#[must_use]
pub const fn scope(&self) -> Option<&EventScope> {
self.scope.as_ref()
}
pub fn emit<E: Event>(&mut self, event: E) {
let dyn_event = if let Some(ref scope) = self.scope {
scope.increment();
DynEvent::new(event).with_scope(scope.clone())
} else {
DynEvent::new(event)
};
if let Some(sender) = self.sender {
sender.send_dyn(dyn_event);
} else {
self.emitted_events.push(dyn_event);
}
}
pub fn emit_dyn(&mut self, event: DynEvent) {
if let Some(sender) = self.sender {
sender.send_dyn(event);
} else {
self.emitted_events.push(event);
}
}
pub const fn request_render(&mut self) {
self.render_requested = true;
}
pub const fn request_quit(&mut self) {
self.quit_requested = true;
}
#[must_use]
pub const fn render_requested(&self) -> bool {
self.render_requested
}
#[must_use]
pub const fn quit_requested(&self) -> bool {
self.quit_requested
}
#[must_use]
pub fn take_emitted_events(&mut self) -> Vec<DynEvent> {
std::mem::take(&mut self.emitted_events)
}
#[must_use]
pub const fn has_emitted_events(&self) -> bool {
!self.emitted_events.is_empty()
}
#[must_use]
pub const fn emitted_event_count(&self) -> usize {
self.emitted_events.len()
}
#[must_use]
pub const fn has_sender(&self) -> bool {
self.sender.is_some()
}
}
impl Default for HandlerContext<'_> {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Debug for HandlerContext<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("HandlerContext")
.field("render_requested", &self.render_requested)
.field("quit_requested", &self.quit_requested)
.field("has_scope", &self.scope.is_some())
.field("has_sender", &self.sender.is_some())
.field("emitted_events", &self.emitted_events.len())
.finish()
}
}
#[derive(Debug)]
pub struct DispatchResult {
pub result: EventResult,
pub render_requested: bool,
pub quit_requested: bool,
pub emitted_events: Vec<DynEvent>,
}
impl DispatchResult {
#[must_use]
pub fn new(result: EventResult, ctx: &mut HandlerContext<'_>) -> Self {
Self {
result,
render_requested: ctx.render_requested(),
quit_requested: ctx.quit_requested(),
emitted_events: ctx.take_emitted_events(),
}
}
#[must_use]
pub const fn not_handled() -> Self {
Self {
result: EventResult::NotHandled,
render_requested: false,
quit_requested: false,
emitted_events: Vec::new(),
}
}
}