use super::{HoldingRoutedEventArgs, InputElement, PointerEventArgs, PointerType};
use crate::interactivity::RoutedEventArgs;
use crate::{ferro_routed_event_args, Point, Rect, Visual, WeakRef};
use std::cell::RefCell;
use std::rc::Rc;
#[derive(Clone)]
pub struct ContextRequestedEventArgs {
base: RoutedEventArgs,
pointer_event_args: Option<PointerEventArgs>,
is_holding: bool,
placement_rect: Rc<RefCell<Option<(WeakRef<Visual>, Rect)>>>,
}
ferro_routed_event_args!(ContextRequestedEventArgs: RoutedEventArgs);
impl Default for ContextRequestedEventArgs {
fn default() -> Self {
Self::new()
}
}
impl ContextRequestedEventArgs {
pub fn new() -> Self {
Self {
base: RoutedEventArgs::with_event(InputElement::context_requested_event()),
pointer_event_args: None,
is_holding: false,
placement_rect: Rc::new(RefCell::new(None)),
}
}
pub fn from_pointer_event_args(pointer_event_args: &PointerEventArgs) -> Self {
Self { pointer_event_args: Some(pointer_event_args.clone()), ..Self::new() }
}
pub fn from_context_requested_event_args(context_requested_event_args: &ContextRequestedEventArgs) -> Self {
Self {
pointer_event_args: context_requested_event_args.pointer_event_args.clone(),
placement_rect: context_requested_event_args.placement_rect.clone(),
..Self::new()
}
}
pub(crate) fn from_holding(hold_routed_event_args: &HoldingRoutedEventArgs) -> Self {
Self {
pointer_event_args: Some(hold_routed_event_args.pointer_event_args().clone()),
is_holding: true,
..Self::new()
}
}
pub fn try_get_position(&self, relative_to: Option<&InputElement>) -> Option<Point> {
self.pointer_event_args.as_ref().map(|e| e.get_position(relative_to.map(|element| &****element)))
}
pub fn set_placement_rect(&self, relative_to: &Visual, rect: Rect) {
*self.placement_rect.borrow_mut() = Some((relative_to.to_ref().downgrade(), rect));
}
pub fn try_get_placement_rect(&self, relative_to: &Visual) -> Option<Rect> {
let (owner, rect) = self.placement_rect.borrow().clone()?;
let owner = owner.upgrade()?;
owner.transform_to_visual(relative_to).map(|transform| rect.transform_to_aabb(transform))
}
pub fn clear_placement_rect(&self) {
self.placement_rect.borrow_mut().take();
}
pub fn is_holding(&self) -> bool {
self.is_holding
}
#[allow(dead_code)]
pub fn pointer_type(&self) -> Option<PointerType> {
self.pointer_event_args.as_ref().map(|e| e.pointer().type_())
}
}