use crate::core::ElementId;
use crate::event::{Event, EventEffects, EventPhase, Propagation};
use crate::geometry::Rect;
pub const DEFAULT_DRAG_THRESHOLD: f32 = 3.0;
#[derive(Default)]
pub struct EventContext {
target_id: Option<ElementId>,
phase: EventPhase,
effects: EventEffects,
propagation: Propagation,
event: Option<Event>,
current_id: Option<ElementId>,
current_rect: Option<Rect>,
capture_request: Option<ElementId>,
drag_request: Option<(ElementId, f32)>,
}
impl EventContext {
pub fn new() -> Self {
Self {
target_id: None,
phase: EventPhase::Target,
..Default::default()
}
}
pub fn with_target(target: ElementId) -> Self {
Self {
target_id: Some(target),
phase: EventPhase::Target,
..Default::default()
}
}
pub fn with_event(target: ElementId, event: Event) -> Self {
Self {
target_id: Some(target),
phase: EventPhase::Target,
event: Some(event),
..Default::default()
}
}
pub fn phase(&self) -> EventPhase {
self.phase
}
pub fn set_phase(&mut self, phase: EventPhase) {
self.phase = phase;
}
pub fn request_rebuild(&mut self) {
self.effects.request_rebuild();
}
pub fn request_layout(&mut self) {
self.effects.request_layout();
}
pub fn request_render(&mut self) {
self.effects.request_render();
}
pub fn effects(&mut self) -> &mut EventEffects {
&mut self.effects
}
pub fn take_effects(&mut self) -> EventEffects {
std::mem::take(&mut self.effects)
}
pub fn stop_propagation(&mut self) {
self.propagation = Propagation::Stop;
}
pub fn is_stopped(&self) -> bool {
self.propagation == Propagation::Stop
}
pub fn target(&self) -> Option<ElementId> {
self.target_id
}
pub fn set_event(&mut self, event: Event) {
self.event = Some(event);
}
pub fn event(&self) -> Option<&Event> {
self.event.as_ref()
}
pub fn take_event(&mut self) -> Option<Event> {
self.event.take()
}
pub fn set_current(&mut self, id: ElementId, rect: Rect) {
self.current_id = Some(id);
self.current_rect = Some(rect);
}
pub fn current_rect(&self) -> Option<Rect> {
self.current_rect
}
pub fn capture_mouse(&mut self) {
self.capture_request = self.current_id;
}
pub fn take_capture_request(&mut self) -> Option<ElementId> {
self.capture_request.take()
}
pub fn begin_drag(&mut self) {
if let Some(id) = self.current_id {
self.drag_request = Some((id, DEFAULT_DRAG_THRESHOLD));
}
}
pub fn begin_drag_with_threshold(&mut self, px: f32) {
if let Some(id) = self.current_id {
self.drag_request = Some((id, px.max(0.0)));
}
}
pub fn take_drag_request(&mut self) -> Option<(ElementId, f32)> {
self.drag_request.take()
}
}