use webcore::value::Reference;
use webcore::try_from::TryInto;
use webapi::event::{IEvent, IUiEvent, UiEvent, Event};
use webapi::touch::Touch;
pub trait ITouchEvent: IUiEvent {
#[inline]
fn alt_key( &self ) -> bool {
js!(
return @{self.as_ref()}.altKey;
).try_into().unwrap()
}
#[inline]
fn ctrl_key( &self ) -> bool {
js!(
return @{self.as_ref()}.ctrlKey;
).try_into().unwrap()
}
#[inline]
fn meta_key( &self ) -> bool {
js!(
return @{self.as_ref()}.metaKey;
).try_into().unwrap()
}
#[inline]
fn shift_key( &self ) -> bool {
js!(
return @{self.as_ref()}.shiftKey;
).try_into().unwrap()
}
#[inline]
fn touches( &self ) -> Vec<Touch> {
js!(
return Array.from( @{self.as_ref()}.touches );
).try_into().unwrap()
}
#[inline]
fn target_touches( &self ) -> Vec<Touch> {
js!(
return Array.from( @{self.as_ref()}.targetTouches );
).try_into().unwrap()
}
#[inline]
fn changed_touches( &self ) -> Vec<Touch> {
js!(
return Array.from( @{self.as_ref()}.changedTouches );
).try_into().unwrap()
}
}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(subclass_of(Event, UiEvent))]
pub struct TouchEvent( Reference );
impl IEvent for TouchEvent {}
impl IUiEvent for TouchEvent {}
impl ITouchEvent for TouchEvent {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchmove")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchMove( Reference );
impl IEvent for TouchMove {}
impl IUiEvent for TouchMove {}
impl ITouchEvent for TouchMove {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchleave")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchLeave( Reference );
impl IEvent for TouchLeave {}
impl IUiEvent for TouchLeave {}
impl ITouchEvent for TouchLeave {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchenter")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchEnter( Reference );
impl IEvent for TouchEnter {}
impl IUiEvent for TouchEnter {}
impl ITouchEvent for TouchEnter {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchend")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchEnd( Reference );
impl IEvent for TouchEnd {}
impl IUiEvent for TouchEnd {}
impl ITouchEvent for TouchEnd {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchcancel")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchCancel( Reference );
impl IEvent for TouchCancel {}
impl IUiEvent for TouchCancel {}
impl ITouchEvent for TouchCancel {}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "TouchEvent")]
#[reference(event = "touchstart")]
#[reference(subclass_of(Event, UiEvent, TouchEvent))]
pub struct TouchStart( Reference );
impl IEvent for TouchStart {}
impl IUiEvent for TouchStart {}
impl ITouchEvent for TouchStart {}
#[cfg(all(test, feature = "web_test"))]
mod tests {
use super::*;
use webapi::event::ConcreteEvent;
#[test]
fn test_touch_event() {
let event: TouchEvent = js!(
return new TouchEvent(
@{TouchMove::EVENT_TYPE},
{
touches: [],
targetTouches: [],
changedTouches: [],
ctrlKey: true,
shiftKey: true,
altKey: true,
metaKey: true
}
);
).try_into().unwrap();
assert_eq!( event.event_type(), TouchMove::EVENT_TYPE );
assert!( event.ctrl_key() );
assert!( event.alt_key() );
assert!( event.shift_key() );
assert!( event.meta_key() );
assert_eq!( event.touches(), vec![] );
assert_eq!( event.target_touches(), vec![] );
assert_eq!( event.changed_touches(), vec![] );
}
#[test]
fn test_touch_move_event() {
let event: TouchMove = js!(
return new TouchEvent( @{TouchMove::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchMove::EVENT_TYPE );
}
#[test]
fn test_touch_leave_event() {
let event: TouchLeave = js!(
return new TouchEvent( @{TouchLeave::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchLeave::EVENT_TYPE );
}
#[test]
fn test_touch_enter_event() {
let event: TouchEnter = js!(
return new TouchEvent( @{TouchEnter::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchEnter::EVENT_TYPE );
}
#[test]
fn test_touch_end_event() {
let event: TouchEnd = js!(
return new TouchEvent( @{TouchEnd::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchEnd::EVENT_TYPE );
}
#[test]
fn test_touch_cancel_event() {
let event: TouchCancel = js!(
return new TouchEvent( @{TouchCancel::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchCancel::EVENT_TYPE );
}
#[test]
fn test_touch_start_event() {
let event: TouchStart = js!(
return new TouchEvent( @{TouchStart::EVENT_TYPE} );
).try_into().unwrap();
assert_eq!( event.event_type(), TouchStart::EVENT_TYPE );
}
}