2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "event-object-generator.h"
23 #include <actors/actor-wrapper.h>
24 #include <object/property-value-wrapper.h>
35 struct TouchDataPointState
37 PointState::Type state;
41 const TouchDataPointState TouchDataPointStateLookup[]=
43 { PointState::DOWN, "DOWN" },
44 { PointState::UP, "UP" },
45 { PointState::MOTION, "MOTION" },
46 { PointState::LEAVE, "LEAVE" },
47 { PointState::STATIONARY, "STATIONARY" },
48 { PointState::INTERRUPTED, "INTERRUPT" },
49 { PointState::STARTED, "STARTED" },
50 { PointState::FINISHED, "FINISHED" },
53 const unsigned int TouchDataPointStateLookupCount = sizeof(TouchDataPointStateLookup)/sizeof(TouchDataPointStateLookup[0]);
55 struct TouchPointState
57 TouchPoint::State state;
61 const TouchPointState PointStateLookup[]=
63 { TouchPoint::Down, "down" }, /**< Screen touched */
64 { TouchPoint::Up, "up" }, /**< Touch stopped */
65 { TouchPoint::Motion, "motion" }, /**< Touch stopped */
66 { TouchPoint::Leave, "leave" }, /**< Touch stopped */
67 { TouchPoint::Stationary, "stationary" }, /**< Touch stopped */
68 { TouchPoint::Interrupted, "interrupt" }, /**< Touch stopped */
69 { TouchPoint::Started, "started" }, /**< Touch or hover started */
70 { TouchPoint::Finished, "finished" }, /**< Touch or hover finished */
73 const unsigned int PointStateLookupCount = sizeof(PointStateLookup)/sizeof(PointStateLookup[0]);
81 const GestureState GestureStateLookup[]=
83 { Gesture::Clear, "clear" }, /**< No state associated */
84 { Gesture::Started, "started" }, /**< Gesture started */
85 { Gesture::Continuing, "continuing" }, /**< Gesture continuing */
86 { Gesture::Finished, "finished" }, /**< Gesture finished */
87 { Gesture::Cancelled, "cancelled" }, /**< Gesture cancelled */
88 { Gesture::Possible, "possible" }, /**< Gesture is possible */
91 const unsigned int GestureStateLookupCount = sizeof(GestureStateLookup)/sizeof(GestureStateLookup[0]);
93 const char* GetTouchDataPointStateName( PointState::Type state )
95 // could use the enum as index, but dali-core may change, so for now just do a lookup
96 for( unsigned int i = 0; i < TouchDataPointStateLookupCount; i++ )
98 if( TouchDataPointStateLookup[i].state == state )
100 return TouchDataPointStateLookup[i].name;
103 return "error point state not found";
106 const char* GetTouchPointStateName( TouchPoint::State state )
108 // could use the enum as index, but dali-core may change, so for now just do a lookup
109 for( unsigned int i = 0; i < PointStateLookupCount; i++ )
111 if( PointStateLookup[i].state == state )
113 return PointStateLookup[i].name;
116 return "error point state not found";
119 const char* GetGestureStateName( Gesture::State state )
121 // could use the enum as index, but dali-core may change, so for now just do a lookup
122 for( unsigned int i = 0; i < GestureStateLookupCount; i++ )
124 if( GestureStateLookup[i].state == state )
126 return GestureStateLookup[i].name;
129 return "error gesture state not found";
132 // create a point object, x,y
133 v8::Local<v8::Object> CreateTouchPoint( v8::Isolate* isolate, const TouchPoint& touchPoint )
138 * { "deviceId", int } Each touch point has a unique device ID
139 * { "state", string } touch state ="Down,Up,Motion,Leave,Stationary, Interrupted }
140 * { "hitActor", actor } actor that was hit ( wrapped dali object)
141 * { "local", {x,y} } co-ordinates of top left of hit actor
142 * { "screen", {x,y} } co-ordinates of top left of hit actor
144 v8::EscapableHandleScope handleScope( isolate );
146 v8::Local<v8::Object> pointObject = v8::Object::New( isolate );
149 pointObject->Set( v8::String::NewFromUtf8( isolate, "deviceId"), v8::Integer::New( isolate, touchPoint.deviceId ));
152 pointObject->Set( v8::String::NewFromUtf8( isolate, "state"), v8::String::NewFromUtf8( isolate, GetTouchPointStateName(touchPoint.state)));
154 if(touchPoint.hitActor)
157 pointObject->Set( v8::String::NewFromUtf8( isolate, "hitActor"), ActorWrapper::WrapActor(isolate, touchPoint.hitActor ));
160 // Think about changing these Vector 2 from wrapped objects to JavaScript objects...
162 // Set the local co-ordinates
163 v8::Local<v8::Object> localPointObject = v8::Object::New( isolate );
164 localPointObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Integer::New( isolate, touchPoint.local.x) );
165 localPointObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Integer::New( isolate, touchPoint.local.y) );
166 pointObject->Set( v8::String::NewFromUtf8( isolate, "local"), localPointObject);
169 // set the screen co-ordinates
170 v8::Local<v8::Object> screenPointObject = v8::Object::New( isolate );
171 screenPointObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Integer::New( isolate, touchPoint.screen.x) );
172 screenPointObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Integer::New( isolate, touchPoint.screen.y) );
173 pointObject->Set( v8::String::NewFromUtf8( isolate, "screen"), screenPointObject );
176 return handleScope.Escape( pointObject );
179 } // un-named namespace
182 v8::Handle<v8::Object> EventObjectGenerator::CreateTouchData( v8::Isolate* isolate, const TouchData& touch )
184 // we are creating a touch event object that looks like this
186 // event.pointCount = points touched
187 // event.time = The time (in ms) that the touch event occurred.
188 // event.point[] = array of Points
191 // { "deviceId", int } Each touch point has a unique device ID
192 // { "state", string } touch state ="Down,Up,Motion,Leave,Stationary, Interrupted }
193 // { "sourceActor", actor } the actor that is emitting the callback (the actor that is hit maybe a child of it)
194 // { "hitActor", actor } actor that was hit
195 // { "local", {x,y} } co-ordinates of top left of hit actor
196 // { "screen", {x,y} } co-ordinates of top left of hit actor
197 // { "radius", float } radius of the press point (average of both the horizontal & vertical radii)
198 // { "ellipseRadius", {x,y} } both the horizontal and the vertical radii of the press point
199 // { "pressure", float } the touch pressure
200 // { "angle", float } angle of the press point relative to the Y-Axis
203 v8::EscapableHandleScope handleScope( isolate );
205 v8::Local<v8::Object> touchObject = v8::Object::New( isolate );
207 // Set the pointCount
208 touchObject->Set( v8::String::NewFromUtf8( isolate, "pointCount" ), v8::Integer::New( isolate, touch.GetPointCount() ) );
211 touchObject->Set( v8::String::NewFromUtf8( isolate, "time" ), v8::Number::New( isolate, touch.GetTime() ) );
213 // Set the emitting actor
214 // touchObject->Set( v8::String::NewFromUtf8( isolate, "sourceActor" ), ActorWrapper::WrapActor(isolate, emittingActor));
216 // Create the array of touch points
217 v8::Local < v8::Array > pointArrayObject = v8::Array::New( isolate, touch.GetPointCount() );
218 for( unsigned int i = 0 ; i < touch.GetPointCount() ; ++i )
220 v8::Local<v8::Object> pointObject = v8::Object::New( isolate );
223 pointObject->Set( v8::String::NewFromUtf8( isolate, "deviceId" ), v8::Integer::New( isolate, touch.GetDeviceId( i ) ) );
226 pointObject->Set( v8::String::NewFromUtf8( isolate, "state" ), v8::String::NewFromUtf8( isolate, GetTouchDataPointStateName( touch.GetState( i ) ) ) );
228 Actor hitActor = touch.GetHitActor( i );
232 pointObject->Set( v8::String::NewFromUtf8( isolate, "hitActor" ), ActorWrapper::WrapActor( isolate, hitActor ) );
235 // set the local co-ordinates
236 const Vector2& local = touch.GetLocalPosition( i );
237 v8::Local<v8::Object> localPointObject = v8::Object::New( isolate );
238 localPointObject->Set( v8::String::NewFromUtf8( isolate, "x" ), v8::Integer::New( isolate, local.x ) );
239 localPointObject->Set( v8::String::NewFromUtf8( isolate, "y" ), v8::Integer::New( isolate, local.y ) );
240 pointObject->Set( v8::String::NewFromUtf8( isolate, "local" ), localPointObject );
242 // set the screen co-ordinates
243 const Vector2& screen = touch.GetScreenPosition( i );
244 v8::Local<v8::Object> screenPointObject = v8::Object::New( isolate );
245 screenPointObject->Set( v8::String::NewFromUtf8( isolate, "x" ), v8::Integer::New( isolate, screen.x ) );
246 screenPointObject->Set( v8::String::NewFromUtf8( isolate, "y" ), v8::Integer::New( isolate, screen.y ) );
247 pointObject->Set( v8::String::NewFromUtf8( isolate, "screen" ), screenPointObject );
250 pointObject->Set( v8::String::NewFromUtf8( isolate, "radius" ), v8::Integer::New( isolate, touch.GetRadius( i ) ) );
252 // set the ellipse Radius
253 const Vector2& ellipse = touch.GetEllipseRadius( i );
254 v8::Local<v8::Object> ellipseObject = v8::Object::New( isolate );
255 ellipseObject->Set( v8::String::NewFromUtf8( isolate, "x" ), v8::Integer::New( isolate, ellipse.x ) );
256 ellipseObject->Set( v8::String::NewFromUtf8( isolate, "y" ), v8::Integer::New( isolate, ellipse.y ) );
257 pointObject->Set( v8::String::NewFromUtf8( isolate, "ellipseRadius" ), ellipseObject );
260 pointObject->Set( v8::String::NewFromUtf8( isolate, "pressure" ), v8::Integer::New( isolate, touch.GetPressure( i ) ) );
263 pointObject->Set( v8::String::NewFromUtf8( isolate, "angle" ), v8::Integer::New( isolate, touch.GetAngle( i ).degree ) );
266 pointArrayObject->Set( v8::Number::New( isolate, i ), pointObject );
270 touchObject->Set( v8::String::NewFromUtf8( isolate, "points" ), pointArrayObject );
272 return handleScope.Escape( touchObject );
275 v8::Handle<v8::Object> EventObjectGenerator::CreateHoverEvent( v8::Isolate* isolate, const HoverEvent& hoverEvent)
277 // we are creating a hover event object that looks like this
279 // event.pointCount = points hovered
280 // event.time = The time (in ms) that the hover event occurred.
281 // event.point[] = array of TouchPoints
284 // { "deviceId", int } Each touch point has a unique device ID
285 // { "state", string } touch state ="Down,Up,Motion,Leave,Stationary, Interrupted }
286 // { "sourceActor", actor } the actor that is emitting the callback (the actor that is hit maybe a child of it)
287 // { "hitActor", actor } actor that was hit
288 // { "local", {x,y} } co-ordinates of top left of hit actor
289 // { "screen", {x,y} } co-ordinates of top left of hit actor
292 v8::EscapableHandleScope handleScope( isolate );
294 v8::Local<v8::Object> hoverObject = v8::Object::New( isolate );
296 // Set the pointCount
297 hoverObject->Set( v8::String::NewFromUtf8( isolate, "pointCount" ), v8::Integer::New( isolate, hoverEvent.GetPointCount() ) );
300 hoverObject->Set( v8::String::NewFromUtf8( isolate, "time" ), v8::Number::New( isolate, hoverEvent.time ) );
302 // Set the emitting actor
303 // hoverObject->Set( v8::String::NewFromUtf8( isolate, "sourceActor" ), ActorWrapper::WrapActor(isolate, emittingActor));
305 // Create the array of touch points
306 v8::Local < v8::Array > pointArrayObject = v8::Array::New( isolate, hoverEvent.GetPointCount() );
307 for( unsigned int i = 0 ; i < hoverEvent.GetPointCount() ; ++i )
309 v8::Local < v8::Object > pointObject = CreateTouchPoint( isolate, hoverEvent.points[i] );
310 pointArrayObject->Set( v8::Number::New( isolate, i ), pointObject );
314 hoverObject->Set( v8::String::NewFromUtf8( isolate, "points" ), pointArrayObject );
316 return handleScope.Escape( hoverObject );
319 v8::Handle<v8::Object> EventObjectGenerator::CreateWheelEvent( v8::Isolate* isolate, const WheelEvent& wheelEvent)
321 // we are creating a wheel event object that looks like this
323 // event.type = "mouseWheel" or "customWheel" type of the wheel event
324 // event.direction = "vertical" or "horizontal" direction the wheel is being rolled
325 // event.shiftPressed = boolean, shift key is held
326 // event.ctrlPressed = boolean, ctrl key is held
327 // event.altPressed = boolean, alt key is held
328 // event.keyModifiers = bitmask of keys pressed
329 // event.point {x,y} = The co-ordinates of the mouse cursor relative to the top-left of the screen when the wheel is being rolled.
330 // event.rolled = offset of wheel rolling, positive = rolling down or clockwise, negative = rolling up or counter-clockwise
331 // event.timestamp = The time (in ms) that the touch event occurred
333 v8::EscapableHandleScope handleScope( isolate );
335 v8::Local<v8::Object> wheelObject = v8::Object::New( isolate );
338 std::string type = wheelEvent.type ? "mouseWheel" : "customWheel";
339 wheelObject->Set( v8::String::NewFromUtf8( isolate, "type" ), v8::String::NewFromUtf8( isolate, type.c_str() ) );
342 std::string direction = wheelEvent.direction ? "vertical" : "horizontal";
343 wheelObject->Set( v8::String::NewFromUtf8( isolate, "direction" ), v8::String::NewFromUtf8( isolate, direction.c_str() ) );
345 // set shift / ctrl/ alt keys
346 wheelObject->Set( v8::String::NewFromUtf8( isolate, "shiftPressed" ), v8::Boolean::New( isolate, wheelEvent.IsShiftModifier()) );
347 wheelObject->Set( v8::String::NewFromUtf8( isolate, "ctrlPressed" ), v8::Boolean::New( isolate, wheelEvent.IsCtrlModifier()) );
348 wheelObject->Set( v8::String::NewFromUtf8( isolate, "altPressed" ), v8::Boolean::New( isolate, wheelEvent.IsAltModifier()) );
351 wheelObject->Set( v8::String::NewFromUtf8( isolate, "keyModifiers" ), v8::Integer::New( isolate, wheelEvent.modifiers) );
354 v8::Local<v8::Object> wheelPointObject = v8::Object::New( isolate );
355 wheelPointObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Integer::New( isolate, wheelEvent.point.x ) );
356 wheelPointObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Integer::New( isolate, wheelEvent.point.y ) );
357 wheelObject->Set( v8::String::NewFromUtf8( isolate, "point"), wheelPointObject );
360 wheelObject->Set( v8::String::NewFromUtf8( isolate, "rolled" ), v8::Integer::New( isolate, wheelEvent.z) );
363 wheelObject->Set( v8::String::NewFromUtf8( isolate, "timestamp" ), v8::Integer::New( isolate, wheelEvent.timeStamp) );
365 return handleScope.Escape( wheelObject );
369 v8::Handle<v8::Object> EventObjectGenerator::CreateKeyEvent( v8::Isolate* isolate, const KeyEvent& keyEvent)
373 // event.keyCode = key code
374 // event.key = key presssed
375 // event.keyDescription = key description, e.g. BackSpace
376 // event.state = "down" or "up" key state
377 // event.shiftPressed = boolean, shift key is held
378 // event.ctrlPressed = boolean, ctrl key is held
379 // event.altPressed = boolean, alt key is held
380 // event.keyModifiers = key modifiers
381 // event.timestamp = Time stamp
383 v8::EscapableHandleScope handleScope( isolate );
385 v8::Local<v8::Object> keyObject = v8::Object::New( isolate );
388 std::string state ("up");
389 if ( keyEvent.state == KeyEvent::Down)
394 keyObject->Set( v8::String::NewFromUtf8( isolate, "state" ), v8::String::NewFromUtf8( isolate, state.c_str() ) );
397 keyObject->Set( v8::String::NewFromUtf8( isolate, "keyCode" ), v8::Integer::New( isolate, keyEvent.keyCode) );
400 keyObject->Set( v8::String::NewFromUtf8( isolate, "keyModifier" ), v8::Integer::New( isolate, keyEvent.keyModifier) );
402 // set Key pressed name
403 keyObject->Set( v8::String::NewFromUtf8( isolate, "keyDescription" ), v8::String::NewFromUtf8( isolate, keyEvent.keyPressedName.c_str() ) );
406 keyObject->Set( v8::String::NewFromUtf8( isolate, "key" ), v8::String::NewFromUtf8( isolate, keyEvent.keyPressed.c_str() ) );
409 keyObject->Set( v8::String::NewFromUtf8( isolate, "timestamp" ), v8::Integer::New( isolate, keyEvent.time) );
411 // set shift / ctrl/ alt keys
412 keyObject->Set( v8::String::NewFromUtf8( isolate, "shiftPressed" ), v8::Boolean::New( isolate, keyEvent.IsShiftModifier()) );
413 keyObject->Set( v8::String::NewFromUtf8( isolate, "ctrlPressed" ), v8::Boolean::New( isolate, keyEvent.IsCtrlModifier()) );
414 keyObject->Set( v8::String::NewFromUtf8( isolate, "altPressed" ), v8::Boolean::New( isolate, keyEvent.IsAltModifier()) );
416 return handleScope.Escape( keyObject );
420 v8::Handle<v8::Object> EventObjectGenerator::CreatePanGesture( v8::Isolate* isolate, const PanGesture& panGesture)
422 // gesture.numberOfTouches = total number of fingers touching the screen
423 // gesture.state = pan state {Clear, Started, Continuing, Finished, Cancelled, Possible}
424 // gesture.time = Time stamp
425 // gesture.velocity = pan velocity in actor coordinates
426 // gesture.displacement = pan displacement in actor coordinates
427 // gesture.position = pan position in actor coordinates
428 // gesture.screenVelocity = pan velocity in screen coordinates
429 // gesture.screenDisplacement = pan displacement in screen coordinates
430 // gesture.screenPosition = pan position in screen coordinates
432 v8::EscapableHandleScope handleScope( isolate );
434 v8::Local<v8::Object> panObject = v8::Object::New( isolate );
436 // Set the numberOfTouches
437 panObject->Set( v8::String::NewFromUtf8( isolate, "numberOfTouches" ), v8::Integer::New( isolate, panGesture.numberOfTouches ) );
440 panObject->Set( v8::String::NewFromUtf8( isolate, "state"), v8::String::NewFromUtf8( isolate, GetGestureStateName(panGesture.state)));
443 panObject->Set( v8::String::NewFromUtf8( isolate, "time" ), v8::Number::New( isolate, panGesture.time ) );
445 // Set the local velocity
446 v8::Local<v8::Object> velocityObject = v8::Object::New( isolate );
447 velocityObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.velocity.x) );
448 velocityObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.velocity.y) );
449 panObject->Set( v8::String::NewFromUtf8( isolate, "velocity"), velocityObject);
451 // Set the local displacement
452 v8::Local<v8::Object> displacementObject = v8::Object::New( isolate );
453 displacementObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.displacement.x) );
454 displacementObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.displacement.y) );
455 panObject->Set( v8::String::NewFromUtf8( isolate, "displacement"), displacementObject);
457 // Set the local position
458 v8::Local<v8::Object> positionObject = v8::Object::New( isolate );
459 positionObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.position.x) );
460 positionObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.position.y) );
461 panObject->Set( v8::String::NewFromUtf8( isolate, "position"), positionObject);
463 // Set the screen velocity
464 v8::Local<v8::Object> screenVelocityObject = v8::Object::New( isolate );
465 screenVelocityObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.screenVelocity.x) );
466 screenVelocityObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.screenVelocity.y) );
467 panObject->Set( v8::String::NewFromUtf8( isolate, "screenVelocity"), screenVelocityObject);
469 // Set the screen displacement
470 v8::Local<v8::Object> screenDisplacementObject = v8::Object::New( isolate );
471 screenDisplacementObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.screenDisplacement.x) );
472 screenDisplacementObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.screenDisplacement.y) );
473 panObject->Set( v8::String::NewFromUtf8( isolate, "screenDisplacement"), screenDisplacementObject);
475 // Set the screen position
476 v8::Local<v8::Object> screenPositionObject = v8::Object::New( isolate );
477 screenPositionObject->Set( v8::String::NewFromUtf8( isolate, "x"),v8::Number::New( isolate, panGesture.screenPosition.x) );
478 screenPositionObject->Set( v8::String::NewFromUtf8( isolate, "y"),v8::Number::New( isolate, panGesture.screenPosition.y) );
479 panObject->Set( v8::String::NewFromUtf8( isolate, "screenPosition"), screenPositionObject);
481 return handleScope.Escape( panObject );