/* 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 https://mozilla.org/MPL/2.0/. */ use std::cell::Cell; use dom_struct::dom_struct; 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 crate::script_runtime::CanGc; #[dom_struct] pub(crate) 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(crate) fn new_uninitialized( window: &Window, touches: &TouchList, changed_touches: &TouchList, target_touches: &TouchList, can_gc: CanGc, ) -> DomRoot { reflect_dom_object( Box::new(TouchEvent::new_inherited( touches, changed_touches, target_touches, )), window, can_gc, ) } #[allow(clippy::too_many_arguments)] pub(crate) 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, can_gc: CanGc, ) -> DomRoot { let ev = TouchEvent::new_uninitialized(window, touches, changed_touches, target_touches, can_gc); 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 TouchEventMethods for 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() } }