@hatiolab/things-scene 9.0.0-beta.2 → 9.0.0-beta.21

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.
Files changed (341) hide show
  1. package/db.sqlite +0 -0
  2. package/dist/animation/animate.d.ts +4 -0
  3. package/dist/animation/animations/animation.d.ts +14 -0
  4. package/dist/animation/animations/fade.d.ts +4 -0
  5. package/dist/animation/animations/heartbeat.d.ts +4 -0
  6. package/dist/animation/animations/moving.d.ts +4 -0
  7. package/dist/animation/animations/outline.d.ts +10 -0
  8. package/dist/animation/animations/rotation.d.ts +4 -0
  9. package/dist/animation/animations/vibration.d.ts +4 -0
  10. package/dist/animation/compile.d.ts +1 -0
  11. package/dist/animation/delta.d.ts +19 -0
  12. package/dist/animation/index.d.ts +1 -0
  13. package/dist/command/command-change.d.ts +7 -0
  14. package/dist/command/command-migrate.d.ts +4 -0
  15. package/dist/command/command-migrate.js +85 -0
  16. package/dist/command/command-migrate.js.map +1 -0
  17. package/dist/command/command.d.ts +5 -0
  18. package/dist/command/snapshot-commander.d.ts +15 -0
  19. package/dist/components/anchor/anchor.d.ts +128 -0
  20. package/dist/components/anchor/ellipse-anchors.d.ts +2 -0
  21. package/dist/components/anchor/ellipse-anchors.js +38 -0
  22. package/dist/components/anchor/ellipse-anchors.js.map +1 -0
  23. package/dist/components/anchor/rect-anchors.d.ts +10 -0
  24. package/dist/components/audio.d.ts +25 -0
  25. package/dist/components/audio.js +141 -0
  26. package/dist/components/audio.js.map +1 -0
  27. package/dist/components/cloud.d.ts +13 -0
  28. package/dist/components/cloud.js +31 -0
  29. package/dist/components/cloud.js.map +1 -0
  30. package/dist/components/component.d.ts +227 -0
  31. package/dist/components/component.js +912 -0
  32. package/dist/components/component.js.map +1 -0
  33. package/dist/components/container-abstract.d.ts +51 -0
  34. package/dist/components/container-abstract.js +372 -0
  35. package/dist/components/container-abstract.js.map +1 -0
  36. package/dist/components/container.d.ts +38 -0
  37. package/dist/components/container.js +75 -0
  38. package/dist/components/container.js.map +1 -0
  39. package/dist/components/data/data-mapping.d.ts +16 -0
  40. package/dist/components/data/data.d.ts +8 -0
  41. package/dist/components/data/evaluator.d.ts +1 -0
  42. package/dist/components/donut.d.ts +15 -0
  43. package/dist/components/donut.js +74 -0
  44. package/dist/components/donut.js.map +1 -0
  45. package/dist/components/drawer/draw-image-pendable.d.ts +1 -0
  46. package/dist/components/drawer/effect.d.ts +1 -0
  47. package/dist/components/drawer/fill.d.ts +14 -0
  48. package/dist/components/drawer/format.d.ts +1 -0
  49. package/dist/components/drawer/line.d.ts +3 -0
  50. package/dist/components/drawer/stroke.d.ts +1 -0
  51. package/dist/components/drawer/text-wrapper.d.ts +10 -0
  52. package/dist/components/drawer/text.d.ts +3 -0
  53. package/dist/components/ellipse.d.ts +35 -0
  54. package/dist/components/ellipse.js +99 -0
  55. package/dist/components/ellipse.js.map +1 -0
  56. package/dist/components/file/ondropfile.d.ts +1 -0
  57. package/dist/components/fit/fit.d.ts +15 -0
  58. package/dist/components/geometry/transcoord.d.ts +41 -0
  59. package/dist/components/geometry/union.d.ts +6 -0
  60. package/dist/components/gif-view.d.ts +18 -0
  61. package/dist/components/gif-view.js +116 -0
  62. package/dist/components/gif-view.js.map +1 -0
  63. package/dist/components/global-ref.d.ts +36 -0
  64. package/dist/components/global-ref.js +128 -0
  65. package/dist/components/global-ref.js.map +1 -0
  66. package/dist/components/group.d.ts +15 -0
  67. package/dist/components/group.js +145 -0
  68. package/dist/components/group.js.map +1 -0
  69. package/dist/components/html/elements.d.ts +2 -0
  70. package/dist/components/html/fill.d.ts +1 -0
  71. package/dist/components/html/reposition.d.ts +1 -0
  72. package/dist/components/html/shadow.d.ts +1 -0
  73. package/dist/components/html-overlay-container.d.ts +27 -0
  74. package/dist/components/html-overlay-container.js +14 -0
  75. package/dist/components/html-overlay-container.js.map +1 -0
  76. package/dist/components/html-overlay-element.d.ts +25 -0
  77. package/dist/components/html-overlay-element.js +9 -0
  78. package/dist/components/html-overlay-element.js.map +1 -0
  79. package/dist/components/image-view.d.ts +19 -0
  80. package/dist/components/image-view.js +180 -0
  81. package/dist/components/image-view.js.map +1 -0
  82. package/dist/components/index.d.ts +32 -0
  83. package/dist/components/index.js +39 -0
  84. package/dist/components/index.js.map +1 -0
  85. package/dist/components/info-window.d.ts +41 -0
  86. package/dist/components/info-window.js +425 -0
  87. package/dist/components/info-window.js.map +1 -0
  88. package/dist/components/line.d.ts +91 -0
  89. package/dist/components/line.js +303 -0
  90. package/dist/components/line.js.map +1 -0
  91. package/dist/components/local-ref.d.ts +47 -0
  92. package/dist/components/local-ref.js +103 -0
  93. package/dist/components/local-ref.js.map +1 -0
  94. package/dist/components/mixins/connectable.d.ts +45 -0
  95. package/dist/components/mixins/data-source.d.ts +9 -0
  96. package/dist/components/mixins/html-element.d.ts +24 -0
  97. package/dist/components/mixins/move-handle.d.ts +11 -0
  98. package/dist/components/mixins/rect-path.d.ts +13 -0
  99. package/dist/components/mixins/value-holder.d.ts +18 -0
  100. package/dist/components/mutater/bounds.d.ts +10 -0
  101. package/dist/components/mutater/path.d.ts +5 -0
  102. package/dist/components/ortholine.d.ts +21 -0
  103. package/dist/components/ortholine.js +814 -0
  104. package/dist/components/ortholine.js.map +1 -0
  105. package/dist/components/outline/ellipse-outline.d.ts +4 -0
  106. package/dist/components/outline/ellipse-outline.js +11 -0
  107. package/dist/components/outline/ellipse-outline.js.map +1 -0
  108. package/dist/components/outline/path-outline.d.ts +1 -0
  109. package/dist/components/path.d.ts +5 -0
  110. package/dist/components/path.js +40 -0
  111. package/dist/components/path.js.map +1 -0
  112. package/dist/components/polygon.d.ts +40 -0
  113. package/dist/components/polygon.js +157 -0
  114. package/dist/components/polygon.js.map +1 -0
  115. package/dist/components/polyline.d.ts +18 -0
  116. package/dist/components/polyline.js +102 -0
  117. package/dist/components/polyline.js.map +1 -0
  118. package/dist/components/popup.d.ts +48 -0
  119. package/dist/components/popup.js +138 -0
  120. package/dist/components/popup.js.map +1 -0
  121. package/dist/components/rect.d.ts +26 -0
  122. package/dist/components/rect.js +91 -0
  123. package/dist/components/rect.js.map +1 -0
  124. package/dist/components/retention/retention-manager.d.ts +8 -0
  125. package/dist/components/root-container.d.ts +90 -0
  126. package/dist/components/root-container.js +478 -0
  127. package/dist/components/root-container.js.map +1 -0
  128. package/dist/components/ruler.d.ts +16 -0
  129. package/dist/components/ruler.js +77 -0
  130. package/dist/components/ruler.js.map +1 -0
  131. package/dist/components/shape.d.ts +25 -0
  132. package/dist/components/shape.js +80 -0
  133. package/dist/components/shape.js.map +1 -0
  134. package/dist/components/star.d.ts +13 -0
  135. package/dist/components/star.js +80 -0
  136. package/dist/components/star.js.map +1 -0
  137. package/dist/components/text/substitutor.d.ts +3 -0
  138. package/dist/components/text.d.ts +8 -0
  139. package/dist/components/text.js +15 -0
  140. package/dist/components/text.js.map +1 -0
  141. package/dist/components/three-container.d.ts +60 -0
  142. package/dist/components/three-container.js +515 -0
  143. package/dist/components/three-container.js.map +1 -0
  144. package/dist/components/triangle.d.ts +15 -0
  145. package/dist/components/triangle.js +76 -0
  146. package/dist/components/triangle.js.map +1 -0
  147. package/dist/const.d.ts +39 -0
  148. package/dist/core/collection.d.ts +8 -0
  149. package/dist/core/debug.d.ts +1 -0
  150. package/dist/core/deep-equals.d.ts +1 -0
  151. package/dist/core/dom-to-image.d.ts +127 -0
  152. package/dist/core/event.d.ts +92 -0
  153. package/dist/core/index.d.ts +2 -0
  154. package/dist/core/list.d.ts +32 -0
  155. package/dist/core/logger.d.ts +3 -0
  156. package/dist/core/memoize.d.ts +6 -0
  157. package/dist/core/mixin.d.ts +1 -0
  158. package/dist/core/obj-accessor.d.ts +1 -0
  159. package/dist/core/reference-map.d.ts +14 -0
  160. package/dist/core/round-rect.d.ts +19 -0
  161. package/dist/core/script-loader.d.ts +3 -0
  162. package/dist/core/snapshot-taker.d.ts +12 -0
  163. package/dist/core/stack.d.ts +2 -0
  164. package/dist/core/timecapsule.d.ts +18 -0
  165. package/dist/core/utils.d.ts +9 -0
  166. package/dist/decorator/anchors-decorator.d.ts +31 -0
  167. package/dist/decorator/data-spread-decorator.d.ts +1 -0
  168. package/dist/decorator/decotag-decorator.d.ts +1 -0
  169. package/dist/decorator/index.d.ts +2 -0
  170. package/dist/decorator/link-decorator.d.ts +1 -0
  171. package/dist/effect/gradation.d.ts +1 -0
  172. package/dist/effect/index.d.ts +1 -0
  173. package/dist/effect/shadow.d.ts +2 -0
  174. package/dist/effect/turn.d.ts +1 -0
  175. package/dist/event/event-engine.d.ts +12 -0
  176. package/dist/event/event-pump.d.ts +11 -0
  177. package/dist/event/event-tracker.d.ts +21 -0
  178. package/dist/event/index.d.ts +2 -0
  179. package/dist/event/ua-event-handler.d.ts +32 -0
  180. package/dist/event-map/event-map.d.ts +9 -0
  181. package/dist/event-map/index.d.ts +1 -0
  182. package/dist/event-map/move-handler.d.ts +1 -0
  183. package/dist/event-map/text-editor-lite.d.ts +1 -0
  184. package/dist/index.d.ts +1 -0
  185. package/dist/index.js +3 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/layer/action/emphasize.d.ts +2 -0
  188. package/dist/layer/action/popup.d.ts +5 -0
  189. package/dist/layer/action/pressed.d.ts +2 -0
  190. package/dist/layer/add-layer.d.ts +42 -0
  191. package/dist/layer/add-layer.js +142 -0
  192. package/dist/layer/add-layer.js.map +1 -0
  193. package/dist/layer/decotag-layer.d.ts +27 -0
  194. package/dist/layer/decotag-layer.js +105 -0
  195. package/dist/layer/decotag-layer.js.map +1 -0
  196. package/dist/layer/guide-layer.d.ts +44 -0
  197. package/dist/layer/guide-layer.js +261 -0
  198. package/dist/layer/guide-layer.js.map +1 -0
  199. package/dist/layer/index.d.ts +7 -0
  200. package/dist/layer/index.js +11 -0
  201. package/dist/layer/index.js.map +1 -0
  202. package/dist/layer/layer.d.ts +32 -0
  203. package/dist/layer/layer.js +155 -0
  204. package/dist/layer/layer.js.map +1 -0
  205. package/dist/layer/model-layer.d.ts +46 -0
  206. package/dist/layer/model-layer.js +402 -0
  207. package/dist/layer/model-layer.js.map +1 -0
  208. package/dist/layer/modeler/anchor-handler.d.ts +36 -0
  209. package/dist/layer/modeler/control-handler.d.ts +18 -0
  210. package/dist/layer/modeler/focus-outline.d.ts +5 -0
  211. package/dist/layer/modeler/group-outline.d.ts +5 -0
  212. package/dist/layer/modeler/index.d.ts +7 -0
  213. package/dist/layer/modeler/path-handler.d.ts +22 -0
  214. package/dist/layer/modeler/resizer.d.ts +13 -0
  215. package/dist/layer/modeler/rotator.d.ts +15 -0
  216. package/dist/layer/modeler/rotator.js +120 -0
  217. package/dist/layer/modeler/rotator.js.map +1 -0
  218. package/dist/layer/modeling-layer.d.ts +66 -0
  219. package/dist/layer/modeling-layer.js +451 -0
  220. package/dist/layer/modeling-layer.js.map +1 -0
  221. package/dist/layer/selection/selected-finder.d.ts +1 -0
  222. package/dist/layer/selection-layer.d.ts +42 -0
  223. package/dist/layer/selection-layer.js +307 -0
  224. package/dist/layer/selection-layer.js.map +1 -0
  225. package/dist/layer/shift-layer.d.ts +18 -0
  226. package/dist/layer/shift-layer.js +61 -0
  227. package/dist/layer/shift-layer.js.map +1 -0
  228. package/dist/layout/absolute.d.ts +8 -0
  229. package/dist/layout/card.d.ts +7 -0
  230. package/dist/layout/html-absolute.d.ts +8 -0
  231. package/dist/layout/index.d.ts +8 -0
  232. package/dist/layout/index.js +12 -0
  233. package/dist/layout/index.js.map +1 -0
  234. package/dist/layout/layout.d.ts +11 -0
  235. package/dist/layout/linear-horizontal.d.ts +7 -0
  236. package/dist/layout/linear-vertical.d.ts +7 -0
  237. package/dist/layout/table.d.ts +9 -0
  238. package/dist/layout/three.d.ts +8 -0
  239. package/dist/layout/three.js +20 -0
  240. package/dist/layout/three.js.map +1 -0
  241. package/dist/license/license.d.ts +18 -0
  242. package/dist/model/compile.d.ts +1 -0
  243. package/dist/model/compile.js +28 -0
  244. package/dist/model/compile.js.map +1 -0
  245. package/dist/model/duplicate.d.ts +1 -0
  246. package/dist/model/index.d.ts +3 -0
  247. package/dist/model/selector.d.ts +2 -0
  248. package/dist/style/compile.d.ts +1 -0
  249. package/dist/style/index.d.ts +1 -0
  250. package/dist/things-scene/api/add-start.d.ts +1 -0
  251. package/dist/things-scene/api/add.d.ts +5 -0
  252. package/dist/things-scene/api/align.d.ts +1 -0
  253. package/dist/things-scene/api/change.d.ts +2 -0
  254. package/dist/things-scene/api/clipboard.d.ts +3 -0
  255. package/dist/things-scene/api/distribute.d.ts +1 -0
  256. package/dist/things-scene/api/duplicate.d.ts +4 -0
  257. package/dist/things-scene/api/fullscreen.d.ts +1 -0
  258. package/dist/things-scene/api/group.d.ts +8 -0
  259. package/dist/things-scene/api/group.js +78 -0
  260. package/dist/things-scene/api/group.js.map +1 -0
  261. package/dist/things-scene/api/ids.d.ts +4 -0
  262. package/dist/things-scene/api/index.d.ts +15 -0
  263. package/dist/things-scene/api/listener.d.ts +3 -0
  264. package/dist/things-scene/api/remove.d.ts +4 -0
  265. package/dist/things-scene/api/symmetry.d.ts +2 -0
  266. package/dist/things-scene/api/symmetry.js +39 -0
  267. package/dist/things-scene/api/symmetry.js.map +1 -0
  268. package/dist/things-scene/api/to-data-url.d.ts +1 -0
  269. package/dist/things-scene/api/to-data-url.js +69 -0
  270. package/dist/things-scene/api/to-data-url.js.map +1 -0
  271. package/dist/things-scene/api/zorder.d.ts +2 -0
  272. package/dist/things-scene/application-context.d.ts +40 -0
  273. package/dist/things-scene/config.d.ts +4 -0
  274. package/dist/things-scene/create.d.ts +20 -0
  275. package/dist/things-scene/fps.d.ts +1 -0
  276. package/dist/things-scene/index.d.ts +17 -0
  277. package/dist/things-scene/index.js +23 -0
  278. package/dist/things-scene/index.js.map +1 -0
  279. package/dist/things-scene/polyfill.d.ts +2 -0
  280. package/dist/things-scene/scene.d.ts +155 -0
  281. package/dist/things-scene/version.d.ts +2 -0
  282. package/dist/threed/common.d.ts +22 -0
  283. package/dist/threed/control/three-controls.d.ts +11 -0
  284. package/dist/threed/control/three-controls.js +620 -0
  285. package/dist/threed/control/three-controls.js.map +1 -0
  286. package/dist/threed/html/elements.d.ts +2 -0
  287. package/dist/threed/real-object-camera-meshed.d.ts +12 -0
  288. package/dist/threed/real-object-camera-meshed.js +49 -0
  289. package/dist/threed/real-object-camera-meshed.js.map +1 -0
  290. package/dist/threed/real-object-camera.d.ts +9 -0
  291. package/dist/threed/real-object-camera.js +31 -0
  292. package/dist/threed/real-object-camera.js.map +1 -0
  293. package/dist/threed/real-object-dom-element.d.ts +20 -0
  294. package/dist/threed/real-object-dom-element.js +78 -0
  295. package/dist/threed/real-object-dom-element.js.map +1 -0
  296. package/dist/threed/real-object-dummy.d.ts +6 -0
  297. package/dist/threed/real-object-dummy.js +11 -0
  298. package/dist/threed/real-object-dummy.js.map +1 -0
  299. package/dist/threed/real-object-extrude.d.ts +19 -0
  300. package/dist/threed/real-object-extrude.js +171 -0
  301. package/dist/threed/real-object-extrude.js.map +1 -0
  302. package/dist/threed/real-object-gltf.d.ts +15 -0
  303. package/dist/threed/real-object-gltf.js +97 -0
  304. package/dist/threed/real-object-gltf.js.map +1 -0
  305. package/dist/threed/real-object-group.d.ts +5 -0
  306. package/dist/threed/real-object-group.js +11 -0
  307. package/dist/threed/real-object-group.js.map +1 -0
  308. package/dist/threed/real-object-mesh.d.ts +11 -0
  309. package/dist/threed/real-object-mesh.js +55 -0
  310. package/dist/threed/real-object-mesh.js.map +1 -0
  311. package/dist/threed/real-object-plane.d.ts +6 -0
  312. package/dist/threed/real-object-plane.js +23 -0
  313. package/dist/threed/real-object-plane.js.map +1 -0
  314. package/dist/threed/real-object-scene.d.ts +21 -0
  315. package/dist/threed/real-object-scene.js +89 -0
  316. package/dist/threed/real-object-scene.js.map +1 -0
  317. package/dist/threed/real-object-sprite.d.ts +12 -0
  318. package/dist/threed/real-object-sprite.js +35 -0
  319. package/dist/threed/real-object-sprite.js.map +1 -0
  320. package/dist/threed/real-object-text.d.ts +16 -0
  321. package/dist/threed/real-object-text.js +70 -0
  322. package/dist/threed/real-object-text.js.map +1 -0
  323. package/dist/threed/real-object.d.ts +48 -0
  324. package/dist/threed/real-object.js +199 -0
  325. package/dist/threed/real-object.js.map +1 -0
  326. package/dist/threed/texture/text-texture.d.ts +8 -0
  327. package/dist/threed/three-dimensional-container.d.ts +7 -0
  328. package/dist/threed/three-dimensional-container.js +2 -0
  329. package/dist/threed/three-dimensional-container.js.map +1 -0
  330. package/dist/threed/utils/bound-uv-generator.d.ts +16 -0
  331. package/dist/types.d.ts +53 -0
  332. package/dist/types.js +368 -0
  333. package/dist/types.js.map +1 -0
  334. package/package.json +5 -2
  335. package/schema.graphql +5 -0
  336. package/things-scene-ie.js +1 -1
  337. package/things-scene-ie.js.LICENSE.txt +22 -0
  338. package/things-scene-min.js +1 -1
  339. package/things-scene-min.js.LICENSE.txt +22 -0
  340. package/things-scene.d.ts +13 -1
  341. package/things-scene.mjs +34 -14
