/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::TouchEventBinding; use crate::dom::bindings::codegen::Bindings::TouchEventBinding::TouchEventMethods; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::root::{DomRoot, MutDom}; use crate::dom::bindings::str::DOMString; use crate::dom::event::{EventBubbles, EventCancelable}; use crate::dom::touchlist::TouchList; use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; use std::cell::Cell; #[dom_struct] pub struct TouchEvent { uievent: UIEvent, touches: MutDom, target_touches: MutDom, changed_touches: MutDom, alt_key: Cell, meta_key: Cell, ctrl_key: Cell, shift_key: Cell, } impl TouchEvent { fn new_inherited( touches: &TouchList, changed_touches: &TouchList, target_touches: &TouchList, ) -> TouchEvent { TouchEvent { uievent: UIEvent::new_inherited(), touches: MutDom::new(touches), target_touches: MutDom::new(target_touches), changed_touches: MutDom::new(changed_touches), ctrl_key: Cell::new(false), shift_key: Cell::new(false), alt_key: Cell::new(false), meta_key: Cell::new(false), } } pub fn new_uninitialized( window: &Window, touches: &TouchList, changed_touches: &TouchList, target_touches: &TouchList, ) -> DomRoot { reflect_dom_object( Box::new(TouchEvent::new_inherited( touches, changed_touches, target_touches, )), window, TouchEventBinding::Wrap, ) } pub fn new( window: &Window, type_: DOMString, can_bubble: EventBubbles, cancelable: EventCancelable, view: Option<&Window>, detail: i32, touches: &TouchList, changed_touches: &TouchList, target_touches: &TouchList, ctrl_key: bool, alt_key: bool, shift_key: bool, meta_key: bool, ) -> DomRoot { let ev = TouchEvent::new_uninitialized(window, touches, changed_touches, target_touches); ev.upcast::().InitUIEvent( type_, bool::from(can_bubble), bool::from(cancelable), view, detail, ); ev.ctrl_key.set(ctrl_key); ev.alt_key.set(alt_key); ev.shift_key.set(shift_key); ev.meta_key.set(meta_key); ev } } impl<'a> TouchEventMethods for &'a TouchEvent { /// fn CtrlKey(&self) -> bool { self.ctrl_key.get() } /// fn ShiftKey(&self) -> bool { self.shift_key.get() } /// fn AltKey(&self) -> bool { self.alt_key.get() } /// fn MetaKey(&self) -> bool { self.meta_key.get() } /// fn Touches(&self) -> DomRoot { self.touches.get() } /// fn TargetTouches(&self) -> DomRoot { self.target_touches.get() } /// fn ChangedTouches(&self) -> DomRoot { self.changed_touches.get() } /// fn IsTrusted(&self) -> bool { self.uievent.IsTrusted() } }