@hatiolab/things-scene 9.0.0-beta.35 → 9.0.0-beta.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babel.config.js +4 -3
- package/db.sqlite +0 -0
- package/dist/animation/animate.js +63 -0
- package/dist/animation/animate.js.map +1 -0
- package/dist/animation/animations/animation.js +122 -0
- package/dist/animation/animations/animation.js.map +1 -0
- package/dist/animation/animations/fade.js +28 -0
- package/dist/animation/animations/fade.js.map +1 -0
- package/dist/animation/animations/heartbeat.js +28 -0
- package/dist/animation/animations/heartbeat.js.map +1 -0
- package/dist/animation/animations/moving.js +24 -0
- package/dist/animation/animations/moving.js.map +1 -0
- package/dist/animation/animations/outline.js +47 -0
- package/dist/animation/animations/outline.js.map +1 -0
- package/dist/animation/animations/rotation.js +22 -0
- package/dist/animation/animations/rotation.js.map +1 -0
- package/dist/animation/animations/vibration.js +31 -0
- package/dist/animation/animations/vibration.js.map +1 -0
- package/dist/animation/compile.js +31 -0
- package/dist/animation/compile.js.map +1 -0
- package/dist/animation/delta.js +51 -0
- package/dist/animation/delta.js.map +1 -0
- package/dist/animation/index.js +14 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/command/command-change.js +33 -0
- package/dist/command/command-change.js.map +1 -0
- package/dist/command/command-migrate.js +103 -0
- package/dist/command/command-migrate.js.map +1 -0
- package/dist/command/command.js +18 -0
- package/dist/command/command.js.map +1 -0
- package/dist/command/snapshot-commander.js +84 -0
- package/dist/command/snapshot-commander.js.map +1 -0
- package/dist/components/anchor/anchor.js +105 -0
- package/dist/components/anchor/anchor.js.map +1 -0
- package/dist/components/anchor/ellipse-anchors.js +53 -0
- package/dist/components/anchor/ellipse-anchors.js.map +1 -0
- package/dist/components/anchor/rect-anchors.js +53 -0
- package/dist/components/anchor/rect-anchors.js.map +1 -0
- package/dist/components/audio.js +154 -0
- package/dist/components/audio.js.map +1 -0
- package/dist/components/cloud.js +44 -0
- package/dist/components/cloud.js.map +1 -0
- package/dist/components/component.js +1086 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/container-abstract.js +387 -0
- package/dist/components/container-abstract.js.map +1 -0
- package/dist/components/container.js +331 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/data/data-mapping.js +82 -0
- package/dist/components/data/data-mapping.js.map +1 -0
- package/dist/components/data/data.js +166 -0
- package/dist/components/data/data.js.map +1 -0
- package/dist/components/data/evaluator.js +103 -0
- package/dist/components/data/evaluator.js.map +1 -0
- package/dist/components/donut.js +104 -0
- package/dist/components/donut.js.map +1 -0
- package/dist/components/drawer/draw-image-pendable.js +20 -0
- package/dist/components/drawer/draw-image-pendable.js.map +1 -0
- package/dist/components/drawer/effect.js +19 -0
- package/dist/components/drawer/effect.js.map +1 -0
- package/dist/components/drawer/fill.js +228 -0
- package/dist/components/drawer/fill.js.map +1 -0
- package/dist/components/drawer/format.js +115 -0
- package/dist/components/drawer/format.js.map +1 -0
- package/dist/components/drawer/line.js +191 -0
- package/dist/components/drawer/line.js.map +1 -0
- package/dist/components/drawer/stroke.js +62 -0
- package/dist/components/drawer/stroke.js.map +1 -0
- package/dist/components/drawer/text-wrapper.js +51 -0
- package/dist/components/drawer/text-wrapper.js.map +1 -0
- package/dist/components/drawer/text.js +269 -0
- package/dist/components/drawer/text.js.map +1 -0
- package/dist/components/ellipse.js +110 -0
- package/dist/components/ellipse.js.map +1 -0
- package/dist/components/file/ondropfile.js +19 -0
- package/dist/components/file/ondropfile.js.map +1 -0
- package/dist/components/fit/fit.js +137 -0
- package/dist/components/fit/fit.js.map +1 -0
- package/dist/components/geometry/transcoord.js +339 -0
- package/dist/components/geometry/transcoord.js.map +1 -0
- package/dist/components/geometry/union.js +35 -0
- package/dist/components/geometry/union.js.map +1 -0
- package/dist/components/gif-view.js +128 -0
- package/dist/components/gif-view.js.map +1 -0
- package/dist/components/global-ref.js +154 -0
- package/dist/components/global-ref.js.map +1 -0
- package/dist/components/group.js +171 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/html/elements.js +24 -0
- package/dist/components/html/elements.js.map +1 -0
- package/dist/components/html/fill.js +126 -0
- package/dist/components/html/fill.js.map +1 -0
- package/dist/components/html/reposition.js +119 -0
- package/dist/components/html/reposition.js.map +1 -0
- package/dist/components/html/shadow.js +24 -0
- package/dist/components/html/shadow.js.map +1 -0
- package/dist/components/html-overlay-container.js +27 -0
- package/dist/components/html-overlay-container.js.map +1 -0
- package/dist/components/html-overlay-element.js +22 -0
- package/dist/components/html-overlay-element.js.map +1 -0
- package/dist/components/image-view.js +193 -0
- package/dist/components/image-view.js.map +1 -0
- package/dist/components/index.js +231 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/info-window.js +416 -0
- package/dist/components/info-window.js.map +1 -0
- package/dist/components/line.js +374 -0
- package/dist/components/line.js.map +1 -0
- package/dist/components/local-ref.js +114 -0
- package/dist/components/local-ref.js.map +1 -0
- package/dist/components/mixins/connectable.js +128 -0
- package/dist/components/mixins/connectable.js.map +1 -0
- package/dist/components/mixins/data-source.js +34 -0
- package/dist/components/mixins/data-source.js.map +1 -0
- package/dist/components/mixins/html-element.js +107 -0
- package/dist/components/mixins/html-element.js.map +1 -0
- package/dist/components/mixins/move-handle.js +73 -0
- package/dist/components/mixins/move-handle.js.map +1 -0
- package/dist/components/mixins/rect-path.js +113 -0
- package/dist/components/mixins/rect-path.js.map +1 -0
- package/dist/components/mixins/value-holder.js +81 -0
- package/dist/components/mixins/value-holder.js.map +1 -0
- package/dist/components/mutater/bounds.js +68 -0
- package/dist/components/mutater/bounds.js.map +1 -0
- package/dist/components/mutater/path.js +73 -0
- package/dist/components/mutater/path.js.map +1 -0
- package/dist/components/ortholine.js +763 -0
- package/dist/components/ortholine.js.map +1 -0
- package/dist/components/outline/ellipse-outline.js +23 -0
- package/dist/components/outline/ellipse-outline.js.map +1 -0
- package/dist/components/outline/path-outline.js +48 -0
- package/dist/components/outline/path-outline.js.map +1 -0
- package/dist/components/path.js +49 -0
- package/dist/components/path.js.map +1 -0
- package/dist/components/polygon.js +91 -0
- package/dist/components/polygon.js.map +1 -0
- package/dist/components/polyline.js +114 -0
- package/dist/components/polyline.js.map +1 -0
- package/dist/components/popup.js +160 -0
- package/dist/components/popup.js.map +1 -0
- package/dist/components/rect.js +72 -0
- package/dist/components/rect.js.map +1 -0
- package/dist/components/retention/retention-manager.js +81 -0
- package/dist/components/retention/retention-manager.js.map +1 -0
- package/dist/components/root-container.js +519 -0
- package/dist/components/root-container.js.map +1 -0
- package/dist/components/ruler.js +103 -0
- package/dist/components/ruler.js.map +1 -0
- package/dist/components/shape.js +97 -0
- package/dist/components/shape.js.map +1 -0
- package/dist/components/star.js +103 -0
- package/dist/components/star.js.map +1 -0
- package/dist/components/text/substitutor.js +92 -0
- package/dist/components/text/substitutor.js.map +1 -0
- package/dist/components/text.js +21 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/triangle.js +92 -0
- package/dist/components/triangle.js.map +1 -0
- package/dist/const.js +71 -0
- package/dist/const.js.map +1 -0
- package/dist/core/collection.js +28 -0
- package/dist/core/collection.js.map +1 -0
- package/dist/core/debug.js +12 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/deep-equals.js +112 -0
- package/dist/core/deep-equals.js.map +1 -0
- package/dist/core/dom-to-image.js +617 -0
- package/dist/core/dom-to-image.js.map +1 -0
- package/dist/core/event.js +205 -0
- package/dist/core/event.js.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/list.js +87 -0
- package/dist/core/list.js.map +1 -0
- package/dist/core/logger.js +29 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/memoize.js +40 -0
- package/dist/core/memoize.js.map +1 -0
- package/dist/core/mixin.js +26 -0
- package/dist/core/mixin.js.map +1 -0
- package/dist/core/obj-accessor.js +26 -0
- package/dist/core/obj-accessor.js.map +1 -0
- package/dist/core/reference-map.js +147 -0
- package/dist/core/reference-map.js.map +1 -0
- package/dist/core/round-rect.js +62 -0
- package/dist/core/round-rect.js.map +1 -0
- package/dist/core/safe-round.js +10 -0
- package/dist/core/safe-round.js.map +1 -0
- package/dist/core/script-loader.js +148 -0
- package/dist/core/script-loader.js.map +1 -0
- package/dist/core/snapshot-taker.js +59 -0
- package/dist/core/snapshot-taker.js.map +1 -0
- package/dist/core/stack.js +18 -0
- package/dist/core/stack.js.map +1 -0
- package/dist/core/timecapsule.js +88 -0
- package/dist/core/timecapsule.js.map +1 -0
- package/dist/core/utils.js +309 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/decorator/anchors-decorator.js +53 -0
- package/dist/decorator/anchors-decorator.js.map +1 -0
- package/dist/decorator/bouncing-arrow-decorator.js +52 -0
- package/dist/decorator/bouncing-arrow-decorator.js.map +1 -0
- package/dist/decorator/data-spread-decorator.js +69 -0
- package/dist/decorator/data-spread-decorator.js.map +1 -0
- package/dist/decorator/decotag-decorator.js +33 -0
- package/dist/decorator/decotag-decorator.js.map +1 -0
- package/dist/decorator/index.js +31 -0
- package/dist/decorator/index.js.map +1 -0
- package/dist/decorator/link-decorator.js +66 -0
- package/dist/decorator/link-decorator.js.map +1 -0
- package/dist/effect/gradation.js +37 -0
- package/dist/effect/gradation.js.map +1 -0
- package/dist/effect/index.js +23 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/shadow.js +33 -0
- package/dist/effect/shadow.js.map +1 -0
- package/dist/effect/turn.js +25 -0
- package/dist/effect/turn.js.map +1 -0
- package/dist/event/event-engine.js +76 -0
- package/dist/event/event-engine.js.map +1 -0
- package/dist/event/event-pump.js +92 -0
- package/dist/event/event-pump.js.map +1 -0
- package/dist/event/event-tracker.js +97 -0
- package/dist/event/event-tracker.js.map +1 -0
- package/dist/event/index.js +21 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/ua-event-handler.js +453 -0
- package/dist/event/ua-event-handler.js.map +1 -0
- package/dist/event-map/animator-handler.js +225 -0
- package/dist/event-map/animator-handler.js.map +1 -0
- package/dist/event-map/animators/animated-icon.js +265 -0
- package/dist/event-map/animators/animated-icon.js.map +1 -0
- package/dist/event-map/animators/border-highlighting.js +476 -0
- package/dist/event-map/animators/border-highlighting.js.map +1 -0
- package/dist/event-map/animators/bouncing-arrow.js +226 -0
- package/dist/event-map/animators/bouncing-arrow.js.map +1 -0
- package/dist/event-map/event-map.js +36 -0
- package/dist/event-map/event-map.js.map +1 -0
- package/dist/event-map/index.js +20 -0
- package/dist/event-map/index.js.map +1 -0
- package/dist/event-map/move-handler.js +233 -0
- package/dist/event-map/move-handler.js.map +1 -0
- package/dist/event-map/paste-handler.js +176 -0
- package/dist/event-map/paste-handler.js.map +1 -0
- package/dist/event-map/shift-handler.js +55 -0
- package/dist/event-map/shift-handler.js.map +1 -0
- package/dist/event-map/text-editor-lite.js +276 -0
- package/dist/event-map/text-editor-lite.js.map +1 -0
- package/dist/event-map/zoom-handler.js +49 -0
- package/dist/event-map/zoom-handler.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/layer/action/emphasize.js +42 -0
- package/dist/layer/action/emphasize.js.map +1 -0
- package/dist/layer/action/popup.js +461 -0
- package/dist/layer/action/popup.js.map +1 -0
- package/dist/layer/action/pressed.js +31 -0
- package/dist/layer/action/pressed.js.map +1 -0
- package/dist/layer/add-layer.js +180 -0
- package/dist/layer/add-layer.js.map +1 -0
- package/dist/layer/decotag-layer.js +121 -0
- package/dist/layer/decotag-layer.js.map +1 -0
- package/dist/layer/guide-layer.js +292 -0
- package/dist/layer/guide-layer.js.map +1 -0
- package/dist/layer/index.js +70 -0
- package/dist/layer/index.js.map +1 -0
- package/dist/layer/layer.js +230 -0
- package/dist/layer/layer.js.map +1 -0
- package/dist/layer/minimap-layer.js +84 -0
- package/dist/layer/minimap-layer.js.map +1 -0
- package/dist/layer/model-layer.js +465 -0
- package/dist/layer/model-layer.js.map +1 -0
- package/dist/layer/modeler/anchor-handler.js +193 -0
- package/dist/layer/modeler/anchor-handler.js.map +1 -0
- package/dist/layer/modeler/control-handler.js +95 -0
- package/dist/layer/modeler/control-handler.js.map +1 -0
- package/dist/layer/modeler/focus-outline.js +41 -0
- package/dist/layer/modeler/focus-outline.js.map +1 -0
- package/dist/layer/modeler/group-outline.js +30 -0
- package/dist/layer/modeler/group-outline.js.map +1 -0
- package/dist/layer/modeler/index.js +56 -0
- package/dist/layer/modeler/index.js.map +1 -0
- package/dist/layer/modeler/path-handler.js +300 -0
- package/dist/layer/modeler/path-handler.js.map +1 -0
- package/dist/layer/modeler/resizer.js +333 -0
- package/dist/layer/modeler/resizer.js.map +1 -0
- package/dist/layer/modeler/rotator.js +134 -0
- package/dist/layer/modeler/rotator.js.map +1 -0
- package/dist/layer/modeling-layer.js +491 -0
- package/dist/layer/modeling-layer.js.map +1 -0
- package/dist/layer/reaction-layer.js +111 -0
- package/dist/layer/reaction-layer.js.map +1 -0
- package/dist/layer/scroll-layer.js +191 -0
- package/dist/layer/scroll-layer.js.map +1 -0
- package/dist/layer/selection/selected-finder.js +96 -0
- package/dist/layer/selection/selected-finder.js.map +1 -0
- package/dist/layer/selection-layer.js +373 -0
- package/dist/layer/selection-layer.js.map +1 -0
- package/dist/layer/shift-layer.js +83 -0
- package/dist/layer/shift-layer.js.map +1 -0
- package/dist/layout/absolute.js +30 -0
- package/dist/layout/absolute.js.map +1 -0
- package/dist/layout/card.js +52 -0
- package/dist/layout/card.js.map +1 -0
- package/dist/layout/html-absolute.js +32 -0
- package/dist/layout/html-absolute.js.map +1 -0
- package/dist/layout/index.js +56 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/layout.js +36 -0
- package/dist/layout/layout.js.map +1 -0
- package/dist/layout/linear-horizontal.js +56 -0
- package/dist/layout/linear-horizontal.js.map +1 -0
- package/dist/layout/linear-vertical.js +56 -0
- package/dist/layout/linear-vertical.js.map +1 -0
- package/dist/layout/table.js +106 -0
- package/dist/layout/table.js.map +1 -0
- package/dist/license/license.js +170 -0
- package/dist/license/license.js.map +1 -0
- package/dist/model/compile.js +40 -0
- package/dist/model/compile.js.map +1 -0
- package/dist/model/duplicate.js +19 -0
- package/dist/model/duplicate.js.map +1 -0
- package/dist/model/index.js +34 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/selector.js +104 -0
- package/dist/model/selector.js.map +1 -0
- package/dist/style/compile.js +14 -0
- package/dist/style/compile.js.map +1 -0
- package/dist/style/index.js +14 -0
- package/dist/style/index.js.map +1 -0
- package/dist/things-scene/api/add-start.js +18 -0
- package/dist/things-scene/api/add-start.js.map +1 -0
- package/dist/things-scene/api/add.js +71 -0
- package/dist/things-scene/api/add.js.map +1 -0
- package/dist/things-scene/api/align.js +116 -0
- package/dist/things-scene/api/align.js.map +1 -0
- package/dist/things-scene/api/center-to.js +50 -0
- package/dist/things-scene/api/center-to.js.map +1 -0
- package/dist/things-scene/api/change.js +27 -0
- package/dist/things-scene/api/change.js.map +1 -0
- package/dist/things-scene/api/clipboard.js +45 -0
- package/dist/things-scene/api/clipboard.js.map +1 -0
- package/dist/things-scene/api/distribute.js +57 -0
- package/dist/things-scene/api/distribute.js.map +1 -0
- package/dist/things-scene/api/duplicate.js +47 -0
- package/dist/things-scene/api/duplicate.js.map +1 -0
- package/dist/things-scene/api/fullscreen.js +26 -0
- package/dist/things-scene/api/fullscreen.js.map +1 -0
- package/dist/things-scene/api/group.js +91 -0
- package/dist/things-scene/api/group.js.map +1 -0
- package/dist/things-scene/api/ids.js +28 -0
- package/dist/things-scene/api/ids.js.map +1 -0
- package/dist/things-scene/api/index.js +192 -0
- package/dist/things-scene/api/index.js.map +1 -0
- package/dist/things-scene/api/listener.js +69 -0
- package/dist/things-scene/api/listener.js.map +1 -0
- package/dist/things-scene/api/paste-start.js +27 -0
- package/dist/things-scene/api/paste-start.js.map +1 -0
- package/dist/things-scene/api/place.js +98 -0
- package/dist/things-scene/api/place.js.map +1 -0
- package/dist/things-scene/api/remove.js +57 -0
- package/dist/things-scene/api/remove.js.map +1 -0
- package/dist/things-scene/api/symmetry.js +47 -0
- package/dist/things-scene/api/symmetry.js.map +1 -0
- package/dist/things-scene/api/to-data-url.js +76 -0
- package/dist/things-scene/api/to-data-url.js.map +1 -0
- package/dist/things-scene/api/zorder.js +68 -0
- package/dist/things-scene/api/zorder.js.map +1 -0
- package/dist/things-scene/application-context.js +168 -0
- package/dist/things-scene/application-context.js.map +1 -0
- package/dist/things-scene/config.js +18 -0
- package/dist/things-scene/config.js.map +1 -0
- package/dist/things-scene/create.js +67 -0
- package/dist/things-scene/create.js.map +1 -0
- package/dist/things-scene/fps.js +26 -0
- package/dist/things-scene/fps.js.map +1 -0
- package/dist/things-scene/index.js +152 -0
- package/dist/things-scene/index.js.map +1 -0
- package/dist/things-scene/polyfill.js +111 -0
- package/dist/things-scene/polyfill.js.map +1 -0
- package/dist/things-scene/scene.js +442 -0
- package/dist/things-scene/scene.js.map +1 -0
- package/dist/things-scene/version.js +12 -0
- package/dist/things-scene/version.js.map +1 -0
- package/package.json +8 -6
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.trigger = trigger;
|
|
8
|
+
var Const = _interopRequireWildcard(require("../const.js"));
|
|
9
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
|
+
/*
|
|
12
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/* 여기서는 사용자 이벤트 관련한 처리를 담당한다.
|
|
16
|
+
- 사용자 이벤트를 브라우저에서 서브스크라이브한다.
|
|
17
|
+
- 드래그 관련된 이벤트를 생성한다.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const STATUS = {
|
|
21
|
+
NORMAL: 0,
|
|
22
|
+
DRAGGABLE: 1,
|
|
23
|
+
DRAGGING: 2
|
|
24
|
+
};
|
|
25
|
+
const TOUCH_STATUS = {
|
|
26
|
+
NORMAL: 0,
|
|
27
|
+
TOUCH_START: 1,
|
|
28
|
+
TOUCH_MOVE: 2,
|
|
29
|
+
TOUCH_END: 3,
|
|
30
|
+
TOUCH_CANCEL: 4
|
|
31
|
+
};
|
|
32
|
+
const DRAG_THRESHOLD = 16;
|
|
33
|
+
const DOUBLE_TAP_INTERVAL = 500;
|
|
34
|
+
const TAP_HOLD_INTERVAL = 500;
|
|
35
|
+
var LAST_OFFSET = {};
|
|
36
|
+
var LAST_TOUCHES_DISTANCE = 0;
|
|
37
|
+
function getOffset(e) {
|
|
38
|
+
if (e.touches) {
|
|
39
|
+
let touch = e.touches[0];
|
|
40
|
+
if (!touch) return LAST_OFFSET;
|
|
41
|
+
let targetBound = touch.target.getBoundingClientRect();
|
|
42
|
+
LAST_OFFSET = {
|
|
43
|
+
x: e.offsetX || touch.clientX - (targetBound.x || targetBound.left),
|
|
44
|
+
y: e.offsetY || touch.clientY - (targetBound.y || targetBound.top)
|
|
45
|
+
};
|
|
46
|
+
return LAST_OFFSET;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
x: e.offsetX,
|
|
50
|
+
y: e.offsetY
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function getTouchPointDistance(e) {
|
|
54
|
+
var minX,
|
|
55
|
+
maxX = 0,
|
|
56
|
+
minY,
|
|
57
|
+
maxY = 0;
|
|
58
|
+
var touchPointDistance = 0;
|
|
59
|
+
if (e.touches.length === 1) return touchPointDistance;
|
|
60
|
+
Array.from(e.touches).forEach(touch => {
|
|
61
|
+
minX = minX != undefined ? Math.min(touch.screenX, minX) : touch.screenX;
|
|
62
|
+
maxX = Math.max(touch.screenX, maxX);
|
|
63
|
+
minY = minY != undefined ? Math.min(touch.screenY, minY) : touch.screenY;
|
|
64
|
+
maxY = Math.max(touch.screenY, maxY);
|
|
65
|
+
});
|
|
66
|
+
var distanceX = maxX - minX || 0;
|
|
67
|
+
var distanceY = maxY - minY || 0;
|
|
68
|
+
touchPointDistance = Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2)) || 0;
|
|
69
|
+
return touchPointDistance;
|
|
70
|
+
}
|
|
71
|
+
class _Event {
|
|
72
|
+
constructor(e, type) {
|
|
73
|
+
// this.originalEvent = e
|
|
74
|
+
|
|
75
|
+
this._type = type || e.type;
|
|
76
|
+
this._ctrlKey = e.ctrlKey;
|
|
77
|
+
this._altKey = e.altKey;
|
|
78
|
+
this._shiftKey = e.shiftKey;
|
|
79
|
+
this._metaKey = e.metaKey;
|
|
80
|
+
var offset = getOffset(e);
|
|
81
|
+
this._offsetX = offset.x;
|
|
82
|
+
this._offsetY = offset.y;
|
|
83
|
+
if (e.type == 'wheel') {
|
|
84
|
+
this.deltaX = e.deltaX;
|
|
85
|
+
this.deltaY = e.deltaY;
|
|
86
|
+
this.deltaZ = e.deltaZ;
|
|
87
|
+
} else if (e.type == 'drop') {
|
|
88
|
+
this.dataTransfer = e.dataTransfer;
|
|
89
|
+
} else if (e.type.match(/^touch/)) {
|
|
90
|
+
this._scale = e.scale;
|
|
91
|
+
this._touches = e.touches;
|
|
92
|
+
this._changedTouches = e.changedTouches;
|
|
93
|
+
if (this._scale == undefined) {
|
|
94
|
+
var touchPointDistance = getTouchPointDistance(e);
|
|
95
|
+
if (LAST_TOUCHES_DISTANCE > 0) this._scale = touchPointDistance / LAST_TOUCHES_DISTANCE;
|
|
96
|
+
LAST_TOUCHES_DISTANCE = touchPointDistance;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
get type() {
|
|
101
|
+
return this._type;
|
|
102
|
+
}
|
|
103
|
+
set type(type) {
|
|
104
|
+
this._type = type;
|
|
105
|
+
}
|
|
106
|
+
get offsetX() {
|
|
107
|
+
return this._offsetX;
|
|
108
|
+
}
|
|
109
|
+
get offsetY() {
|
|
110
|
+
return this._offsetY;
|
|
111
|
+
}
|
|
112
|
+
get altKey() {
|
|
113
|
+
return this._altKey;
|
|
114
|
+
}
|
|
115
|
+
get ctrlKey() {
|
|
116
|
+
return this._ctrlKey;
|
|
117
|
+
}
|
|
118
|
+
get shiftKey() {
|
|
119
|
+
return this._shiftKey;
|
|
120
|
+
}
|
|
121
|
+
get metaKey() {
|
|
122
|
+
return this._metaKey;
|
|
123
|
+
}
|
|
124
|
+
get touches() {
|
|
125
|
+
return this._touches;
|
|
126
|
+
}
|
|
127
|
+
get changedTouches() {
|
|
128
|
+
return this._changedTouches;
|
|
129
|
+
}
|
|
130
|
+
get scale() {
|
|
131
|
+
return this._scale;
|
|
132
|
+
}
|
|
133
|
+
stopPropagation() {
|
|
134
|
+
this._stop_ = true;
|
|
135
|
+
if (this.originalEvent && typeof this.originalEvent.stopPropagation === 'function') {
|
|
136
|
+
this.originalEvent.stopPropagation();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
isPropagationStopped() {
|
|
140
|
+
return this._stop_;
|
|
141
|
+
}
|
|
142
|
+
preventDefault() {
|
|
143
|
+
this._prevented = true; // 사용자 정의 상태 플래그 설정
|
|
144
|
+
}
|
|
145
|
+
isDefaultPrevented() {
|
|
146
|
+
return this._prevented; // 기본 동작이 방지되었는지 확인
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function find_target(container, e) {
|
|
150
|
+
/* UA 이벤트의 타겟(즉, 이벤트 캡쳐된 컴포넌트)를 찾는다 */
|
|
151
|
+
return container.capture(e.offsetX, e.offsetY);
|
|
152
|
+
}
|
|
153
|
+
function trigger(target, type, e) {
|
|
154
|
+
if (!target || !target.app) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (target.app.isViewMode && target.hidden) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (!(e instanceof _Event) || type !== e.type) {
|
|
161
|
+
e = new _Event(e, type);
|
|
162
|
+
}
|
|
163
|
+
var handler = 'on' + type;
|
|
164
|
+
target[handler] && target[handler](e);
|
|
165
|
+
if (!e.isPropagationStopped()) {
|
|
166
|
+
target.trigger(type, e);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
class UAEventHandler {
|
|
170
|
+
/*
|
|
171
|
+
* container : things-scene의 최상위 컨테이너임
|
|
172
|
+
* html_element : things-scene이 그려질 상위 HTML 엘리먼트임.
|
|
173
|
+
*/
|
|
174
|
+
constructor(container, html_element) {
|
|
175
|
+
this.container = container;
|
|
176
|
+
this.html_element = html_element;
|
|
177
|
+
this.status = STATUS.NORMAL;
|
|
178
|
+
this.last_target = null;
|
|
179
|
+
this.gesture_handlers = Const.GESTURES.map(type => this.gestureHandlerBuilder(type));
|
|
180
|
+
this.keyevent_handlers = Const.KEYEVENTS.map(type => this.keyeventHandlerBuilder(type));
|
|
181
|
+
Const.GESTURES.forEach((type, idx) => html_element.addEventListener(type, this.gesture_handlers[idx]), {
|
|
182
|
+
passive: false
|
|
183
|
+
});
|
|
184
|
+
Const.KEYEVENTS.forEach((type, idx) => html_element.addEventListener(type, this.keyevent_handlers[idx]));
|
|
185
|
+
|
|
186
|
+
/* File Drag & Drop Handler */
|
|
187
|
+
html_element.ondragover = this.gestureHandlerBuilder('dragover');
|
|
188
|
+
html_element.ondrop = this.gestureHandlerBuilder('drop');
|
|
189
|
+
|
|
190
|
+
// DIV에서 keydown 이벤트를 받을 수 있도록 하는 두가지 방법임.
|
|
191
|
+
// 방법 1. tabIndex 속성을 준다.
|
|
192
|
+
html_element.tabIndex = 1;
|
|
193
|
+
// 방법 2. contenteditable 속성을 부여한다.
|
|
194
|
+
// -- 두가지 방법 모두 safari, chrome에서 동작한다.
|
|
195
|
+
// -- 두가지 방법 모두 firefox에서 동작하지 않는다.
|
|
196
|
+
// -- 이 방법은 Edge브라우저에서 DIV에 키보드캐럿을 보인다.
|
|
197
|
+
// html_element.setAttribute('contenteditable', "true");
|
|
198
|
+
}
|
|
199
|
+
dispose() {
|
|
200
|
+
if (this.last_enter_target) {
|
|
201
|
+
trigger(this.last_enter_target, 'mouseleave', new CustomEvent('mouseleave'));
|
|
202
|
+
}
|
|
203
|
+
Const.GESTURES.forEach((type, idx) => this.html_element.removeEventListener(type, this.gesture_handlers[idx]));
|
|
204
|
+
Const.KEYEVENTS.forEach((type, idx) => this.html_element.removeEventListener(type, this.keyevent_handlers[idx]));
|
|
205
|
+
delete this.gesture_handlers;
|
|
206
|
+
delete this.keyevent_handlers;
|
|
207
|
+
delete this.last_target;
|
|
208
|
+
}
|
|
209
|
+
gestureHandlerBuilder(type) {
|
|
210
|
+
var handler = this[`on${type}`].bind(this);
|
|
211
|
+
return e => {
|
|
212
|
+
const _e = new _Event(e);
|
|
213
|
+
handler(_e);
|
|
214
|
+
_e.isDefaultPrevented() && e.preventDefault();
|
|
215
|
+
return false;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
keyeventHandlerBuilder(type) {
|
|
219
|
+
return this[`on${type}`].bind(this);
|
|
220
|
+
}
|
|
221
|
+
ondragover(e) {
|
|
222
|
+
var target = find_target(this.container, e);
|
|
223
|
+
trigger(target, e.type, e);
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
ondrop(e) {
|
|
227
|
+
var target = find_target(this.container, e);
|
|
228
|
+
trigger(target, e.type, e);
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
ondblclick(e) {
|
|
232
|
+
var target = find_target(this.container, e);
|
|
233
|
+
trigger(target, e.type, e);
|
|
234
|
+
this.last_target = null;
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
onkeydown(e) {
|
|
238
|
+
// keydown 이벤트를 각 컴포넌트에서 받을 필요가 있을 때 아래 코멘트 부분을 제거할 것.
|
|
239
|
+
// var prevent, selected = this.container.selected;
|
|
240
|
+
//
|
|
241
|
+
// if(selected.length === 1)
|
|
242
|
+
// prevent = selected[0].onkeydown && selected[0].onkeydown(new _Event(e));
|
|
243
|
+
//
|
|
244
|
+
// if(prevent) {
|
|
245
|
+
// e.preventDefault();
|
|
246
|
+
// return true
|
|
247
|
+
// }
|
|
248
|
+
|
|
249
|
+
/* 키보드 이벤트는 최상위 컨테이너에서만 발생하도록 한다. */
|
|
250
|
+
this.container.trigger(e.type, e);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
onkeyup(e) {
|
|
254
|
+
/* 키보드 이벤트는 최상위 컨테이너에서만 발생하도록 한다. */
|
|
255
|
+
this.container.trigger(e.type, e);
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
onmousemove(e) {
|
|
259
|
+
/* pre-state */
|
|
260
|
+
switch (this.status) {
|
|
261
|
+
case STATUS.DRAGGABLE:
|
|
262
|
+
let diffX = e.offsetX - this.__dragstart_e.offsetX;
|
|
263
|
+
let diffY = e.offsetY - this.__dragstart_e.offsetY;
|
|
264
|
+
if (diffX * diffX + diffY * diffY < DRAG_THRESHOLD) break;
|
|
265
|
+
this.status = STATUS.DRAGGING;
|
|
266
|
+
|
|
267
|
+
/* TODO dragstart의 포인트 포지션을 원래의 포지션으로 보내주어야 한다. */
|
|
268
|
+
trigger(this.last_target, 'dragstart', this.__dragstart_e);
|
|
269
|
+
this.__dragmove_e = e;
|
|
270
|
+
trigger(this.last_target, 'dragmove', e);
|
|
271
|
+
break;
|
|
272
|
+
case STATUS.DRAGGING:
|
|
273
|
+
this.__dragmove_e = e;
|
|
274
|
+
trigger(this.last_target, 'dragmove', e);
|
|
275
|
+
break;
|
|
276
|
+
default:
|
|
277
|
+
var target = find_target(this.container, e);
|
|
278
|
+
if (this.last_enter_target !== target) {
|
|
279
|
+
if (this.last_enter_target) trigger(this.last_enter_target, 'mouseleave', e);
|
|
280
|
+
if (target) trigger(target, 'mouseenter', e);
|
|
281
|
+
this.last_enter_target = target;
|
|
282
|
+
}
|
|
283
|
+
trigger(target, e.type, e);
|
|
284
|
+
this.last_target = target;
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
onmousedown(e) {
|
|
289
|
+
/* pre-state */
|
|
290
|
+
switch (this.status) {
|
|
291
|
+
case STATUS.DRAGGING:
|
|
292
|
+
trigger(this.last_target, 'dragend', e);
|
|
293
|
+
this.last_target = null;
|
|
294
|
+
this.status = STATUS.NORMAL;
|
|
295
|
+
break;
|
|
296
|
+
default:
|
|
297
|
+
var target = find_target(this.container, e);
|
|
298
|
+
this.last_target = target;
|
|
299
|
+
this.status = STATUS.DRAGGABLE;
|
|
300
|
+
this.__dragstart_e = e;
|
|
301
|
+
trigger(target, e.type, e);
|
|
302
|
+
}
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
onmouseup(e) {
|
|
306
|
+
/* pre-state */
|
|
307
|
+
switch (this.status) {
|
|
308
|
+
case STATUS.DRAGGING:
|
|
309
|
+
trigger(this.last_target, 'dragend', e);
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
var target = find_target(this.container, e);
|
|
313
|
+
trigger(target, e.type, e);
|
|
314
|
+
if (this.last_target === target) {
|
|
315
|
+
/**
|
|
316
|
+
* [ 주의 ] window의 click 이벤트를 사용하지 않는다. mouseup 이벤트에서 판단하여 click 이벤트를 발생시켜야 한다.
|
|
317
|
+
* 원인. 모바일 환경에서 Popup 된 보드에서는 (알 수 없는 이유로) 약 2.5초동안 click 이벤트가 발생하지 않기 때문에, 사용성에 불편을 겪을 수 있기 때문이다.
|
|
318
|
+
*
|
|
319
|
+
* [ caution ] Do not use the click event of the window. The click event should be triggered by judging from the mouseup event.
|
|
320
|
+
* cause. This is because in the mobile environment, the click event does not occur for about 2.5 seconds on the popup board (for unknown reasons), which may cause usability problems.
|
|
321
|
+
*/
|
|
322
|
+
|
|
323
|
+
trigger(target, 'click', e);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
this.last_target = null;
|
|
327
|
+
this.status = STATUS.NORMAL;
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
onmouseout(e) {
|
|
331
|
+
var target = find_target(this.container, e);
|
|
332
|
+
|
|
333
|
+
/* pre-state */
|
|
334
|
+
switch (this.status) {
|
|
335
|
+
case STATUS.DRAGGING:
|
|
336
|
+
trigger(this.last_target, 'dragend', e);
|
|
337
|
+
break;
|
|
338
|
+
default:
|
|
339
|
+
if (this.last_target && this.last_target === target) return;
|
|
340
|
+
if (this.last_enter_target) {
|
|
341
|
+
trigger(this.last_enter_target, 'mouseleave', e);
|
|
342
|
+
delete this.last_enter_target;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
this.last_target = null;
|
|
346
|
+
this.status = STATUS.NORMAL;
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
ontouchstart(e) {
|
|
350
|
+
var target = find_target(this.container, e);
|
|
351
|
+
this.last_target = target;
|
|
352
|
+
this.status = TOUCH_STATUS.TOUCH_START;
|
|
353
|
+
if (!this.touchPoints) this.touchPoints = [];
|
|
354
|
+
this.touchPoints.push(e.changedTouches[0]);
|
|
355
|
+
this.holdTimer = setTimeout(() => {
|
|
356
|
+
this.status = TOUCH_STATUS.NORMAL;
|
|
357
|
+
trigger(this.last_target, 'hold', e);
|
|
358
|
+
delete this.holdTimer;
|
|
359
|
+
}, TAP_HOLD_INTERVAL);
|
|
360
|
+
trigger(target, e.type, e);
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
ontouchmove(e) {
|
|
364
|
+
if (!(e.touches && e.changedTouches)) {
|
|
365
|
+
/* TODO dragstart의 포인트 포지션을 원래의 포지션으로 보내주어야 한다. */
|
|
366
|
+
trigger(this.last_target, 'dragstart', e);
|
|
367
|
+
trigger(this.last_target, 'dragmove', e);
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
var target = find_target(this.container, e);
|
|
371
|
+
/* pre-state */
|
|
372
|
+
switch (this.status) {
|
|
373
|
+
case TOUCH_STATUS.TOUCH_START:
|
|
374
|
+
Array.from(e.changedTouches).forEach(tp => {
|
|
375
|
+
var touchPoint = this.touchPoints.find(p => {
|
|
376
|
+
return p.identifier === tp.identifier;
|
|
377
|
+
});
|
|
378
|
+
if (!touchPoint) return;
|
|
379
|
+
var diffX = touchPoint.clientX - tp.clientX;
|
|
380
|
+
var diffY = touchPoint.clientY - tp.clientY;
|
|
381
|
+
if (Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) >= DRAG_THRESHOLD) {
|
|
382
|
+
this.status = TOUCH_STATUS.TOUCH_MOVE;
|
|
383
|
+
if (this.holdTimer) {
|
|
384
|
+
clearTimeout(this.holdTimer);
|
|
385
|
+
delete this.holdTimer;
|
|
386
|
+
}
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
break;
|
|
391
|
+
case TOUCH_STATUS.TOUCH_MOVE:
|
|
392
|
+
if (this.holdTimer) {
|
|
393
|
+
clearTimeout(this.holdTimer);
|
|
394
|
+
delete this.holdTimer;
|
|
395
|
+
}
|
|
396
|
+
if (e.changedTouches.length === 2) {
|
|
397
|
+
if (e.scale != undefined && e.scale !== 1 && (e.scale < 0.9 || e.scale > 1.1)) {
|
|
398
|
+
trigger(this.last_target, 'pinch', e);
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
trigger(this.last_target, 'pan', e);
|
|
403
|
+
target = this.last_target;
|
|
404
|
+
break;
|
|
405
|
+
default:
|
|
406
|
+
if (this.last_enter_target !== target) {
|
|
407
|
+
if (this.last_enter_target) trigger(this.last_enter_target, 'mouseleave', e);
|
|
408
|
+
if (target) trigger(target, 'mouseenter', e);
|
|
409
|
+
this.last_enter_target = target;
|
|
410
|
+
}
|
|
411
|
+
this.last_target = target;
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
trigger(target, 'touchmove', e);
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
ontouchend(e) {
|
|
418
|
+
var target = find_target(this.container, e);
|
|
419
|
+
/* pre-state */
|
|
420
|
+
switch (this.status) {
|
|
421
|
+
case TOUCH_STATUS.TOUCH_MOVE:
|
|
422
|
+
target = this.last_target;
|
|
423
|
+
break;
|
|
424
|
+
case TOUCH_STATUS.TOUCH_START:
|
|
425
|
+
var now = performance.now();
|
|
426
|
+
var touchInterval = now - this.touchedAt;
|
|
427
|
+
if (this.holdTimer) {
|
|
428
|
+
clearTimeout(this.holdTimer);
|
|
429
|
+
delete this.holdTimer;
|
|
430
|
+
if (touchInterval < DOUBLE_TAP_INTERVAL) trigger(target, 'doubletap', e);else trigger(target, 'tap', e);
|
|
431
|
+
this.touchedAt = now;
|
|
432
|
+
}
|
|
433
|
+
break;
|
|
434
|
+
default:
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
trigger(target, 'touchend', e);
|
|
438
|
+
var touchPointIndex = this.touchPoints.findIndex(tp => {
|
|
439
|
+
return tp.identifier === e.changedTouches[0].identifier;
|
|
440
|
+
});
|
|
441
|
+
this.touchPoints.splice(touchPointIndex, 1);
|
|
442
|
+
this.last_target = null;
|
|
443
|
+
this.status = TOUCH_STATUS.NORMAL;
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
onwheel(e) {
|
|
447
|
+
var target = find_target(this.container, e);
|
|
448
|
+
trigger(target, e.type, e);
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
exports.default = UAEventHandler;
|
|
453
|
+
//# sourceMappingURL=ua-event-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ua-event-handler.js","names":["Const","_interopRequireWildcard","require","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","STATUS","NORMAL","DRAGGABLE","DRAGGING","TOUCH_STATUS","TOUCH_START","TOUCH_MOVE","TOUCH_END","TOUCH_CANCEL","DRAG_THRESHOLD","DOUBLE_TAP_INTERVAL","TAP_HOLD_INTERVAL","LAST_OFFSET","LAST_TOUCHES_DISTANCE","getOffset","touches","touch","targetBound","target","getBoundingClientRect","x","offsetX","clientX","left","y","offsetY","clientY","top","getTouchPointDistance","minX","maxX","minY","maxY","touchPointDistance","length","Array","from","forEach","undefined","Math","min","screenX","max","screenY","distanceX","distanceY","sqrt","pow","_Event","constructor","type","_type","_ctrlKey","ctrlKey","_altKey","altKey","_shiftKey","shiftKey","_metaKey","metaKey","offset","_offsetX","_offsetY","deltaX","deltaY","deltaZ","dataTransfer","match","_scale","scale","_touches","_changedTouches","changedTouches","stopPropagation","_stop_","originalEvent","isPropagationStopped","preventDefault","_prevented","isDefaultPrevented","find_target","container","capture","trigger","app","isViewMode","hidden","handler","UAEventHandler","html_element","status","last_target","gesture_handlers","GESTURES","map","gestureHandlerBuilder","keyevent_handlers","KEYEVENTS","keyeventHandlerBuilder","idx","addEventListener","passive","ondragover","ondrop","tabIndex","dispose","last_enter_target","CustomEvent","removeEventListener","bind","_e","ondblclick","onkeydown","onkeyup","onmousemove","diffX","__dragstart_e","diffY","__dragmove_e","onmousedown","onmouseup","onmouseout","ontouchstart","touchPoints","push","holdTimer","setTimeout","ontouchmove","tp","touchPoint","find","p","identifier","clearTimeout","ontouchend","now","performance","touchInterval","touchedAt","touchPointIndex","findIndex","splice","onwheel","exports"],"sources":["../../src/event/ua-event-handler.js"],"sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport * as Const from '../const.js'\n\n/* 여기서는 사용자 이벤트 관련한 처리를 담당한다.\n - 사용자 이벤트를 브라우저에서 서브스크라이브한다.\n - 드래그 관련된 이벤트를 생성한다.\n*/\n\nconst STATUS = {\n NORMAL: 0,\n DRAGGABLE: 1,\n DRAGGING: 2\n}\n\nconst TOUCH_STATUS = {\n NORMAL: 0,\n TOUCH_START: 1,\n TOUCH_MOVE: 2,\n TOUCH_END: 3,\n TOUCH_CANCEL: 4\n}\n\nconst DRAG_THRESHOLD = 16\n\nconst DOUBLE_TAP_INTERVAL = 500\nconst TAP_HOLD_INTERVAL = 500\n\nvar LAST_OFFSET = {}\nvar LAST_TOUCHES_DISTANCE = 0\n\nfunction getOffset(e) {\n if (e.touches) {\n let touch = e.touches[0]\n if (!touch) return LAST_OFFSET\n\n let targetBound = touch.target.getBoundingClientRect()\n\n LAST_OFFSET = {\n x: e.offsetX || touch.clientX - (targetBound.x || targetBound.left),\n y: e.offsetY || touch.clientY - (targetBound.y || targetBound.top)\n }\n return LAST_OFFSET\n }\n\n return {\n x: e.offsetX,\n y: e.offsetY\n }\n}\n\nfunction getTouchPointDistance(e) {\n var minX,\n maxX = 0,\n minY,\n maxY = 0\n var touchPointDistance = 0\n\n if (e.touches.length === 1) return touchPointDistance\n\n Array.from(e.touches).forEach(touch => {\n minX = minX != undefined ? Math.min(touch.screenX, minX) : touch.screenX\n maxX = Math.max(touch.screenX, maxX)\n minY = minY != undefined ? Math.min(touch.screenY, minY) : touch.screenY\n maxY = Math.max(touch.screenY, maxY)\n })\n\n var distanceX = maxX - minX || 0\n var distanceY = maxY - minY || 0\n\n touchPointDistance = Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2)) || 0\n\n return touchPointDistance\n}\n\nclass _Event {\n constructor(e, type) {\n // this.originalEvent = e\n\n this._type = type || e.type\n this._ctrlKey = e.ctrlKey\n this._altKey = e.altKey\n this._shiftKey = e.shiftKey\n this._metaKey = e.metaKey\n\n var offset = getOffset(e)\n\n this._offsetX = offset.x\n this._offsetY = offset.y\n\n if (e.type == 'wheel') {\n this.deltaX = e.deltaX\n this.deltaY = e.deltaY\n this.deltaZ = e.deltaZ\n } else if (e.type == 'drop') {\n this.dataTransfer = e.dataTransfer\n } else if (e.type.match(/^touch/)) {\n this._scale = e.scale\n this._touches = e.touches\n this._changedTouches = e.changedTouches\n\n if (this._scale == undefined) {\n var touchPointDistance = getTouchPointDistance(e)\n\n if (LAST_TOUCHES_DISTANCE > 0) this._scale = touchPointDistance / LAST_TOUCHES_DISTANCE\n\n LAST_TOUCHES_DISTANCE = touchPointDistance\n }\n }\n }\n\n get type() {\n return this._type\n }\n\n set type(type) {\n this._type = type\n }\n\n get offsetX() {\n return this._offsetX\n }\n\n get offsetY() {\n return this._offsetY\n }\n\n get altKey() {\n return this._altKey\n }\n\n get ctrlKey() {\n return this._ctrlKey\n }\n\n get shiftKey() {\n return this._shiftKey\n }\n\n get metaKey() {\n return this._metaKey\n }\n\n get touches() {\n return this._touches\n }\n get changedTouches() {\n return this._changedTouches\n }\n\n get scale() {\n return this._scale\n }\n\n stopPropagation() {\n this._stop_ = true\n if (this.originalEvent && typeof this.originalEvent.stopPropagation === 'function') {\n this.originalEvent.stopPropagation()\n }\n }\n\n isPropagationStopped() {\n return this._stop_\n }\n\n preventDefault() {\n this._prevented = true // 사용자 정의 상태 플래그 설정\n }\n\n isDefaultPrevented() {\n return this._prevented // 기본 동작이 방지되었는지 확인\n }\n}\n\nfunction find_target(container, e) {\n /* UA 이벤트의 타겟(즉, 이벤트 캡쳐된 컴포넌트)를 찾는다 */\n return container.capture(e.offsetX, e.offsetY)\n}\n\nexport function trigger(target, type, e) {\n if (!target || !target.app) {\n return\n }\n\n if (target.app.isViewMode && target.hidden) {\n return\n }\n\n if (!(e instanceof _Event) || type !== e.type) {\n e = new _Event(e, type)\n }\n\n var handler = 'on' + type\n target[handler] && target[handler](e)\n\n if (!e.isPropagationStopped()) {\n target.trigger(type, e)\n }\n}\n\nexport default class UAEventHandler {\n /*\n * container : things-scene의 최상위 컨테이너임\n * html_element : things-scene이 그려질 상위 HTML 엘리먼트임.\n */\n constructor(container, html_element) {\n this.container = container\n this.html_element = html_element\n\n this.status = STATUS.NORMAL\n this.last_target = null\n\n this.gesture_handlers = Const.GESTURES.map(type => this.gestureHandlerBuilder(type))\n this.keyevent_handlers = Const.KEYEVENTS.map(type => this.keyeventHandlerBuilder(type))\n\n Const.GESTURES.forEach((type, idx) => html_element.addEventListener(type, this.gesture_handlers[idx]), {\n passive: false\n })\n Const.KEYEVENTS.forEach((type, idx) => html_element.addEventListener(type, this.keyevent_handlers[idx]))\n\n /* File Drag & Drop Handler */\n html_element.ondragover = this.gestureHandlerBuilder('dragover')\n html_element.ondrop = this.gestureHandlerBuilder('drop')\n\n // DIV에서 keydown 이벤트를 받을 수 있도록 하는 두가지 방법임.\n // 방법 1. tabIndex 속성을 준다.\n html_element.tabIndex = 1\n // 방법 2. contenteditable 속성을 부여한다.\n // -- 두가지 방법 모두 safari, chrome에서 동작한다.\n // -- 두가지 방법 모두 firefox에서 동작하지 않는다.\n // -- 이 방법은 Edge브라우저에서 DIV에 키보드캐럿을 보인다.\n // html_element.setAttribute('contenteditable', \"true\");\n }\n\n dispose() {\n if (this.last_enter_target) {\n trigger(this.last_enter_target, 'mouseleave', new CustomEvent('mouseleave'))\n }\n\n Const.GESTURES.forEach((type, idx) => this.html_element.removeEventListener(type, this.gesture_handlers[idx]))\n Const.KEYEVENTS.forEach((type, idx) => this.html_element.removeEventListener(type, this.keyevent_handlers[idx]))\n\n delete this.gesture_handlers\n delete this.keyevent_handlers\n delete this.last_target\n }\n\n gestureHandlerBuilder(type) {\n var handler = this[`on${type}`].bind(this)\n\n return e => {\n const _e = new _Event(e)\n handler(_e)\n\n _e.isDefaultPrevented() && e.preventDefault()\n\n return false\n }\n }\n\n keyeventHandlerBuilder(type) {\n return this[`on${type}`].bind(this)\n }\n\n ondragover(e) {\n var target = find_target(this.container, e)\n\n trigger(target, e.type, e)\n return false\n }\n\n ondrop(e) {\n var target = find_target(this.container, e)\n\n trigger(target, e.type, e)\n\n return false\n }\n\n ondblclick(e) {\n var target = find_target(this.container, e)\n\n trigger(target, e.type, e)\n\n this.last_target = null\n\n return false\n }\n\n onkeydown(e) {\n // keydown 이벤트를 각 컴포넌트에서 받을 필요가 있을 때 아래 코멘트 부분을 제거할 것.\n // var prevent, selected = this.container.selected;\n //\n // if(selected.length === 1)\n // prevent = selected[0].onkeydown && selected[0].onkeydown(new _Event(e));\n //\n // if(prevent) {\n // e.preventDefault();\n // return true\n // }\n\n /* 키보드 이벤트는 최상위 컨테이너에서만 발생하도록 한다. */\n this.container.trigger(e.type, e)\n\n return false\n }\n\n onkeyup(e) {\n /* 키보드 이벤트는 최상위 컨테이너에서만 발생하도록 한다. */\n this.container.trigger(e.type, e)\n\n return false\n }\n\n onmousemove(e) {\n /* pre-state */\n switch (this.status) {\n case STATUS.DRAGGABLE:\n let diffX = e.offsetX - this.__dragstart_e.offsetX\n let diffY = e.offsetY - this.__dragstart_e.offsetY\n\n if (diffX * diffX + diffY * diffY < DRAG_THRESHOLD) break\n\n this.status = STATUS.DRAGGING\n\n /* TODO dragstart의 포인트 포지션을 원래의 포지션으로 보내주어야 한다. */\n trigger(this.last_target, 'dragstart', this.__dragstart_e)\n\n this.__dragmove_e = e\n trigger(this.last_target, 'dragmove', e)\n\n break\n\n case STATUS.DRAGGING:\n this.__dragmove_e = e\n trigger(this.last_target, 'dragmove', e)\n\n break\n\n default:\n var target = find_target(this.container, e)\n\n if (this.last_enter_target !== target) {\n if (this.last_enter_target) trigger(this.last_enter_target, 'mouseleave', e)\n if (target) trigger(target, 'mouseenter', e)\n this.last_enter_target = target\n }\n\n trigger(target, e.type, e)\n this.last_target = target\n }\n\n return false\n }\n\n onmousedown(e) {\n /* pre-state */\n switch (this.status) {\n case STATUS.DRAGGING:\n trigger(this.last_target, 'dragend', e)\n\n this.last_target = null\n this.status = STATUS.NORMAL\n break\n\n default:\n var target = find_target(this.container, e)\n\n this.last_target = target\n this.status = STATUS.DRAGGABLE\n this.__dragstart_e = e\n\n trigger(target, e.type, e)\n }\n\n return false\n }\n\n onmouseup(e) {\n /* pre-state */\n switch (this.status) {\n case STATUS.DRAGGING:\n trigger(this.last_target, 'dragend', e)\n\n break\n\n default:\n var target = find_target(this.container, e)\n trigger(target, e.type, e)\n\n if (this.last_target === target) {\n /**\n * [ 주의 ] window의 click 이벤트를 사용하지 않는다. mouseup 이벤트에서 판단하여 click 이벤트를 발생시켜야 한다.\n * 원인. 모바일 환경에서 Popup 된 보드에서는 (알 수 없는 이유로) 약 2.5초동안 click 이벤트가 발생하지 않기 때문에, 사용성에 불편을 겪을 수 있기 때문이다.\n *\n * [ caution ] Do not use the click event of the window. The click event should be triggered by judging from the mouseup event.\n * cause. This is because in the mobile environment, the click event does not occur for about 2.5 seconds on the popup board (for unknown reasons), which may cause usability problems.\n */\n\n trigger(target, 'click', e)\n }\n }\n\n this.last_target = null\n\n this.status = STATUS.NORMAL\n\n return false\n }\n\n onmouseout(e) {\n var target = find_target(this.container, e)\n\n /* pre-state */\n switch (this.status) {\n case STATUS.DRAGGING:\n trigger(this.last_target, 'dragend', e)\n break\n\n default:\n if (this.last_target && this.last_target === target) return\n\n if (this.last_enter_target) {\n trigger(this.last_enter_target, 'mouseleave', e)\n delete this.last_enter_target\n }\n }\n\n this.last_target = null\n\n this.status = STATUS.NORMAL\n\n return false\n }\n\n ontouchstart(e) {\n var target = find_target(this.container, e)\n\n this.last_target = target\n this.status = TOUCH_STATUS.TOUCH_START\n\n if (!this.touchPoints) this.touchPoints = []\n\n this.touchPoints.push(e.changedTouches[0])\n\n this.holdTimer = setTimeout(() => {\n this.status = TOUCH_STATUS.NORMAL\n trigger(this.last_target, 'hold', e)\n delete this.holdTimer\n }, TAP_HOLD_INTERVAL)\n\n trigger(target, e.type, e)\n\n return false\n }\n\n ontouchmove(e) {\n if (!(e.touches && e.changedTouches)) {\n /* TODO dragstart의 포인트 포지션을 원래의 포지션으로 보내주어야 한다. */\n trigger(this.last_target, 'dragstart', e)\n trigger(this.last_target, 'dragmove', e)\n return false\n }\n\n var target = find_target(this.container, e)\n /* pre-state */\n switch (this.status) {\n case TOUCH_STATUS.TOUCH_START:\n Array.from(e.changedTouches).forEach(tp => {\n var touchPoint = this.touchPoints.find(p => {\n return p.identifier === tp.identifier\n })\n\n if (!touchPoint) return\n\n var diffX = touchPoint.clientX - tp.clientX\n var diffY = touchPoint.clientY - tp.clientY\n\n if (Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) >= DRAG_THRESHOLD) {\n this.status = TOUCH_STATUS.TOUCH_MOVE\n\n if (this.holdTimer) {\n clearTimeout(this.holdTimer)\n delete this.holdTimer\n }\n return\n }\n })\n break\n case TOUCH_STATUS.TOUCH_MOVE:\n if (this.holdTimer) {\n clearTimeout(this.holdTimer)\n delete this.holdTimer\n }\n\n if (e.changedTouches.length === 2) {\n if (e.scale != undefined && e.scale !== 1 && (e.scale < 0.9 || e.scale > 1.1)) {\n trigger(this.last_target, 'pinch', e)\n return false\n }\n }\n\n trigger(this.last_target, 'pan', e)\n target = this.last_target\n\n break\n\n default:\n if (this.last_enter_target !== target) {\n if (this.last_enter_target) trigger(this.last_enter_target, 'mouseleave', e)\n if (target) trigger(target, 'mouseenter', e)\n this.last_enter_target = target\n }\n\n this.last_target = target\n break\n }\n\n trigger(target, 'touchmove', e)\n\n return false\n }\n\n ontouchend(e) {\n var target = find_target(this.container, e)\n /* pre-state */\n switch (this.status) {\n case TOUCH_STATUS.TOUCH_MOVE:\n target = this.last_target\n break\n\n case TOUCH_STATUS.TOUCH_START:\n var now = performance.now()\n var touchInterval = now - this.touchedAt\n\n if (this.holdTimer) {\n clearTimeout(this.holdTimer)\n delete this.holdTimer\n\n if (touchInterval < DOUBLE_TAP_INTERVAL) trigger(target, 'doubletap', e)\n else trigger(target, 'tap', e)\n\n this.touchedAt = now\n }\n break\n\n default:\n break\n }\n\n trigger(target, 'touchend', e)\n\n var touchPointIndex = this.touchPoints.findIndex(tp => {\n return tp.identifier === e.changedTouches[0].identifier\n })\n\n this.touchPoints.splice(touchPointIndex, 1)\n\n this.last_target = null\n\n this.status = TOUCH_STATUS.NORMAL\n\n return false\n }\n\n onwheel(e) {\n var target = find_target(this.container, e)\n\n trigger(target, e.type, e)\n\n return false\n }\n}\n"],"mappings":"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","ignoreList":[]}
|