@@ -0,0 +1,120 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import Component from '../../components/component';
5
+ import CommandChange from '../../command/command-change';
6
+ const ROTATION_HANDLE_RADIUS = 4;
7
+ const ROTATION_HANDLE_HEIGHT = 20;
8
+ const THETA_360 = Math.PI * 2;
9
+ const THETA_90 = Math.PI / 2;
10
+ /*
11
+ * 컴포넌트의 회전 핸들은 컴포넌트 바운드의 탑라인 중앙 상단에 위치한다.
12
+ */
13
+ function getRotateHandle(component, scale) {
14
+ var bounds = component.bounds;
15
+ return {
16
+ x: bounds.left + bounds.width / 2,
17
+ y: bounds.top - ROTATION_HANDLE_HEIGHT / scale.y
18
+ };
19
+ }
20
+ export default class Rotator {
21
+ constructor(layer) {
22
+ this.layer = layer;
23
+ }
24
+ reset() {
25
+ // 현재 선택된 로테이트 핸들의 정보
26
+ this.active = null;
27
+ }
28
+ get selected() {
29
+ return this.layer.selected;
30
+ }
31
+ contains(x, y, component, scale) {
32
+ if (!component.rotatable)
33
+ return false;
34
+ // 좌표가 회전 핸들에 포함되어있는지 확인함.
35
+ var handle = getRotateHandle(component, scale);
36
+ if (Math.abs(x - handle.x) <= ROTATION_HANDLE_RADIUS / scale.x &&
37
+ Math.abs(y - handle.y) <= ROTATION_HANDLE_RADIUS / scale.y) {
38
+ // 현재 선택된 로테이트 핸들의 정보
39
+ this.active = { component };
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ draw(context, component, scale) {
45
+ if (!component.rotatable)
46
+ return;
47
+ context.beginPath();
48
+ var rh = getRotateHandle(component, scale);
49
+ context.lineWidth = 1.5 / scale.x;
50
+ context.moveTo(rh.x, rh.y + ROTATION_HANDLE_HEIGHT / scale.y);
51
+ context.lineTo(rh.x, rh.y);
52
+ context.strokeStyle = '#656565';
53
+ context.stroke();
54
+ context.beginPath();
55
+ context.ellipse(rh.x, rh.y, ROTATION_HANDLE_RADIUS / scale.x, ROTATION_HANDLE_RADIUS / scale.y, 0, 0, THETA_360, true);
56
+ context.stroke();
57
+ context.fillStyle = '#fff';
58
+ context.fill();
59
+ var active = this.active;
60
+ if (active && active.component === component) {
61
+ context.strokeStyle = '#fa7703';
62
+ context.stroke();
63
+ if (active.toFill) {
64
+ context.fillStyle = '#ffb80c';
65
+ context.fill();
66
+ }
67
+ }
68
+ }
69
+ onmousedown(e) {
70
+ this.active.toFill = true;
71
+ }
72
+ ondragstart(e) {
73
+ var active = this.active;
74
+ var component = active.component;
75
+ active.start_rotation = active.component.get('rotation');
76
+ active.rotations = this.layer.selected.filter(c => c.rotatable).map(c => c.get('rotation'));
77
+ }
78
+ ondragmove(e) {
79
+ /* 로테이트 핸들의 이동을 처리한다. */
80
+ var { component } = this.active;
81
+ // 회전을 시키려는 대상 컴포넌트의 중심점과 이벤트 포인트와의 각도가 중요하므로,
82
+ // 컴포넌트 스케일과 회전이 감안되지 않은 부모의 좌표로 변환하여 계산한다.
83
+ var point = component.transcoordC2S(e.offsetX, e.offsetY);
84
+ point = component.transcoordS2P(point.x, point.y);
85
+ var rotatePoint = component.rotatePoint;
86
+ var oldTheta = component.get('rotation') || 0;
87
+ var newTheta = Math.atan((rotatePoint.y - point.y) / (rotatePoint.x - point.x));
88
+ newTheta = rotatePoint.x >= point.x ? newTheta - THETA_90 : THETA_90 + newTheta;
89
+ var deltaTheta = newTheta - oldTheta;
90
+ this.layer.selected
91
+ .filter(c => c.rotatable)
92
+ .forEach((c, i) => {
93
+ /* 최초의 바운드로 되돌려놓고 다시 계산한다. */
94
+ let rotation = ((c.get('rotation') || 0) + deltaTheta) % THETA_360;
95
+ c.set('rotation', c.adjustRotation(rotation, e.shiftKey));
96
+ });
97
+ }
98
+ ondragend(e) {
99
+ var { component, rotations } = this.active;
100
+ // var command = new CommandChange({
101
+ // changes: this.layer.selected.filter(c => {
102
+ // return c.rotatable
103
+ // }).map((c, i) => {
104
+ // return {
105
+ // component: c,
106
+ // before: {
107
+ // rotation: rotations[i]
108
+ // },
109
+ // after: {
110
+ // rotation: c.get('rotation')
111
+ // }
112
+ // }
113
+ // })
114
+ // })
115
+ /* 커맨더 큐에 넣기만하고, 실행하지는 말라.(이미 실행된 상태이므로) */
116
+ // component.app.commander.execute(command, false)
117
+ component.app.commander.execute(null, false);
118
+ }
119
+ }
120
+ //# sourceMappingURL=rotator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotator.js","sourceRoot":"","sources":["../../../src/layer/modeler/rotator.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport Component from '../../components/component'\nimport CommandChange from '../../command/command-change'\n\nconst ROTATION_HANDLE_RADIUS = 4\nconst ROTATION_HANDLE_HEIGHT = 20\n\nconst THETA_360 = Math.PI * 2\nconst THETA_90 = Math.PI / 2\n\n/*\n * 컴포넌트의 회전 핸들은 컴포넌트 바운드의 탑라인 중앙 상단에 위치한다.\n */\nfunction getRotateHandle(component, scale) {\n var bounds = component.bounds\n\n return {\n x: bounds.left + bounds.width / 2,\n y: bounds.top - ROTATION_HANDLE_HEIGHT / scale.y\n }\n}\n\nexport default class Rotator {\n constructor(layer) {\n this.layer = layer\n }\n\n reset() {\n // 현재 선택된 로테이트 핸들의 정보\n this.active = null\n }\n\n get selected() {\n return this.layer.selected\n }\n\n contains(x, y, component, scale) {\n if (!component.rotatable) return false\n\n // 좌표가 회전 핸들에 포함되어있는지 확인함.\n var handle = getRotateHandle(component, scale)\n\n if (\n Math.abs(x - handle.x) <= ROTATION_HANDLE_RADIUS / scale.x &&\n Math.abs(y - handle.y) <= ROTATION_HANDLE_RADIUS / scale.y\n ) {\n // 현재 선택된 로테이트 핸들의 정보\n this.active = { component }\n return true\n }\n\n return false\n }\n\n draw(context, component, scale) {\n if (!component.rotatable) return\n\n context.beginPath()\n\n var rh = getRotateHandle(component, scale)\n context.lineWidth = 1.5 / scale.x\n context.moveTo(rh.x, rh.y + ROTATION_HANDLE_HEIGHT / scale.y)\n context.lineTo(rh.x, rh.y)\n\n context.strokeStyle = '#656565'\n context.stroke()\n\n context.beginPath()\n context.ellipse(\n rh.x,\n rh.y,\n ROTATION_HANDLE_RADIUS / scale.x,\n ROTATION_HANDLE_RADIUS / scale.y,\n 0,\n 0,\n THETA_360,\n true\n )\n\n context.stroke()\n context.fillStyle = '#fff'\n context.fill()\n\n var active = this.active\n\n if (active && active.component === component) {\n context.strokeStyle = '#fa7703'\n context.stroke()\n\n if (active.toFill) {\n context.fillStyle = '#ffb80c'\n context.fill()\n }\n }\n }\n\n onmousedown(e) {\n this.active.toFill = true\n }\n\n ondragstart(e) {\n var active = this.active\n var component = active.component\n\n active.start_rotation = active.component.get('rotation')\n active.rotations = this.layer.selected.filter(c => c.rotatable).map(c => c.get('rotation'))\n }\n\n ondragmove(e) {\n /* 로테이트 핸들의 이동을 처리한다. */\n var { component } = this.active\n\n // 회전을 시키려는 대상 컴포넌트의 중심점과 이벤트 포인트와의 각도가 중요하므로,\n // 컴포넌트 스케일과 회전이 감안되지 않은 부모의 좌표로 변환하여 계산한다.\n\n var point = component.transcoordC2S(e.offsetX, e.offsetY)\n point = component.transcoordS2P(point.x, point.y)\n\n var rotatePoint = component.rotatePoint\n\n var oldTheta = component.get('rotation') || 0\n var newTheta = Math.atan((rotatePoint.y - point.y) / (rotatePoint.x - point.x))\n newTheta = rotatePoint.x >= point.x ? newTheta - THETA_90 : THETA_90 + newTheta\n\n var deltaTheta = newTheta - oldTheta\n\n this.layer.selected\n .filter(c => c.rotatable)\n .forEach((c, i) => {\n /* 최초의 바운드로 되돌려놓고 다시 계산한다. */\n let rotation = ((c.get('rotation') || 0) + deltaTheta) % THETA_360\n c.set('rotation', c.adjustRotation(rotation, e.shiftKey))\n })\n }\n\n ondragend(e) {\n var { component, rotations } = this.active\n\n // var command = new CommandChange({\n // changes: this.layer.selected.filter(c => {\n // return c.rotatable\n // }).map((c, i) => {\n // return {\n // component: c,\n // before: {\n // rotation: rotations[i]\n // },\n // after: {\n // rotation: c.get('rotation')\n // }\n // }\n // })\n // })\n\n /* 커맨더 큐에 넣기만하고, 실행하지는 말라.(이미 실행된 상태이므로) */\n // component.app.commander.execute(command, false)\n component.app.commander.execute(null, false)\n }\n}\n"]}
@@ -0,0 +1,66 @@
1
+ export default class ModelingLayer extends Layer {
2
+ pathHandler: Modeler.PathHandler;
3
+ _modelers: (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
4
+ _control_mode_modelers: (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
5
+ focusOutline: Modeler.FocusOutline;
6
+ groupOutline: Modeler.GroupOutline;
7
+ anchorHandler: Modeler.AnchorHandler;
8
+ _reversed_modelers: (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
9
+ _control_mode_reverse_modelers: (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
10
+ set hovered(arg: any);
11
+ get hovered(): any;
12
+ hoveredDest: any;
13
+ get modelers(): (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
14
+ get reversedModelers(): (Modeler.ControlHandler | Modeler.PathHandler | Modeler.Resizer | Modeler.Rotator)[];
15
+ ready(): void;
16
+ currentModeler: Modeler.ControlHandler | Modeler.PathHandler | Modeler.AnchorHandler | Modeler.Resizer | Modeler.Rotator | null | undefined;
17
+ _componentDrawer(context: any, component: any, scale: any, logic: any): void;
18
+ set anchorTarget(arg: any);
19
+ get anchorTarget(): any;
20
+ _anchorTarget: any;
21
+ _hovered: any;
22
+ startLinkProcess(linkFrom: any, linkModel: any, e: any): void;
23
+ processingLink: any;
24
+ set counterEnd(arg: any);
25
+ get counterEnd(): any;
26
+ _counter_end: any;
27
+ endLinkProcess(): void;
28
+ get eventMap(): {
29
+ 'model-layer': {
30
+ '(all)': {
31
+ change: (after: any, before: any, hint: any) => void;
32
+ wheel: (e: any, hint: any) => void;
33
+ drop: (e: any, hint: any) => void;
34
+ };
35
+ '(descendant)': {
36
+ mouseenter: (e: any, hint: any) => void;
37
+ mouseleave: (e: any, hint: any) => void;
38
+ };
39
+ };
40
+ '(root)': {
41
+ '(self)': {
42
+ selected: (after: any, before: any) => void;
43
+ keydown: (e: any) => void;
44
+ keyup: (e: any) => void;
45
+ };
46
+ };
47
+ };
48
+ onmouseenter(e: any, hint: any): void;
49
+ onmouseleave(e: any, hint: any): void;
50
+ onkeydown(e: any): void;
51
+ _control_mode: boolean | undefined;
52
+ onkeyup(e: any): void;
53
+ onselected(after: any, before: any): void;
54
+ onchange_model(after: any, before: any, hint: any): void;
55
+ ondblclick(e: any): void;
56
+ onmousedown(e: any): void;
57
+ onmouseup(e: any): void;
58
+ ondragstart(e: any): void;
59
+ _state_dragging: boolean | undefined;
60
+ ondragmove(e: any): void;
61
+ ondragend(e: any): void;
62
+ ondrop(e: any, hint: any): void;
63
+ onwheel_scale(e: any, hint: any): void;
64
+ }
65
+ import Layer from "./layer";
66
+ import * as Modeler from "./modeler";
@@ -0,0 +1,451 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import CommandChange from '../command/command-change';
5
+ import CommandMigrate from '../command/command-migrate';
6
+ import Component from '../components/component';
7
+ import * as Const from '../const';
8
+ import compile from '../model/compile';
9
+ import Layer from './layer';
10
+ import * as Modeler from './modeler';
11
+ export default class ModelingLayer extends Layer {
12
+ constructor(model, context) {
13
+ super(model, context);
14
+ this.pathHandler = new Modeler.PathHandler(this);
15
+ var ph = this.pathHandler;
16
+ var ch = new Modeler.ControlHandler(this);
17
+ var rs = new Modeler.Resizer(this);
18
+ var rt = new Modeler.Rotator(this);
19
+ this._modelers = [ph, ch, rs, rt];
20
+ this._control_mode_modelers = [ch, ph, rs, rt];
21
+ this.focusOutline = new Modeler.FocusOutline(this);
22
+ this.groupOutline = new Modeler.GroupOutline(this);
23
+ this.anchorHandler = new Modeler.AnchorHandler(this);
24
+ // 그릴 때는 contains 순서의 역순으로 그린다.
25
+ this._reversed_modelers = this._modelers.slice().reverse();
26
+ this._control_mode_reverse_modelers = this._control_mode_modelers.slice().reverse();
27
+ this.hovered = null;
28
+ this.hoveredDest = null;
29
+ }
30
+ get modelers() {
31
+ return this._control_mode ? this._control_mode_modelers : this._modelers;
32
+ }
33
+ get reversedModelers() {
34
+ return this._control_mode ? this._control_mode_reverse_modelers : this._reversed_modelers;
35
+ }
36
+ // Lifecycle
37
+ ready() {
38
+ super.ready();
39
+ var rootModel = this.rootModel;
40
+ var translate = rootModel.get('translate');
41
+ var scale = rootModel.get('scale');
42
+ this.set('translate', translate);
43
+ this.set('scale', scale);
44
+ }
45
+ contains(x, y) {
46
+ var components = this.selected.filter(c => !!c.parent);
47
+ var scale = this.get('scale') || { x: 1, y: 1 };
48
+ if (this._state_dragging) {
49
+ if (this._counter_end) {
50
+ let point = this.anchorTarget.transcoordT2S(x, y);
51
+ if (this.anchorHandler.contains(point.x, point.y, this.anchorTarget, scale)) {
52
+ return true;
53
+ }
54
+ }
55
+ return true;
56
+ }
57
+ this.modelers.forEach(modeler => modeler.reset());
58
+ /*
59
+ * 부모가 있는 컴포넌트만을 그린다.
60
+ * (selected에는 남아있을 수 있으나, undo에 의해서 이미 제거된 것일 수 있다.)
61
+ */
62
+ var components = this.selected.filter(c => !!c.parent);
63
+ for (let i = 0; i < components.length; i++) {
64
+ let component = components[i];
65
+ let point = component.transcoordT2S(x, y);
66
+ for (let j = 0; j < this.modelers.length; j++) {
67
+ let modeler = this.modelers[j];
68
+ if (modeler.contains(point.x, point.y, component, scale)) {
69
+ this.currentModeler = modeler;
70
+ return true;
71
+ }
72
+ }
73
+ }
74
+ if (this.anchorTarget) {
75
+ let point = this.anchorTarget.transcoordT2S(x, y);
76
+ if (this.anchorHandler.contains(point.x, point.y, this.anchorTarget, scale)) {
77
+ this.currentModeler = this.anchorHandler;
78
+ return true;
79
+ }
80
+ }
81
+ else {
82
+ this.anchorHandler.reset();
83
+ }
84
+ this.currentModeler = null;
85
+ return false;
86
+ }
87
+ _componentDrawer(context, component, scale, logic) {
88
+ let ancester = [];
89
+ let parent = component.parent;
90
+ if (component.isRootModel()) {
91
+ context.save();
92
+ logic(context, component, scale);
93
+ context.restore();
94
+ return;
95
+ }
96
+ while (parent && !parent.isRootModel()) {
97
+ ancester.push(parent);
98
+ parent = parent.parent;
99
+ }
100
+ context.save();
101
+ ancester.reverse().forEach(function (parent) {
102
+ // 원점으로 이동하여 회전.
103
+ let rotatePoint = parent.rotatePoint;
104
+ context.translate(rotatePoint.x, rotatePoint.y);
105
+ let parent_scale = parent.get('scale');
106
+ if (parent_scale)
107
+ context.scale(parent_scale.x, parent_scale.y);
108
+ context.rotate(parent.get('rotation'));
109
+ context.translate(-rotatePoint.x, -rotatePoint.y);
110
+ let bounds = parent.bounds;
111
+ context.translate(bounds.left, bounds.top);
112
+ });
113
+ let rotatePoint = component.rotatePoint;
114
+ context.translate(rotatePoint.x, rotatePoint.y);
115
+ let component_scale = component.get('scale');
116
+ if (component_scale)
117
+ context.scale(component_scale.x, component_scale.y);
118
+ context.rotate(component.get('rotation'));
119
+ context.translate(-rotatePoint.x, -rotatePoint.y);
120
+ logic(context, component, scale);
121
+ context.restore();
122
+ }
123
+ prerender(context) {
124
+ var { translate, scale = { x: 1, y: 1 }, rotation } = this.model;
125
+ // Scene 모델 바깥쪽을 표현하기 위해서, 먼저 전체 바탕을 회색으로 칠한다.
126
+ context.save();
127
+ context.beginPath();
128
+ context.clearRect(0, 0, context.canvas.width, context.canvas.height);
129
+ context.rect(0, 0, context.canvas.width, context.canvas.height);
130
+ context.fillStyle = 'black';
131
+ context.globalAlpha = 0.5;
132
+ context.fill();
133
+ context.restore();
134
+ translate && context.translate(translate.x * Const.DPPX, translate.y * Const.DPPX);
135
+ context.scale(scale.x * Const.DPPX, scale.y * Const.DPPX);
136
+ rotation && context.rotate(rotation);
137
+ context.clearRect(0, 0, this.rootModel.get('width'), this.rootModel.get('height'));
138
+ }
139
+ render(context) {
140
+ context.beginPath();
141
+ var scale = this.get('scale') || { x: 1, y: 1 };
142
+ /*
143
+ * 부모가 있는 컴포넌트만을 그린다.
144
+ * (selected에는 남아있을 수 있으나, undo에 의해서 이미 제거된 것일 수 있다.)
145
+ */
146
+ var selected = this.selected.filter(c => !!c.parent);
147
+ if (this.focused) {
148
+ this._componentDrawer(context, this.focused, scale, (context, component, scale) => {
149
+ this.focusOutline.draw(context, component, scale);
150
+ });
151
+ }
152
+ /* TODO selected의 부모가 group인 경우에 최상위 그룹의 모델링 레이아웃을 그려주어야 한다. */
153
+ if (selected.length > 0 && selected[0].parent.isGroup()) {
154
+ let rootGroup = selected[0].parent;
155
+ while (rootGroup.parent.isGroup())
156
+ rootGroup = rootGroup.parent;
157
+ this._componentDrawer(context, rootGroup, scale, (context, component, scale) => {
158
+ this.groupOutline.draw(context, component, scale);
159
+ });
160
+ }
161
+ selected.forEach(component => {
162
+ this._componentDrawer(context, component, scale, (context, component, scale) => {
163
+ this.reversedModelers.forEach(modeler => modeler.draw(context, component, scale));
164
+ });
165
+ });
166
+ this.anchorTarget &&
167
+ this._componentDrawer(context, this.anchorTarget, scale, (context, component, scale) => {
168
+ this.anchorHandler.draw(context, component, scale);
169
+ });
170
+ }
171
+ get anchorTarget() {
172
+ var _a;
173
+ if (this.currentModeler !== this.anchorHandler &&
174
+ this.currentModeler !== this.pathHandler &&
175
+ !((_a = this.hovered) === null || _a === void 0 ? void 0 : _a.isLine())) {
176
+ this._anchorTarget = this.hovered;
177
+ }
178
+ return this._anchorTarget;
179
+ }
180
+ set anchorTarget(target) {
181
+ this._anchorTarget = target;
182
+ }
183
+ get hovered() {
184
+ return this._hovered;
185
+ }
186
+ set hovered(hovered) {
187
+ this._hovered = hovered;
188
+ this.invalidate();
189
+ }
190
+ startLinkProcess(linkFrom, linkModel, e) {
191
+ this.currentModeler = this.pathHandler;
192
+ this.processingLink = this.pathHandler.startLinkProcess(linkFrom, linkModel, e);
193
+ this.counterEnd = this.processingLink.fromEnd;
194
+ this.processingLink.trigger('tag');
195
+ }
196
+ set counterEnd(anchor) {
197
+ this.currentModeler = this.pathHandler;
198
+ this._counter_end = anchor;
199
+ }
200
+ get counterEnd() {
201
+ return this._counter_end;
202
+ }
203
+ endLinkProcess() {
204
+ var _a;
205
+ (_a = this.processingLink) === null || _a === void 0 ? void 0 : _a.trigger('tagreset');
206
+ this.processingLink = null;
207
+ this._counter_end = null;
208
+ }
209
+ get eventMap() {
210
+ return {
211
+ 'model-layer': {
212
+ '(all)': {
213
+ change: this.onchange_model,
214
+ wheel: this.onwheel_scale,
215
+ drop: this.ondrop
216
+ },
217
+ '(descendant)': {
218
+ mouseenter: this.onmouseenter,
219
+ mouseleave: this.onmouseleave
220
+ }
221
+ },
222
+ '(root)': {
223
+ '(self)': {
224
+ selected: this.onselected,
225
+ keydown: this.onkeydown,
226
+ keyup: this.onkeyup
227
+ }
228
+ }
229
+ };
230
+ }
231
+ onmouseenter(e, hint) {
232
+ this.hovered = hint === null || hint === void 0 ? void 0 : hint.origin;
233
+ }
234
+ onmouseleave(e, hint) {
235
+ this.hovered = null;
236
+ }
237
+ onkeydown(e) {
238
+ if (e.key == 'Alt') {
239
+ this._control_mode = true;
240
+ this.invalidate();
241
+ }
242
+ }
243
+ onkeyup(e) {
244
+ if (e.key == 'Alt') {
245
+ this._control_mode = false;
246
+ this.invalidate();
247
+ }
248
+ }
249
+ onselected(after, before) {
250
+ this.invalidate();
251
+ }
252
+ onchange_model(after, before, hint) {
253
+ var { origin, deliverer } = hint;
254
+ if (origin === deliverer) {
255
+ if (after.translate)
256
+ // Model Base 레이어와 동일한 translate를 유지하도록 한다.
257
+ this.set('translate', after.translate);
258
+ if (after.rotation !== undefined)
259
+ // Model Base 레이어와 동일한 rotation을 유지하도록 한다.
260
+ this.set('rotation', after.rotation);
261
+ if (after.scale)
262
+ // Model Base 레이어와 동일한 scale을 유지하도록 한다.
263
+ this.set('scale', after.scale);
264
+ }
265
+ // Model Base 레이어에서 발생하는 대부분의 변화는 Selection 레이어에서도 반영해야한다.
266
+ this.invalidate();
267
+ }
268
+ /* default UI Event Handlers. */
269
+ ondblclick(e) {
270
+ if (typeof this.currentModeler.ondblclick === 'function')
271
+ this.currentModeler.ondblclick(e);
272
+ this.invalidate();
273
+ }
274
+ onmousedown(e) {
275
+ this.currentModeler.onmousedown(e);
276
+ this.invalidate();
277
+ }
278
+ onmouseup(e) {
279
+ if (typeof this.currentModeler.onmouseup === 'function')
280
+ this.currentModeler.onmouseup(e);
281
+ this.invalidate();
282
+ }
283
+ ondragstart(e) {
284
+ this.currentModeler.ondragstart(e);
285
+ this._state_dragging = true;
286
+ }
287
+ ondragmove(e) {
288
+ this.currentModeler.ondragmove(e);
289
+ this.invalidate();
290
+ }
291
+ ondragend(e) {
292
+ this._state_dragging = false;
293
+ this.currentModeler.ondragend(e);
294
+ this.invalidate();
295
+ }
296
+ ondrop(e, hint) {
297
+ /* 현재는 이미지 파일 만 추가할 수 있음 */
298
+ var { origin } = hint;
299
+ var transfered = e.dataTransfer.files;
300
+ if (transfered.length < 1)
301
+ return;
302
+ let center = this.rootModel.transcoordC2S(e.offsetX, e.offsetY);
303
+ let rootModel = this.rootModel;
304
+ Promise.all(Array.from(transfered).map(file => {
305
+ return new Promise((resolve, reject) => {
306
+ let reader = new FileReader();
307
+ reader.addEventListener('loadend', e => {
308
+ resolve(reader.result);
309
+ });
310
+ ['error', 'abort'].forEach(event => reader.addEventListener(event, e => {
311
+ reject(e);
312
+ }));
313
+ reader.readAsDataURL(file);
314
+ });
315
+ })).then(files => {
316
+ if (e.altKey) {
317
+ CommandChange.around(this.app.commander, () => {
318
+ origin.ondropfile(transfered, files);
319
+ });
320
+ this.selected = [origin];
321
+ return;
322
+ }
323
+ let pendings = [];
324
+ let changes = files
325
+ .map((file, idx) => {
326
+ let component;
327
+ let type = transfered[idx].type;
328
+ let name = transfered[idx].name;
329
+ if (type.startsWith('image/')) {
330
+ component = compile({
331
+ type: type.startsWith('image/gif') ? 'gif-view' : 'image-view',
332
+ top: 0,
333
+ left: 0,
334
+ width: 200,
335
+ height: 200,
336
+ src: file
337
+ }, rootModel.app);
338
+ pendings.push(new Promise((resolve, reject) => {
339
+ let image = new Image();
340
+ image.src = file;
341
+ image.onload = () => {
342
+ component.set({
343
+ width: image.width,
344
+ height: image.height
345
+ });
346
+ resolve();
347
+ };
348
+ image.onerror = e => {
349
+ reject(e);
350
+ };
351
+ }));
352
+ }
353
+ else if (type.startsWith('audio/')) {
354
+ component = compile({
355
+ type: 'audio',
356
+ top: 0,
357
+ left: 0,
358
+ width: 100,
359
+ height: 100,
360
+ src: file
361
+ }, rootModel.app);
362
+ }
363
+ else if (type.startsWith('vnd.ms-excel/') || /\.xlsx?$/.test(name)) {
364
+ component = compile({
365
+ type: 'excel',
366
+ top: 0,
367
+ left: 0,
368
+ width: 100,
369
+ height: 100,
370
+ src: file
371
+ }, rootModel.app);
372
+ }
373
+ else {
374
+ console.log('droped file', transfered[idx]);
375
+ }
376
+ if (component) {
377
+ component.center = center;
378
+ center.x += 50;
379
+ center.y += 50;
380
+ }
381
+ return component;
382
+ })
383
+ .filter(Boolean)
384
+ .map(component => {
385
+ return {
386
+ component: component,
387
+ to_container: rootModel
388
+ };
389
+ });
390
+ if (changes.length > 0) {
391
+ Promise.all(pendings).then(() => {
392
+ this.app.commander.execute(new CommandMigrate({ changes }));
393
+ this.selected = changes.map(change => change.component);
394
+ }, reason => {
395
+ console.error(reason);
396
+ });
397
+ }
398
+ }, reason => {
399
+ console.error(reason);
400
+ });
401
+ }
402
+ onwheel_scale(e, hint) {
403
+ /* shiftKey + wheel 은 deltaX 값을 변화시킨다. */
404
+ if (e.deltaY == 0 && e.deltaX == 0)
405
+ return;
406
+ var model_layer = hint.deliverer;
407
+ if (e.shiftKey) {
408
+ if (navigator.userAgent.indexOf('Win') != -1) {
409
+ var dir = e.deltaY < 0 ? 1 : -1;
410
+ }
411
+ else {
412
+ var dir = e.deltaX < 0 ? 1 : -1;
413
+ }
414
+ CommandChange.around(this.app.commander, () => {
415
+ /* 선택된 컴포넌트의 텍스트 사이즈를 조절한다. */
416
+ model_layer.selected.forEach(component => {
417
+ let fontSize = component.get('fontSize') || Const.DEFAULT.FONT_SIZE;
418
+ if (fontSize < 1)
419
+ fontSize = 1;
420
+ fontSize += dir;
421
+ component.set('fontSize', fontSize);
422
+ });
423
+ });
424
+ }
425
+ else {
426
+ var dir = e.deltaY < 0 ? 1 : -1;
427
+ let scale = model_layer.get('scale') || { x: 1, y: 1 };
428
+ let translate = model_layer.get('translate');
429
+ let x = e.offsetX;
430
+ let y = e.offsetY;
431
+ let p = model_layer.transcoordC2S(x, y);
432
+ let delta = dir * 0.1;
433
+ let newscale = {
434
+ x: scale.x + delta,
435
+ y: scale.y + delta
436
+ };
437
+ if ((dir < 0 && scale.x < 0.2) || (dir > 0 && scale.x > 10))
438
+ return;
439
+ /* 휠을 밀면.. 확대 : zoom in */
440
+ /* 휠을 당기면.. 축소 : zoom out */
441
+ model_layer.set('scale', newscale);
442
+ let newp = model_layer.transcoordC2S(x, y);
443
+ model_layer.set('translate', {
444
+ x: translate.x + (newp.x - p.x) * newscale.x,
445
+ y: translate.y + (newp.y - p.y) * newscale.y
446
+ });
447
+ }
448
+ }
449
+ }
450
+ Component.register('modeling-layer', ModelingLayer);
451
+ //# sourceMappingURL=modeling-layer.js.map