forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Extract TouchEventEmitter from ViewEventEmitter
Summary: In the future, we may want some components (like Virtual Text) to handle only touch events. Therefore, I've extracted `TouchEventEmitter` from `ViewEventEmitter`. Reviewed By: shergin Differential Revision: D9696903 fbshipit-source-id: f6acc90d8ff53b5e6badaa472a5e099fb7cf03ff
- Loading branch information
1 parent
4e841f2
commit 7c0b707
Showing
4 changed files
with
178 additions
and
143 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
#include "TouchEventEmitter.h" | ||
|
||
namespace facebook { | ||
namespace react { | ||
|
||
#pragma mark - Touches | ||
|
||
static folly::dynamic touchPayload(const Touch &touch) { | ||
folly::dynamic object = folly::dynamic::object(); | ||
object["locationX"] = touch.offsetPoint.x; | ||
object["locationY"] = touch.offsetPoint.x; | ||
object["pageX"] = touch.pagePoint.x; | ||
object["pageY"] = touch.pagePoint.x; | ||
object["screenX"] = touch.screenPoint.x; | ||
object["screenY"] = touch.screenPoint.x; | ||
object["identifier"] = touch.identifier; | ||
object["target"] = touch.target; | ||
object["timestamp"] = touch.timestamp * 1000; | ||
object["force"] = touch.force; | ||
return object; | ||
} | ||
|
||
static folly::dynamic touchesPayload(const Touches &touches) { | ||
folly::dynamic array = folly::dynamic::array(); | ||
for (const auto &touch : touches) { | ||
array.push_back(touchPayload(touch)); | ||
} | ||
return array; | ||
} | ||
|
||
static folly::dynamic touchEventPayload(const TouchEvent &event) { | ||
folly::dynamic object = folly::dynamic::object(); | ||
object["touches"] = touchesPayload(event.touches); | ||
object["changedTouches"] = touchesPayload(event.changedTouches); | ||
object["targetTouches"] = touchesPayload(event.targetTouches); | ||
return object; | ||
} | ||
|
||
void TouchEventEmitter::onTouchStart(const TouchEvent &event) const { | ||
dispatchEvent("touchStart", touchEventPayload(event), EventPriority::SynchronousUnbatched); | ||
} | ||
|
||
void TouchEventEmitter::onTouchMove(const TouchEvent &event) const { | ||
dispatchEvent("touchMove", touchEventPayload(event), EventPriority::SynchronousBatched); | ||
} | ||
|
||
void TouchEventEmitter::onTouchEnd(const TouchEvent &event) const { | ||
dispatchEvent("touchEnd", touchEventPayload(event), EventPriority::SynchronousBatched); | ||
} | ||
|
||
void TouchEventEmitter::onTouchCancel(const TouchEvent &event) const { | ||
dispatchEvent("touchCancel", touchEventPayload(event), EventPriority::SynchronousBatched); | ||
} | ||
|
||
} // namespace react | ||
} // namespace facebook |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
#pragma once | ||
|
||
#include <fabric/core/ReactPrimitives.h> | ||
#include <fabric/core/LayoutMetrics.h> | ||
#include <fabric/events/EventEmitter.h> | ||
|
||
namespace facebook { | ||
namespace react { | ||
|
||
/* | ||
* Describes an individual touch point for a touch event. | ||
* See https://www.w3.org/TR/touch-events/ for more details. | ||
*/ | ||
struct Touch { | ||
/* | ||
* The coordinate of point relative to the root component in points. | ||
*/ | ||
Point pagePoint; | ||
|
||
/* | ||
* The coordinate of point relative to the target component in points. | ||
*/ | ||
Point offsetPoint; | ||
|
||
/* | ||
* The coordinate of point relative to the screen component in points. | ||
*/ | ||
Point screenPoint; | ||
|
||
/* | ||
* An identification number for each touch point. | ||
*/ | ||
int identifier; | ||
|
||
/* | ||
* The tag of a component on which the touch point started when it was first placed on the surface, | ||
* even if the touch point has since moved outside the interactive area of that element. | ||
*/ | ||
Tag target; | ||
|
||
/* | ||
* The force of the touch. | ||
*/ | ||
Float force; | ||
|
||
/* | ||
* The time in seconds when the touch occurred or when it was last mutated. | ||
*/ | ||
Float timestamp; | ||
|
||
/* | ||
* The particular implementation of `Hasher` and (especially) `Comparator` | ||
* make sense only when `Touch` object is used as a *key* in indexed collections. | ||
* Because of that they are expressed as separate classes. | ||
*/ | ||
struct Hasher { | ||
size_t operator()(const Touch &touch) const { | ||
return std::hash<decltype(touch.identifier)>()(touch.identifier); | ||
} | ||
}; | ||
|
||
struct Comparator { | ||
bool operator()(const Touch &lhs, const Touch &rhs) const { | ||
return lhs.identifier == rhs.identifier; | ||
} | ||
}; | ||
}; | ||
|
||
using Touches = std::unordered_set<Touch, Touch::Hasher, Touch::Comparator>; | ||
|
||
/* | ||
* Defines the `touchstart`, `touchend`, `touchmove`, and `touchcancel` event types. | ||
*/ | ||
struct TouchEvent { | ||
/* | ||
* A list of Touches for every point of contact currently touching the surface. | ||
*/ | ||
Touches touches; | ||
|
||
/* | ||
* A list of Touches for every point of contact which contributed to the event. | ||
*/ | ||
Touches changedTouches; | ||
|
||
/* | ||
* A list of Touches for every point of contact that is touching the surface | ||
* and started on the element that is the target of the current event. | ||
*/ | ||
Touches targetTouches; | ||
}; | ||
|
||
class TouchEventEmitter; | ||
using SharedTouchEventEmitter = std::shared_ptr<const TouchEventEmitter>; | ||
|
||
class TouchEventEmitter: public EventEmitter { | ||
public: | ||
using EventEmitter::EventEmitter; | ||
|
||
void onTouchStart(const TouchEvent &event) const; | ||
void onTouchMove(const TouchEvent &event) const; | ||
void onTouchEnd(const TouchEvent &event) const; | ||
void onTouchCancel(const TouchEvent &event) const; | ||
}; | ||
|
||
} // namespace react | ||
} // namespace facebook |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters