@rocketshow/designer 1.32.0 → 1.35.0

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 (362) hide show
  1. package/assets/i18n/de.json +2 -1
  2. package/assets/i18n/en.json +2 -1
  3. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  4. package/esm2022/lib/designer.component.mjs +672 -0
  5. package/esm2022/lib/designer.module.mjs +186 -0
  6. package/esm2022/lib/designer.service.mjs +14 -0
  7. package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
  8. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +577 -0
  9. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  10. package/esm2022/lib/effect/effect.component.mjs +174 -0
  11. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  18. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +162 -0
  19. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  20. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  21. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  22. package/esm2022/lib/fixture/fixture.component.mjs +148 -0
  23. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  24. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +643 -0
  25. package/esm2022/lib/intro/intro.component.mjs +95 -0
  26. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  27. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  28. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  29. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  30. package/esm2022/lib/models/color.mjs +8 -0
  31. package/esm2022/lib/models/composition.mjs +46 -0
  32. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  33. package/esm2022/lib/models/effect-curve.mjs +69 -0
  34. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  35. package/esm2022/lib/models/effect.mjs +12 -0
  36. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  37. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  38. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  39. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  40. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
  41. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
  42. package/esm2022/lib/models/fixture-matrix.mjs +25 -0
  43. package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
  44. package/esm2022/lib/models/fixture-mode.mjs +17 -0
  45. package/esm2022/lib/models/fixture-physical.mjs +14 -0
  46. package/esm2022/lib/models/fixture-profile.mjs +85 -0
  47. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  48. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  49. package/esm2022/lib/models/fixture.mjs +40 -0
  50. package/esm2022/lib/models/preset-fixture.mjs +10 -0
  51. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  52. package/esm2022/lib/models/preset.mjs +65 -0
  53. package/esm2022/lib/models/project.mjs +78 -0
  54. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  55. package/esm2022/lib/models/scene.mjs +27 -0
  56. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  57. package/esm2022/lib/preset/preset.component.mjs +131 -0
  58. package/esm2022/lib/preview/models/color-changer-3d.mjs +64 -0
  59. package/esm2022/lib/preview/models/fixture-3d.mjs +274 -0
  60. package/esm2022/lib/preview/models/moving-head-3d.mjs +124 -0
  61. package/esm2022/lib/preview/preview.component.mjs +219 -0
  62. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  63. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  64. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  65. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  66. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  67. package/esm2022/lib/scene/scene.component.mjs +110 -0
  68. package/esm2022/lib/services/animation.service.mjs +16 -0
  69. package/esm2022/lib/services/config.service.mjs +28 -0
  70. package/esm2022/lib/services/effect.service.mjs +14 -0
  71. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  72. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  73. package/esm2022/lib/services/fixture.service.mjs +639 -0
  74. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  75. package/esm2022/lib/services/intro.service.mjs +140 -0
  76. package/esm2022/lib/services/preset.service.mjs +449 -0
  77. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  78. package/esm2022/lib/services/preview.service.mjs +497 -0
  79. package/esm2022/lib/services/project-load.service.mjs +209 -0
  80. package/esm2022/lib/services/project.service.mjs +93 -0
  81. package/esm2022/lib/services/scene.service.mjs +164 -0
  82. package/esm2022/lib/services/timeline.service.mjs +726 -0
  83. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  84. package/esm2022/lib/services/user.service.mjs +89 -0
  85. package/esm2022/lib/services/uuid.service.mjs +23 -0
  86. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  87. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +304 -0
  88. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  89. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  90. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  91. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  92. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  93. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  94. package/esm2022/public_api.mjs +7 -0
  95. package/esm2022/rocketshow-designer.mjs +5 -0
  96. package/fesm2022/rocketshow-designer.mjs +11171 -0
  97. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  98. package/index.d.ts +5 -0
  99. package/lib/array-sort-pipe.d.ts +3 -0
  100. package/lib/designer.component.d.ts +19 -16
  101. package/lib/designer.module.d.ts +55 -0
  102. package/lib/designer.service.d.ts +3 -0
  103. package/lib/dropzone/dropzone.component.d.ts +24 -0
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  106. package/lib/effect/effect.component.d.ts +3 -0
  107. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  118. package/lib/fixture/fixture.component.d.ts +7 -3
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  121. package/lib/intro/intro.component.d.ts +3 -0
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  123. package/lib/models/cached-fixture.d.ts +1 -0
  124. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
  125. package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
  126. package/lib/models/fixture-matrix.d.ts +6 -0
  127. package/lib/models/fixture-mode-channel.d.ts +8 -0
  128. package/lib/models/fixture-mode.d.ts +3 -1
  129. package/lib/models/fixture-physical.d.ts +4 -0
  130. package/lib/models/fixture-profile.d.ts +5 -0
  131. package/lib/models/preset-fixture.d.ts +5 -0
  132. package/lib/models/preset.d.ts +2 -0
  133. package/lib/models/project.d.ts +3 -0
  134. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  135. package/lib/preset/preset.component.d.ts +3 -0
  136. package/lib/preview/models/color-changer-3d.d.ts +1 -11
  137. package/lib/preview/models/fixture-3d.d.ts +11 -0
  138. package/lib/preview/models/moving-head-3d.d.ts +1 -11
  139. package/lib/preview/preview.component.d.ts +4 -4
  140. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  141. package/lib/project/project-import/project-import.component.d.ts +3 -0
  142. package/lib/project/project-save/project-save.component.d.ts +3 -0
  143. package/lib/project/project-share/project-share.component.d.ts +3 -0
  144. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  145. package/lib/scene/scene.component.d.ts +3 -0
  146. package/lib/services/animation.service.d.ts +3 -0
  147. package/lib/services/config.service.d.ts +4 -0
  148. package/lib/services/effect.service.d.ts +3 -0
  149. package/lib/services/error-dialog.service.d.ts +3 -0
  150. package/lib/services/fixture-pool.service.d.ts +3 -0
  151. package/lib/services/fixture.service.d.ts +10 -2
  152. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  153. package/lib/services/intro.service.d.ts +3 -0
  154. package/lib/services/preset.service.d.ts +7 -2
  155. package/lib/services/preview-mesh.service.d.ts +3 -0
  156. package/lib/services/preview.service.d.ts +6 -4
  157. package/lib/services/project-load.service.d.ts +8 -1
  158. package/lib/services/project.service.d.ts +5 -3
  159. package/lib/services/scene.service.d.ts +3 -0
  160. package/lib/services/timeline.service.d.ts +3 -0
  161. package/lib/services/user-ensure-login.service.d.ts +3 -0
  162. package/lib/services/user.service.d.ts +3 -0
  163. package/lib/services/uuid.service.d.ts +3 -0
  164. package/lib/services/warning-dialog.service.d.ts +3 -0
  165. package/lib/timeline/composition-settings/composition-settings.component.d.ts +5 -1
  166. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  167. package/lib/timeline/timeline.component.d.ts +3 -0
  168. package/lib/user/user-login/user-login.component.d.ts +3 -0
  169. package/lib/user/user-register/user-register.component.d.ts +3 -0
  170. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  171. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  172. package/package.json +20 -22
  173. package/rocketshow-designer-1.35.0.tgz +0 -0
  174. package/bundles/rocketshow-designer.umd.js +0 -9966
  175. package/bundles/rocketshow-designer.umd.js.map +0 -1
  176. package/bundles/rocketshow-designer.umd.min.js +0 -17
  177. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  178. package/esm2015/lib/array-sort-pipe.js +0 -28
  179. package/esm2015/lib/designer.component.js +0 -411
  180. package/esm2015/lib/designer.module.js +0 -117
  181. package/esm2015/lib/designer.service.js +0 -16
  182. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  183. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  184. package/esm2015/lib/effect/effect.component.js +0 -73
  185. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  186. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  187. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  188. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  189. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  190. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  191. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  192. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  193. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  194. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  195. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  196. package/esm2015/lib/fixture/fixture.component.js +0 -70
  197. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  198. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  199. package/esm2015/lib/intro/intro.component.js +0 -25
  200. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  201. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  202. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  203. package/esm2015/lib/models/cached-fixture.js +0 -6
  204. package/esm2015/lib/models/color.js +0 -8
  205. package/esm2015/lib/models/composition.js +0 -46
  206. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  207. package/esm2015/lib/models/effect-curve.js +0 -69
  208. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  209. package/esm2015/lib/models/effect.js +0 -12
  210. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  211. package/esm2015/lib/models/fixture-capability.js +0 -84
  212. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  213. package/esm2015/lib/models/fixture-channel.js +0 -24
  214. package/esm2015/lib/models/fixture-mode.js +0 -14
  215. package/esm2015/lib/models/fixture-profile.js +0 -70
  216. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  217. package/esm2015/lib/models/fixture-wheel.js +0 -15
  218. package/esm2015/lib/models/fixture.js +0 -40
  219. package/esm2015/lib/models/preset-region-scene.js +0 -8
  220. package/esm2015/lib/models/preset.js +0 -56
  221. package/esm2015/lib/models/project.js +0 -68
  222. package/esm2015/lib/models/scene-playback-region.js +0 -11
  223. package/esm2015/lib/models/scene.js +0 -27
  224. package/esm2015/lib/models/universe.js +0 -11
  225. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  226. package/esm2015/lib/preset/preset.component.js +0 -85
  227. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  228. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  229. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  230. package/esm2015/lib/preview/preview.component.js +0 -242
  231. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  232. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  233. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  234. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  235. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  236. package/esm2015/lib/scene/scene.component.js +0 -56
  237. package/esm2015/lib/services/animation.service.js +0 -17
  238. package/esm2015/lib/services/config.service.js +0 -28
  239. package/esm2015/lib/services/effect.service.js +0 -16
  240. package/esm2015/lib/services/error-dialog.service.js +0 -44
  241. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  242. package/esm2015/lib/services/fixture.service.js +0 -443
  243. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  244. package/esm2015/lib/services/intro.service.js +0 -144
  245. package/esm2015/lib/services/preset.service.js +0 -416
  246. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  247. package/esm2015/lib/services/preview.service.js +0 -500
  248. package/esm2015/lib/services/project-load.service.js +0 -171
  249. package/esm2015/lib/services/project.service.js +0 -113
  250. package/esm2015/lib/services/scene.service.js +0 -174
  251. package/esm2015/lib/services/timeline.service.js +0 -738
  252. package/esm2015/lib/services/universe.service.js +0 -24
  253. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  254. package/esm2015/lib/services/user.service.js +0 -93
  255. package/esm2015/lib/services/uuid.service.js +0 -25
  256. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  257. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  258. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  259. package/esm2015/lib/timeline/timeline.component.js +0 -239
  260. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  261. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  262. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  263. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  264. package/esm2015/public_api.js +0 -7
  265. package/esm2015/rocketshow-designer.js +0 -61
  266. package/esm5/lib/array-sort-pipe.js +0 -31
  267. package/esm5/lib/designer.component.js +0 -468
  268. package/esm5/lib/designer.module.js +0 -120
  269. package/esm5/lib/designer.service.js +0 -17
  270. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  271. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  272. package/esm5/lib/effect/effect.component.js +0 -75
  273. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  274. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  275. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  276. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  277. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  278. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  279. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  280. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  281. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  282. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  283. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  284. package/esm5/lib/fixture/fixture.component.js +0 -71
  285. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  286. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  287. package/esm5/lib/intro/intro.component.js +0 -26
  288. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  289. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  290. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  291. package/esm5/lib/models/cached-fixture.js +0 -8
  292. package/esm5/lib/models/color.js +0 -10
  293. package/esm5/lib/models/composition.js +0 -60
  294. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  295. package/esm5/lib/models/effect-curve.js +0 -95
  296. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  297. package/esm5/lib/models/effect.js +0 -14
  298. package/esm5/lib/models/fixture-capability-value.js +0 -17
  299. package/esm5/lib/models/fixture-capability.js +0 -86
  300. package/esm5/lib/models/fixture-channel-value.js +0 -13
  301. package/esm5/lib/models/fixture-channel.js +0 -38
  302. package/esm5/lib/models/fixture-mode.js +0 -16
  303. package/esm5/lib/models/fixture-profile.js +0 -114
  304. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  305. package/esm5/lib/models/fixture-wheel.js +0 -29
  306. package/esm5/lib/models/fixture.js +0 -42
  307. package/esm5/lib/models/preset-region-scene.js +0 -10
  308. package/esm5/lib/models/preset.js +0 -90
  309. package/esm5/lib/models/project.js +0 -122
  310. package/esm5/lib/models/scene-playback-region.js +0 -13
  311. package/esm5/lib/models/scene.js +0 -29
  312. package/esm5/lib/models/universe.js +0 -13
  313. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  314. package/esm5/lib/preset/preset.component.js +0 -86
  315. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  316. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  317. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  318. package/esm5/lib/preview/preview.component.js +0 -280
  319. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  320. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  321. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  322. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  323. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  324. package/esm5/lib/scene/scene.component.js +0 -57
  325. package/esm5/lib/services/animation.service.js +0 -18
  326. package/esm5/lib/services/config.service.js +0 -29
  327. package/esm5/lib/services/effect.service.js +0 -17
  328. package/esm5/lib/services/error-dialog.service.js +0 -46
  329. package/esm5/lib/services/fixture-pool.service.js +0 -36
  330. package/esm5/lib/services/fixture.service.js +0 -643
  331. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  332. package/esm5/lib/services/intro.service.js +0 -145
  333. package/esm5/lib/services/preset.service.js +0 -637
  334. package/esm5/lib/services/preview-mesh.service.js +0 -61
  335. package/esm5/lib/services/preview.service.js +0 -754
  336. package/esm5/lib/services/project-load.service.js +0 -185
  337. package/esm5/lib/services/project.service.js +0 -127
  338. package/esm5/lib/services/scene.service.js +0 -251
  339. package/esm5/lib/services/timeline.service.js +0 -845
  340. package/esm5/lib/services/universe.service.js +0 -36
  341. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  342. package/esm5/lib/services/user.service.js +0 -95
  343. package/esm5/lib/services/uuid.service.js +0 -26
  344. package/esm5/lib/services/warning-dialog.service.js +0 -45
  345. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  346. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  347. package/esm5/lib/timeline/timeline.component.js +0 -243
  348. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  349. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  350. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  351. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  352. package/esm5/public_api.js +0 -7
  353. package/esm5/rocketshow-designer.js +0 -61
  354. package/fesm2015/rocketshow-designer.js +0 -7945
  355. package/fesm2015/rocketshow-designer.js.map +0 -1
  356. package/fesm5/rocketshow-designer.js +0 -9690
  357. package/fesm5/rocketshow-designer.js.map +0 -1
  358. package/lib/models/universe.d.ts +0 -8
  359. package/lib/services/universe.service.d.ts +0 -6
  360. package/rocketshow-designer-1.32.0.tgz +0 -0
  361. package/rocketshow-designer.d.ts +0 -60
  362. package/rocketshow-designer.metadata.json +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://@rocketshow/designer/lib/models/fixture-capability.ts","ng://@rocketshow/designer/lib/designer.service.ts","ng://@rocketshow/designer/lib/models/fixture-wheel-slot.ts","ng://@rocketshow/designer/lib/models/fixture-channel.ts","ng://@rocketshow/designer/lib/models/fixture-mode.ts","ng://@rocketshow/designer/lib/models/fixture-profile.ts","ng://@rocketshow/designer/lib/models/fixture-wheel.ts","ng://@rocketshow/designer/lib/models/fixture.ts","ng://@rocketshow/designer/lib/models/cached-fixture.ts","ng://@rocketshow/designer/lib/models/cached-fixture-capability.ts","ng://@rocketshow/designer/lib/models/cached-fixture-channel.ts","ng://@rocketshow/designer/lib/models/color.ts","ng://@rocketshow/designer/lib/models/scene-playback-region.ts","ng://@rocketshow/designer/lib/models/composition.ts","ng://@rocketshow/designer/lib/models/effect.ts","ng://@rocketshow/designer/lib/models/effect-curve-profile-channel.ts","ng://@rocketshow/designer/lib/models/effect-curve.ts","ng://@rocketshow/designer/lib/models/effect-pan-tilt.ts","ng://@rocketshow/designer/lib/models/fixture-capability-value.ts","ng://@rocketshow/designer/lib/models/fixture-channel-value.ts","ng://@rocketshow/designer/lib/models/preset.ts","ng://@rocketshow/designer/lib/models/scene.ts","ng://@rocketshow/designer/lib/models/project.ts","ng://@rocketshow/designer/lib/services/user.service.ts","ng://@rocketshow/designer/lib/services/uuid.service.ts","ng://@rocketshow/designer/lib/services/project.service.ts","ng://@rocketshow/designer/lib/services/fixture.service.ts","ng://@rocketshow/designer/lib/services/preview-mesh.service.ts","ng://@rocketshow/designer/lib/models/preset-region-scene.ts","ng://@rocketshow/designer/lib/services/animation.service.ts","ng://@rocketshow/designer/lib/services/config.service.ts","ng://@rocketshow/designer/lib/services/effect.service.ts","ng://@rocketshow/designer/lib/services/preset.service.ts","ng://@rocketshow/designer/lib/services/scene.service.ts","ng://@rocketshow/designer/lib/services/timeline.service.ts","ng://@rocketshow/designer/lib/services/universe.service.ts","ng://@rocketshow/designer/lib/services/preview.service.ts","ng://@rocketshow/designer/lib/preview/models/fixture-3d.ts","ng://@rocketshow/designer/lib/preview/models/color-changer-3d.ts","ng://@rocketshow/designer/lib/preview/models/moving-head-3d.ts","ng://@rocketshow/designer/lib/preview/preview.component.ts","ng://@rocketshow/designer/lib/wait-dialog/wait-dialog.component.ts","ng://@rocketshow/designer/lib/services/project-load.service.ts","ng://@rocketshow/designer/lib/warning-dialog/warning-dialog.component.ts","ng://@rocketshow/designer/lib/services/warning-dialog.service.ts","ng://@rocketshow/designer/lib/project/project-browser/project-browser.component.ts","ng://@rocketshow/designer/lib/project/project-import/project-import.component.ts","ng://@rocketshow/designer/lib/project/project-save/project-save.component.ts","ng://@rocketshow/designer/lib/project/project-share/project-share.component.ts","ng://@rocketshow/designer/lib/error-dialog/error-dialog.component.ts","ng://@rocketshow/designer/lib/services/error-dialog.service.ts","ng://@rocketshow/designer/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.ts","ng://@rocketshow/designer/lib/fixture-pool/fixture-pool.component.ts","ng://@rocketshow/designer/lib/services/fixture-pool.service.ts","ng://@rocketshow/designer/lib/services/hotkey-target-exclude.service.ts","ng://@rocketshow/designer/lib/services/intro.service.ts","ng://@rocketshow/designer/lib/user/user-login/user-login.component.ts","ng://@rocketshow/designer/lib/user/user-register/user-register.component.ts","ng://@rocketshow/designer/lib/services/user-ensure-login.service.ts","ng://@rocketshow/designer/lib/timeline/composition-settings/composition-settings.component.ts","ng://@rocketshow/designer/lib/timeline/timeline-grid/timeline-grid.component.ts","ng://@rocketshow/designer/lib/timeline/timeline.component.ts","ng://@rocketshow/designer/lib/designer.component.ts","ng://@rocketshow/designer/lib/array-sort-pipe.ts","ng://@rocketshow/designer/lib/effect/effect-curve/effect-curve.component.ts","ng://@rocketshow/designer/lib/effect/effect-pan-tilt/effect-pan-tilt.component.ts","ng://@rocketshow/designer/lib/effect/effect.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-capability/fixture-capability.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-channel/fixture-channel.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.ts","ng://@rocketshow/designer/lib/fixture/fixture-settings/fixture-settings.component.ts","ng://@rocketshow/designer/lib/fixture/fixture.component.ts","ng://@rocketshow/designer/lib/intro/intro.component.ts","ng://@rocketshow/designer/lib/master-dimmer/master-dimmer.component.ts","ng://@rocketshow/designer/lib/preset/preset-settings/preset-settings.component.ts","ng://@rocketshow/designer/lib/preset/preset.component.ts","ng://@rocketshow/designer/lib/scene/scene-settings/scene-settings.component.ts","ng://@rocketshow/designer/lib/scene/scene.component.ts","ng://@rocketshow/designer/lib/designer.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__metadata","metadataKey","metadataValue","metadata","__values","o","Symbol","iterator","m","next","value","done","__read","e","ar","push","error","__spread","concat","FixtureCapabilityType","FixtureCapabilityColor","DesignerService","Injectable","providedIn","FixtureWheelSlotType","FixtureCapability","data","dmxRange","type","angleStart","angleEnd","color","wheel","slotNumber","brightness","brightnessStart","brightnessEnd","comment","FixtureChannel","fineChannelAliases","capabilities","defaultValue","dmxValueResolution","capability","_b","_c","FixtureMode","channels","name","shortName","FixtureCategory","FixtureWheelSlot","colors","FixtureWheel","slots","slot","Positioning","FixtureProfile","createdFromFile","categories","availableChannels","wheels","modes","uuid","manufacturerName","manufacturerShortName","_e","_f","category","mainCategory","_g","keys","_h","property","_j","_k","mode","_l","_m","fixtureChannel","CachedFixture","CachedFixtureCapability","wheelSlots","wheelIsColor","CachedFixtureChannel","Color","red","green","blue","Fixture","dmxFirstChannel","positioning","topFront","positionX","positionY","positionZ","rotationX","rotationY","rotationZ","profileUuid","dmxUniverseUuid","modeShortName","ScenePlaybackRegion","sceneUuid","startMillis","endMillis","Composition","syncType","audioFileInLibrary","beatsPerMinute","timeSignatureUpper","timeSignatureLower","snapToGrid","tempoGuessed","gridType","gridOffsetMillis","gridResolution","durationMillis","scenePlaybackRegions","audioFileName","scenePlaybackRegion","Effect","visible","EffectCurveProfileChannels","channel","EffectCurve","_super","_this","curveType","lengthMillis","phaseMillis","amplitude","position","phasingMillis","_d","getValueAtMillis","timeMillis","fixtureIndex","phasingIndex","phase","Math","sin","PI","sign","max","min","EffectPanTilt","FixtureCapabilityValue","valuePercentage","FixtureChannelValue","channelName","Preset","fixtureUuids","fixtureChannelValues","fixtureCapabilityValues","effects","fadeInMillis","fadeOutMillis","fadeInPre","fadeOutPost","fixtureChannelValue","fixtureCapabilityValue","effect","Scene","presetUuids","Project","stageWidthCm","stageHeightCm","stageDepthCm","stageFloorHeightCm","stageCeilingHeightCm","stagePillarWidthCm","masterDimmerValue","selectedSceneUuids","previewPreset","compositions","fixtureProfiles","fixtures","scenes","presets","id","shareToken","selectedPresetUuid","selectedCompositionUuid","composition","fixtureProfile","fixture","_o","scene","_p","_q","preset","UserService","http","loadFromLocalStorage","token","localStorage","getItem","tokenExpiration","undefined","Date","parse","username","register","email","password","post","login","pipe","map","result","setDate","getDate","setItem","JSON","stringify","logout","removeItem","isLoggedIn","getHeaders","headers","HttpHeaders","append","setAutoLoadProject","project","toString","getAutoLoadProjectId","Number","parseInt","getAutoLoadProjectName","HttpClient","UuidService","getUuid","replace","random","ProjectService","uuidService","userService","router","activatedRoute","translateService","toastrService","saveApi","response","queryParams","navigate","relativeTo","queryParamsHandling","save","subscribe","msg","title","get","success","getAllProjects","projects","response_1","response_1_1","projectObject","deleteProject","delete","getProject","Router","ActivatedRoute","TranslateService","ToastrService","FixtureService","projectService","cachedFixtures","settingsSelection","selectedSettingsFixtures","getFixtureByUuid","getCachedFixtureByUuid","getSearchProfiles","searchProfiles","profile","getProfileByUuid","loadProfileByUuid","of","forkJoin","encodeURI","mergedData","getRotationAngleDeg","endsWith","getWheelSlotColors","getWheelSlots","wheelSlots_1","wheelSlots_1_1","getMixedWheelSlotColor","colorsRgb","colors_1","colors_1_1","hexToRgb","mixColors","componentToHex","hex","rgbToHex","g","exec","colors_2","colors_2_1","wheelHasSlotType","slotType","getWheelByName","wheelName","floor","number","getModeByFixture","getFixtureCapability","cachedFixtureCapability","isArray","centerValue","getCapabilitiesByChannel","capabilites","getMaxValueByChannel","pow","getDefaultValueByChannel","isNaN","percentage","getColorWheelByChannel","channelCapability","getChannelByName","indexOf","getCachedChannels","availableChannelName","availableChannel","e_14","cachedFixtureChannel","maxValue","colorWheel","updateCachedFixtures","cachedFixture","capabilitiesMatch","type1","type2","color1","color2","wheel1","wheel2","profileUuid1","profileUuid2","settingsFixtureIsSelected","switchSettingsFixtureSelection","splice","getFixtureIconClass","toLocaleLowerCase","updateProfiles","getNextFreeDmxChannel","fixturePool","neededChannels","freeChannels","occupiedChannels","fixturePool_1","e_17","fixturePool_1_1","addFixture","existingModeShortName","fixturePool_2","fixturePool_2_1","existingFixture","firstChannel","msg_1","title_1","PreviewMeshService","loader","GLTFLoader","cachedMeshes","Map","cachedObservables","loadScene","Observable","observer","load","gltf","children","set","complete","xhr","loadMesh","observable","model","clone","getMesh","PresetRegionScene","region","AnimationService","ConfigService","enableMediaLibrary","loginAvailable","shareAvailable","menuHeightPx","languageSwitch","newProjectTemplate","livePreview","localProfiles","intro","uniqueProjectNames","menuHeightChanged","Subject","EffectService","PresetService","effectService","fixtureService","configService","animationService","previewSelectionChanged","fixtureSelectionChanged","fixtureSelectionSettingsChanged","fixtureColorChanged","liveChangePending","getPresetByUuid","fixtureIsSelected","selectedPreset","switchFixtureSelection","projectFixture","selectAllFixtures","selectNoFixtures","removeDeletedFixtures","updateFixtureSelection","presetFixture","e_7","deleteCapabilityValue","capabilityType","setCapabilityValue","getCapabilityValue","capabilityValue","deleteChannelValue","setChannelValue","getChannelValue","channelValue","getApproximatedColorWheelCapability","cachedChannel","colorRed","colorGreen","colorBlue","lowestDiffCapability","lowestDiff","MAX_VALUE","ColorIntensity","Red","Green","Blue","mixedColor","diff","abs","hasCapabilityType","fixtureUuid","e_12","e_13","hasCapabilityDimmer","Intensity","hasCapabilityColor","hasCapabilityColorOrColorWheel","e_15","hasCapabilityPanTilt","hasPan","hasTilt","Pan","Tilt","selectPreset","index","selectedEffect","autoOpenFirstEffect","previewLive","addPreset","highestSelectedPresetIndex","getSelectedProfiles","profiles","getSelectedProfileChannels","selectedProfiles","calculatedProfileModes","selectedProfiles_1","selectedProfiles_1_1","e_18","forEach","profileChannels","modes_1","modes_1_1","find","channels_1","e_20","channels_1_1","compositionName","positionMillis","livePreviewTimer","round","setTimeout","stopPreviewPlay","SceneService","presetService","selectedScenes","sceneColors","multipleSelection","sceneDeleted","sceneSelected","sceneIsSelected","presetIsSelected","switchSceneSelection","selectPresetFromSelectedScene","firstPresetUuid","e_4","presetUuid","selectScene","addScene","slice","toUpperCase","highestSelectedSceneIndex","removeScene","getSceneByUuid","TimelineService","sceneService","playState","zoom","timelineClicking","intensity","intensitySelectedScene","intensityHighlighted","waveSurferReady","detectChanges","externalCompositionsAvailable","loadingAudioFile","selectedPlaybackRegion","updateRegionSelection","redrawAllRegions","waveSurfer","regions","list","remove","drawAllRegions","pad","num","size","padded","msToTime","millis","includeMillis","ms","seconds","minutes","updateCurrentTime","currentTime","getCurrentTime","timeline","drawer","x","duration","backend","getDuration","width","params","fillParent","scrollParent","getWidth","wrapper","scrollWidth","pixelRatio","render","canvases","canvas","leftOffset","maxCanvasWidth","ctx","getContext","fillStyle","beginPath","moveTo","lineTo","fill","startTimeUpdater","stopTimeUpdater","timeUpdater","timer","timeUpdateSubscription","unsubscribe","formatTimeCallback","pxPerSec","selectedComposition","timeInterval","interval","ceil","primaryLabelInterval","secondaryLabelInterval","seeekWithTimeline","progress","clientX","targetTouches","bbox","getBoundingClientRect","nominalWidth","parentWidth","rtl","right","left","scrollLeft","seekTo","applyZoom","isWaveSurferReady","isReady","addRegion","waveSurferRegion","start","end","attributes","selectable","connectRegion","drawRegion","getSnapToGridInterval","getSnapToGridOffset","deleteSelectedComposition","selectedCompositionIndex","destroyWaveSurfer","selectCompositionIndex","destroy","createWaveSurfer","WaveSurfer","container","waveColor","progressColor","height","interact","plugins","CursorPlugin","opacity","hideOnBlur","RegionsPlugin","dragSelection","slop","snapToGridInterval","snapToGridOffset","TimeLinePlugin","primaryFontColor","secondaryFontColor","offset","bind","substr","lastIndexOf","restUrl","on","guess","buffer","then","_a","bpm","catch","err","console","addEventListener","cursor","showCursor","hideCursor","updateCursorPosition","handled","drag","resize","selected","updateRender","updateSelectedRegion","setSelectedRegion","getRegionSnapToGridValue","event","removeRegion","getPresetsInTime","activePresets","sceneIndex","e_5","presetIndex","e_6","presetStartMillis","presetEndMillis","e_8","updateGrid","getExternalCompositionNames","compositionNames","responseComposition","UniverseService","universes","getUniverseByUuid","universe","PreviewService","timelineService","universeService","doUpdateFixtureSetup","stageMeshes","stageMaterial","THREE.MeshStandardMaterial","getAlreadyCalculatedFixture","calculatedFixture","getPresets","e_1","e_2","mixChannelValue","existingChannelValues","intensityPercentage","newValue","existingValue","existingChannelValues_1","existingChannelValues_1_1","existingChannelValue","getFixtureIndex","countedDmxChannels","includes","getPresetIntensity","intensityPercentageScene","intensityPercentagePreset","sceneStartMillis","sceneEndMillis","mixCapabilityValues","values","hasColor","presetCapabilityValue","WheelSlot","mixChannelValues","e_10","mixEffects","effectCurve","_r","_s","channelProfile","_t","e_16","_u","_v","_w","getChannelValues","calculatedFixtures","alreadyCalculatedFixture","presets_1","e_19","presets_1_1","setUniverseValues","presets_2","presets_2_1","e_23","updateFixtureSetup","updateStage","geometry","mesh","existingMesh","dispose","THREE.BoxBufferGeometry","THREE.Mesh","receiveShadow","castShadow","add","Fixture3d","fixtureHasDimmer","fixtureHasColorWheel","fixtureHasColor","dimmer","isSelected","isLoaded","selectedMaterial","THREE.MeshLambertMaterial","emissive","getCapabilityInValue","updatePreview","channelValues","channelValues_1","channelValues_1_1","updatePosition","object","rotation","THREE.Math","degToRad","bottomFront","topBack","bottomBack","manual","y","z","ColorChanger3d","previewMeshService","pointLightMaxIntensity","spotLightMaxIntensity","objectGroup","THREE.Object3D","spotlightGroup","colorChanger","createObjects","atmosphereMat","vertexShader","join","fragmentShader","THREE.ShaderMaterial","uniforms","coeficient","power","glowColor","THREE.Color","transparent","depthWrite","createSpotLightBeam","spotLightBeam","THREE.CylinderGeometry","beamAngleDegrees","applyMatrix","THREE.Matrix4","makeTranslation","parameters","makeRotationX","atmosphereMaterial","material","spotLight","THREE.SpotLight","angle","penumbra","decay","distance","spotLightHelper","THREE.SpotLightHelper","spotLightTarget","pointLight","THREE.PointLight","scale","multiplyScalar","getObject","lastSelected","update","intensityColor","MovingHead3d","spotLightLightMaxIntensity","headGroup","armGroup","socket","arm","head","headPivotGroup","panStart","panEnd","tiltStart","tiltEnd","pan","tilt","lastBeamAngleDegrees","PreviewComponent","previewService","stats","STATS","fixtures3d","syncFixtures","canvasRef","nativeElement","renderer","camera","updateStagePosition","xMin","xMax","yMin","yMax","zMin","zMax","positionCount","positionIndex","element","animate","begin","controls","fixture3d","requestAnimationFrame","getAspectRatio","clientHeight","clientWidth","onResize","aspect","updateProjectionMatrix","setSize","setupRenderer","THREE.WebGLRenderer","antialias","appendChild","domElement","setPixelRatio","devicePixelRatio","shadowMap","enabled","gammaInput","gammaOutput","setupCamera","THREE.PerspectiveCamera","window","innerWidth","innerHeight","setupControls","OrbitControls","enableKeys","rotateSpeed","zoomSpeed","enableDamping","dampingFactor","screenSpacePanning","minDistance","maxDistance","maxPolarAngle","THREE.Vector3","setupFloor","THREE.BoxGeometry","setupStats","style","setupScene","THREE.Scene","ambient","THREE.AmbientLight","lights","ngAfterViewInit","ViewChild","ElementRef","HostListener","Component","selector","template","WaitDialogComponent","ngOnInit","ProjectLoadService","modalService","afterLoad","selectScenesPresetComposition","ref","show","keyboard","ignoreBackdropClick","finalize","hide","new","import","BsModalService","WarningDialogComponent","bsModalRef","onClose","ok","cancel","handleKeyboardEvent","BsModalRef","WarningDialogService","message","mergeMap","fileDialog","content","warningResult","ProjectBrowserComponent","projectLoadService","warningDialogService","loading","loadProjects","openProject","ProjectImportComponent","dropzoneConfig","url","addRemoveLinks","maxFilesize","acceptedFiles","timeout","accept","file","reader","FileReader","readAsText","previewTemplate","uploadMessage","onUploadError","args","timeOut","extendedTimeOut","enableHtml","ProjectSaveComponent","projectName","selectProject","existingProject","doSave","saveProject","ProjectShareComponent","shareLink","location","host","ErrorDialogComponent","ErrorDialogService","details","errorResult","FixturePoolCreateFromFileComponent","text","json","match","FixturePoolComponent","loadingProfiles","dmxChannels","showChannelNumbers","selectFixture","loadProfiles","filterProfiles","selectedFixtureProfile","selectedFixture","searchExpression","filteredProfiles","keywords","split","foundKeywords","keywords_1","keywords_1_1","keyword","toLowerCase","searchProfile","newFixture","addCopy","originalFixture","removeFixture","profileUsed","e_3","channelOccupied","channelOccupiedStart","channelOccupiedEnd","channelOverlapped","occupiedFixture","channelMouseDown","newSelectedFixture","selectedIndex","dataset","channelDragFixture","channelDragOffset","channelSelected","mouseUp","channelMouseOver","this_1","updatingProfiles","catchError","createFixtureFromProfileFile","FixturePoolService","fixturePoolOpened","open","class","HotkeyTargetExcludeService","exclude","nodeName","IntroService","showIntro","activeStep","positionTopPercentage","positionLeftPercentage","stylePosition","stepChanged","refresh","setShowIntro","reset","showStep","step","back","UserLoginComponent","loggingIn","subject","UserRegisterComponent","registering","passwordRepeat","initialState","emailIsValid","test","UserEnsureLoginService","CompositionSettingsComponent","existingCompositionNames","existingFiles","filteredExistingFiles","uploading","projectId","parallelUploads","loadFiles","getNameFromFile","audioFile","filterExistingFiles","previewElement","hidden","onUploadSuccess","onQueueComplete","onAddedFile","searchValue","selectExistingFile","existingFile","deleteFile","TimelineGridComponent","TimelineComponent","changeDetectorRef","hotkeyTargetExcludeService","introService","waveElement","display","waveWrapper","lastHeight","lastWidth","setHeight","play","pause","rewind","openGridSettings","afterDeleteFile","removeComposition","openCompositionSettings","compositionIndex","newComposition","editComposition","selectComposition","compositionSettings","addComposition","stopPropagation","preventDefault","setRegionStartMillis","setRegionEndMillis","ChangeDetectorRef","KeyboardEvent","DesignerComponent","fixturePoolService","userEnsureLoginService","errorDialogService","designerMenuSizePx","splitGutterSizePx","totalMenuHeightPx","currentTab","calcTotalMenuHeight","use","urlParams","URLSearchParams","search","previewComponent","timelineComponent","Split","sizes","direction","snapOffset","gutterSize","onDrag","minSize","openTab","tab","openFixturePool","projectNew","projectOpen","projectSave","projectSaveAs","userRegister","projectImport","projectExport","document","createElement","setAttribute","encodeURIComponent","body","click","removeChild","projectShare","ctrlKey","metaKey","switchLanguage","language","Input","encapsulation","ViewEncapsulation","None","ArraySortPipe","transform","array","field","sort","a","Pipe","EffectCurveComponent","translate","lengthMillisMin","lengthMillisMax","amplitudeMin","amplitudeMax","percentageMin","percentageMax","phaseMillisMin","phaseMillisMax","phasingMillisMin","phasingMillisMax","availableCapabilities","availableProfiles","updateCapabilitiesAndChannels","gridUpdateSubscription","redraw","curveGrid","maxWidth","maxHeight","drawCurrentValue","currMillis","radius","lineWidth","currVal","curve","arc","strokeStyle","stroke","getPhasingCount","count","clearRect","oldX","oldY","val","phasingCount","calculateChannelCapabilities","changeProfileSelection","$event","getCapabilityName","capabilityChecked","existingCapability","toggleCapability","currentTarget","checked","getChannelName","profileName","channelChecked","toggleChannel","profileContained","setLengthMillis","setAmplitude","setPosition","setPhaseMillis","setPhasingMillis","static","EffectPanTiltComponent","points","dragged","EffectComponent","addEffect","addCurveEffect","addPanTiltEffect","openEffect","deleteEffect","FixtureCapabilityChannelComponent","rangeMin","rangeMax","templateValue","_channel","updateChannel","selectedCapability","calculateTemplateValue","getRangeMin","getRangeMax","getDefaultValue","capabilityHasRange","setValue","ignoreCapabilityRange","sliderValue","valueSetTimer","changeActive","active","capabilitySelected","changeDetection","ChangeDetectionStrategy","OnPush","FixtureCapabilityColorWheelComponent","showContainer","_fixtureProfile","colorChangeSubscription","ngOnDestroy","slotCapabilities","getCapabilityColorStyle","colorString","getCurrentSlotNumber","slotCapabilityIsSelected","selectedSlotNumber","approximatedCapability","selectSlotNumber","FixtureCapabilityColorComponent","colorPickerMounted","updatingColor","updateSubscription","setPickerColor","colorPicker","rgb","iro","ColorPicker","borderWidth","borderColor","sliderMargin","changeColor","mount","updateFixtureColor","hexString","FixtureCapabilityDimmerComponent","getValue","getValueText","FixtureCapabilityPanTiltComponent","getValuePan","getValueTextPan","setValuePan","getValueTilt","getValueTextTilt","setValueTilt","FixtureCapabilityComponent","colorWheelChannels","fixtureSelectionChangedSubscription","previewSelectionChangedSubscription","wheelInList","existingChannel","existingProfile","updateColorWheels","Gobo","isChrome","navigator","appVersion","FixtureChannelComponent","channelCapabilities","calculateProfiles","FixtureSettingsPositionComponent","selectUndefinedOptionValue","selectedPositioning","positionXMin","positionXMax","positionYMin","positionYMax","positionZMin","positionZMax","rotationMin","rotationMax","updateSelection","changePosition","positioningStr","changePositionManual","changeRotationManual","FixtureSettingsStageComponent","FixtureSettingsComponent","FixtureComponent","selectAll","selectNone","IntroComponent","close","MasterDimmerComponent","PresetSettingsComponent","PresetComponent","enableCheckbox","activatePreset","removePreset","openSettings","SceneSettingsComponent","SceneComponent","DesignerModule","NgModule","declarations","imports","RouterModule","forRoot","BrowserModule","BrowserAnimationsModule","HttpClientModule","FormsModule","NgxBootstrapSliderModule","TranslateModule","AccordionModule","PopoverModule","TypeaheadModule","SortablejsModule","DropzoneModule","ToastrModule","newestOnTop","exports"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","export enum FixtureCapabilityType {\n NoFunction = 'NoFunction',\n ShutterStrobe = 'ShutterStrobe',\n StrobeSpeed = 'StrobeSpeed',\n StrobeDuration = 'StrobeDuration',\n Intensity = 'Intensity',\n ColorIntensity = 'ColorIntensity',\n ColorPreset = 'ColorPreset',\n ColorTemperature = 'ColorTemperature',\n Pan = 'Pan',\n PanContinuous = 'PanContinuous',\n Tilt = 'Tilt',\n TiltContinuous = 'TiltContinuous',\n PanTiltSpeed = 'PanTiltSpeed',\n WheelSlot = 'WheelSlot',\n WheelShake = 'WheelShake',\n WheelSlotRotation = 'WheelSlotRotation',\n WheelRotation = 'WheelRotation',\n EffectSpeed = 'EffectSpeed',\n EffectDuration = 'EffectDuration',\n EffectParameter = 'EffectParameter',\n SoundSensitivity = 'SoundSensitivity',\n Focus = 'Focus',\n Zoom = 'Zoom',\n Iris = 'Iris',\n IrisEffect = 'IrisEffect',\n Frost = 'Frost',\n FrostEffect = 'FrostEffect',\n Prism = 'Prism',\n PrismRotation = 'PrismRotation',\n BladeInsertion = 'BladeInsertion',\n BladeRotation = 'BladeRotation',\n BladeSystemRotation = 'BladeSystemRotation',\n Fog = 'Fog',\n FogOutput = 'FogOutput',\n FogType = 'FogType',\n BeamAngle = 'BeamAngle',\n Rotation = 'Rotation',\n Speed = 'Speed',\n Time = 'Time',\n Maintenance = 'Maintenance',\n Generic = 'Generic',\n Effect = 'Effect',\n BeamPosition = 'BeamPosition',\n}\n\nexport enum FixtureCapabilityColor {\n Red = 'Red',\n Green = 'Green',\n Blue = 'Blue',\n Cyan = 'Cyan',\n Magenta = 'Magenta',\n Yellow = 'Yellow',\n Amber = 'Amber',\n White = 'White',\n 'Warm White' = 'Warm White',\n 'Cold White' = 'Cold White',\n UV = 'UV',\n Lime = 'Lime',\n Indigo = 'Indigo',\n}\n\nexport class FixtureCapability {\n type: FixtureCapabilityType;\n angleStart: string;\n angleEnd: string;\n color: FixtureCapabilityColor;\n dmxRange: number[] = [];\n // may be empty. in this case, the channel name points to the wheel\n wheel: any;\n slotNumber: number;\n brightness: string;\n brightnessStart: string;\n brightnessEnd: string;\n comment: string;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.type = FixtureCapabilityType[data.type as string];\n this.angleStart = data.angleStart;\n this.angleEnd = data.angleEnd;\n this.color = data.color;\n if (data.dmxRange) {\n this.dmxRange = data.dmxRange;\n }\n this.wheel = data.wheel;\n this.slotNumber = data.slotNumber;\n this.brightness = data.brightness;\n this.brightnessStart = data.brightnessStart;\n this.brightnessEnd = data.brightnessEnd;\n this.comment = data.comment;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DesignerService {\n constructor() {}\n}\n","export enum FixtureWheelSlotType {\n Open = 'Open',\n Closed = 'Closed',\n Color = 'Color',\n Gobo = 'Gobo',\n Prism = 'Prism',\n Iris = 'Iris',\n Frost = 'Frost',\n AnimationGoboStart = 'AnimationGoboStart',\n AnimationGoboEnd = 'AnimationGoboEnd',\n}\n\nexport class FixtureWheelSlot {\n type: FixtureWheelSlotType;\n name: string;\n colors: string[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.type = FixtureWheelSlotType[data.type as string];\n this.name = data.name;\n if (data.colors) {\n this.colors = data.colors;\n }\n }\n}\n","import { FixtureCapability } from './fixture-capability';\n\nexport class FixtureChannel {\n fineChannelAliases: string[] = [];\n defaultValue: string | number;\n capability: FixtureCapability;\n capabilities: FixtureCapability[] = [];\n dmxValueResolution: string;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n if (data.fineChannelAliases) {\n this.fineChannelAliases = data.fineChannelAliases;\n }\n\n this.defaultValue = data.defaultValue;\n this.dmxValueResolution = data.dmxValueResolution;\n\n if (data.capability) {\n this.capability = new FixtureCapability(data.capability);\n } else if (data.capabilities) {\n for (const capability of data.capabilities) {\n this.capabilities.push(new FixtureCapability(capability));\n }\n }\n }\n}\n","export class FixtureMode {\n name: string;\n shortName: string;\n channels: any[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.name = data.name;\n this.shortName = data.shortName;\n\n if (data.channels) {\n this.channels = data.channels;\n }\n }\n}\n","import { FixtureChannel } from './fixture-channel';\nimport { FixtureMode } from './fixture-mode';\nimport { FixtureWheel } from './fixture-wheel';\n\nexport enum FixtureCategory {\n Blinder = 'Blinder',\n 'Color Changer' = 'Color Changer',\n Dimmer = 'Dimmer',\n Effect = 'Effect',\n Fan = 'Fan',\n Flower = 'Flower',\n Hazer = 'Hazer',\n Laser = 'Laser',\n Matrix = 'Matrix',\n 'Moving Head' = 'Moving Head',\n 'Pixel Bar' = 'Pixel Bar',\n Scanner = 'Scanner',\n Smoke = 'Smoke',\n Stand = 'Stand',\n Strobe = 'Strobe',\n Other = 'Other',\n 'Barrel Scanner' = 'Barrel Scanner',\n}\n\nexport class FixtureProfile {\n uuid: string;\n name: string;\n\n // set to file, if the profile is not loaded from the backend\n source: string;\n createdFromFile = false;\n manufacturerShortName: string;\n manufacturerName: string;\n categories: FixtureCategory[] = [];\n availableChannels: any = {};\n shortName: string;\n wheels: any = {};\n\n // All available fixture modes\n modes: FixtureMode[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n // metadata\n this.uuid = data.uuid;\n this.name = data.name;\n this.manufacturerName = data.manufacturerName;\n this.manufacturerShortName = data.manufacturerShortName;\n\n if (data.categories) {\n for (const category of data.categories) {\n this.categories.push(FixtureCategory[category as string]);\n }\n } else if (data.mainCategory) {\n this.categories.push(FixtureCategory[data.mainCategory as string]);\n }\n if (data.wheels) {\n for (const property of Object.keys(data.wheels)) {\n const wheel = new FixtureWheel(data.wheels[property]);\n this.wheels[property] = wheel;\n }\n }\n if (data.modes) {\n for (const mode of data.modes) {\n this.modes.push(new FixtureMode(mode));\n }\n }\n if (data.availableChannels) {\n for (const property of Object.keys(data.availableChannels)) {\n const fixtureChannel = new FixtureChannel(data.availableChannels[property]);\n this.availableChannels[property] = fixtureChannel;\n }\n }\n if (data.createdFromFile) {\n this.createdFromFile = data.createdFromFile;\n }\n }\n}\n","import { FixtureWheelSlot } from './fixture-wheel-slot';\n\nexport class FixtureWheel {\n slots: FixtureWheelSlot[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n if (data.slots) {\n for (const slot of data.slots) {\n this.slots.push(new FixtureWheelSlot(slot));\n }\n }\n }\n}\n","export enum Positioning {\n topFront = 'topFront',\n topBack = 'topBack',\n bottomFront = 'bottomFront',\n bottomBack = 'bottomBack',\n manual = 'manual',\n}\n\nexport class Fixture {\n uuid: string;\n profileUuid: string;\n name: string;\n dmxUniverseUuid: string;\n dmxFirstChannel = 5;\n modeShortName: string;\n positioning: Positioning = Positioning.topFront;\n\n // Only relevant when positioning = manual\n // in CM\n positionX = 0;\n positionY = 0;\n positionZ = 0;\n\n // in DEG\n rotationX = 0;\n rotationY = 0;\n rotationZ = 0;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.uuid = data.uuid;\n this.profileUuid = data.profileUuid;\n this.name = data.name;\n this.dmxUniverseUuid = data.dmxUniverseUuid;\n this.dmxFirstChannel = data.dmxFirstChannel;\n this.modeShortName = data.modeShortName;\n this.positioning = data.positioning;\n this.positionX = data.positionX;\n this.positionY = data.positionY;\n this.positionZ = data.positionZ;\n this.rotationX = data.rotationX;\n this.rotationY = data.rotationY;\n this.rotationZ = data.rotationZ;\n }\n}\n","import { CachedFixtureChannel } from './cached-fixture-channel';\nimport { Fixture } from './fixture';\nimport { FixtureMode } from './fixture-mode';\nimport { FixtureProfile } from './fixture-profile';\n\nexport class CachedFixture {\n fixture: Fixture;\n profile: FixtureProfile;\n mode: FixtureMode;\n channels: CachedFixtureChannel[] = [];\n}\n","import { FixtureCapability } from './fixture-capability';\nimport { FixtureWheel } from './fixture-wheel';\nimport { FixtureWheelSlot } from './fixture-wheel-slot';\n\nexport class CachedFixtureCapability {\n capability: FixtureCapability;\n\n // the wheel names, if available\n wheelName: string;\n\n // the wheel, if available\n wheel: FixtureWheel;\n\n // the wheel slots, if available\n wheelSlots: FixtureWheelSlot[] = [];\n\n // is this a color wheel?\n wheelIsColor = false;\n\n centerValue: number;\n}\n","import { CachedFixtureCapability } from './cached-fixture-capability';\nimport { FixtureChannel } from './fixture-channel';\nimport { FixtureWheel } from './fixture-wheel';\n\nexport class CachedFixtureChannel {\n // the corresponding channel\n channel: FixtureChannel;\n\n // the name of the channel\n name: string;\n\n // all channel capabilities\n capabilities: CachedFixtureCapability[] = [];\n\n // default value\n defaultValue: number;\n\n // maximum value\n maxValue: number;\n\n // a color wheel, if available\n colorWheel: FixtureWheel;\n}\n","export class Color {\n red: number;\n green: number;\n blue: number;\n\n constructor(red?: number, green?: number, blue?: number) {\n this.red = red;\n this.green = green;\n this.blue = blue;\n }\n}\n","export class ScenePlaybackRegion {\n sceneUuid: string;\n startMillis: number;\n endMillis: number;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.sceneUuid = data.sceneUuid;\n this.startMillis = data.startMillis;\n this.endMillis = data.endMillis;\n }\n}\n","import { ScenePlaybackRegion } from './scene-playback-region';\n\nexport class Composition {\n public uuid: string;\n public name: string;\n\n // none or audio\n public syncType = 'audio';\n\n public audioFileName: string;\n public audioFileInLibrary = false;\n\n public beatsPerMinute = 120;\n public timeSignatureUpper = 4;\n public timeSignatureLower = 4;\n\n public snapToGrid = true;\n\n public tempoGuessed = false;\n\n // time based or musical\n public gridType = 'musical';\n public gridOffsetMillis = 0;\n\n // 1/1, 1/2, 1/4, 1/8, etc.\n public gridResolution = 1;\n\n // if no sync\n public durationMillis = 0;\n\n // Regions, where the scene will be played\n public scenePlaybackRegions: ScenePlaybackRegion[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.uuid = data.uuid;\n this.name = data.name;\n this.syncType = data.syncType;\n this.audioFileName = data.audioFileName;\n this.audioFileInLibrary = data.audioFileInLibrary;\n this.beatsPerMinute = data.beatsPerMinute;\n this.timeSignatureUpper = data.timeSignatureUpper;\n this.timeSignatureLower = data.timeSignatureLower;\n this.snapToGrid = data.snapToGrid;\n\n // never guess again (and overwrite), when a composition is loaded\n this.tempoGuessed = true;\n\n this.gridType = data.gridType;\n this.gridOffsetMillis = data.gridOffsetMillis;\n this.gridResolution = data.gridResolution;\n this.durationMillis = data.durationMillis;\n\n if (data.scenePlaybackRegions) {\n for (const scenePlaybackRegion of data.scenePlaybackRegions) {\n this.scenePlaybackRegions.push(new ScenePlaybackRegion(scenePlaybackRegion));\n }\n }\n }\n}\n","export abstract class Effect {\n type: string;\n uuid: string;\n visible = true;\n\n constructor(type: string, data?: any) {\n this.type = type;\n\n if (!data) {\n return;\n }\n\n this.uuid = data.uuid;\n this.visible = data.visible;\n }\n}\n","export class EffectCurveProfileChannels {\n profileUuid: string;\n channels: string[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.profileUuid = data.profileUuid;\n\n if (data.channels) {\n for (const channel of Object.keys(data.channels)) {\n this.channels.push(channel);\n }\n }\n }\n}\n","import { Effect } from './effect';\nimport { EffectCurveProfileChannels } from './effect-curve-profile-channel';\nimport { FixtureCapability } from './fixture-capability';\n\nexport class EffectCurve extends Effect {\n curveType = 'sine';\n\n capabilities: FixtureCapability[] = [];\n channels: EffectCurveProfileChannels[] = [];\n\n lengthMillis = 2500;\n phaseMillis = 0;\n amplitude = 1;\n position = 0.5;\n phasingMillis = 0;\n\n constructor(data?: any) {\n super('curve', data);\n\n if (!data) {\n return;\n }\n\n if (data.capabilities) {\n for (const capability of data.capabilities) {\n this.capabilities.push(new FixtureCapability(capability));\n }\n }\n\n if (data.channels) {\n for (const channel of data.channels) {\n this.channels.push(new EffectCurveProfileChannels(channel));\n }\n }\n\n this.lengthMillis = data.lengthMillis;\n this.phaseMillis = data.phaseMillis;\n this.amplitude = data.amplitude;\n this.position = data.position;\n this.phasingMillis = data.phasingMillis;\n this.curveType = data.curveType;\n }\n\n public getValueAtMillis(timeMillis: number, fixtureIndex?: number): number {\n // Calculate the offset for phasing\n let phasingIndex = 0;\n\n if (fixtureIndex) {\n phasingIndex = fixtureIndex;\n }\n\n const phase = this.phaseMillis + phasingIndex * this.phasingMillis;\n\n // Calculate the value between 0 and 1 according to the curve\n let value = 0;\n\n switch (this.curveType) {\n case 'sine':\n value = this.position + ((this.amplitude / 2) * Math.sin((2 * Math.PI * (timeMillis - phase)) / this.lengthMillis)) / 2;\n break;\n case 'square':\n if (Math.sign(Math.sin((2 * Math.PI * (timeMillis - phase)) / this.lengthMillis) / 2) === -1) {\n value = this.position + this.amplitude / 2;\n } else {\n value = this.position - this.amplitude / 2;\n }\n break;\n case 'triangle':\n // TODO check wikipedia formula\n break;\n case 'sawtooth':\n // TODO\n break;\n case 'reverse-sawtooth':\n // TODO\n break;\n }\n\n return Math.max(Math.min(value, 1), 0);\n }\n}\n","import { Effect } from './effect';\n\nexport class EffectPanTilt extends Effect {\n phasingMillis = 0;\n\n constructor(data?: any) {\n super('pan-tilt', data);\n }\n\n getValueAtMillis(timeMillis: number, fixtureIndex?: number): number {\n // Calculate the offset for phasing\n let phasingIndex = 0;\n\n if (fixtureIndex) {\n phasingIndex = fixtureIndex;\n }\n\n // let phase = this.phaseMillis + phasingIndex * this.phasingMillis;\n\n // Calculate the value according to the curve\n // TODO\n\n return 0;\n }\n}\n","import { FixtureCapabilityColor, FixtureCapabilityType } from './fixture-capability';\n\nexport class FixtureCapabilityValue {\n type: FixtureCapabilityType;\n profileUuid: string;\n\n // value between 0 and 1\n valuePercentage: number;\n\n color: FixtureCapabilityColor;\n wheel: string;\n slotNumber: number;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n this.type = FixtureCapabilityType[data.type as string];\n this.profileUuid = data.profileUuid;\n\n this.valuePercentage = data.valuePercentage;\n this.color = FixtureCapabilityColor[data.color as string];\n this.wheel = data.wheel;\n this.slotNumber = data.slotNumber;\n }\n}\n","export class FixtureChannelValue {\n channelName: string;\n profileUuid: string;\n value: number;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n this.channelName = data.channelName;\n this.profileUuid = data.profileUuid;\n this.value = data.value;\n }\n}\n","import { Effect } from './effect';\nimport { EffectCurve } from './effect-curve';\nimport { EffectPanTilt } from './effect-pan-tilt';\nimport { FixtureCapabilityValue } from './fixture-capability-value';\nimport { FixtureChannelValue } from './fixture-channel-value';\n\nexport class Preset {\n uuid: string;\n name: string;\n\n // all related fixtures\n fixtureUuids: string[] = [];\n\n // the selected values\n fixtureChannelValues: FixtureChannelValue[] = [];\n fixtureCapabilityValues: FixtureCapabilityValue[] = [];\n\n // all related effects\n effects: Effect[] = [];\n\n // position offset, relative to the scene start\n // (undefined = start/end of the scene itself)\n startMillis: number;\n endMillis: number;\n\n // fading times\n fadeInMillis = 0;\n fadeOutMillis = 0;\n\n // fade in/out outside the start/end times?\n fadeInPre = false;\n fadeOutPost = false;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.uuid = data.uuid;\n this.name = data.name;\n this.fixtureUuids = data.fixtureUuids;\n if (data.fixtureChannelValues) {\n for (const fixtureChannelValue of data.fixtureChannelValues) {\n this.fixtureChannelValues.push(new FixtureChannelValue(fixtureChannelValue));\n }\n }\n if (data.fixtureCapabilityValues) {\n for (const fixtureCapabilityValue of data.fixtureCapabilityValues) {\n this.fixtureCapabilityValues.push(new FixtureCapabilityValue(fixtureCapabilityValue));\n }\n }\n if (data.effects) {\n for (const effect of data.effects) {\n switch (effect.type) {\n case 'curve':\n this.effects.push(new EffectCurve(effect));\n break;\n case 'pan-tilt':\n this.effects.push(new EffectPanTilt(effect));\n break;\n }\n }\n }\n this.startMillis = data.startMillis;\n this.endMillis = data.endMillis;\n this.fadeInMillis = data.fadeInMillis;\n this.fadeOutMillis = data.fadeOutMillis;\n this.fadeInPre = data.fadeInPre;\n this.fadeOutPost = data.fadeOutPost;\n }\n}\n","import { ScenePlaybackRegion } from './scene-playback-region';\n\nexport class Scene {\n uuid: string;\n name: string;\n\n color = '#fff';\n\n // All contained presets\n presetUuids: string[] = [];\n\n // Fading times\n fadeInMillis = 0;\n fadeOutMillis = 0;\n\n // fade in/out outside the start/end times?\n fadeInPre = false;\n fadeOutPost = false;\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.uuid = data.uuid;\n this.name = data.name;\n this.color = data.color;\n if (data.presetUuids) {\n this.presetUuids = data.presetUuids;\n }\n this.fadeInMillis = data.fadeInMillis;\n this.fadeOutMillis = data.fadeOutMillis;\n this.fadeInPre = data.fadeInPre;\n this.fadeOutPost = data.fadeOutPost;\n }\n}\n","import { Composition } from './composition';\nimport { Fixture } from './fixture';\nimport { FixtureProfile } from './fixture-profile';\nimport { Preset } from './preset';\nimport { Scene } from './scene';\n\nexport class Project {\n public id: number;\n public uuid: string;\n public name: string;\n public shareToken: string;\n\n public stageWidthCm = 600;\n public stageHeightCm = 350;\n public stageDepthCm = 600;\n\n public stageFloorHeightCm = 30;\n public stageCeilingHeightCm = 5;\n public stagePillarWidthCm = 20;\n\n public masterDimmerValue = 1;\n\n public selectedPresetUuid: string;\n public selectedSceneUuids: string[] = [];\n\n // true = show the preset, false = show the selected scene\n public previewPreset = true;\n\n public selectedCompositionUuid: string;\n\n public compositions: Composition[] = [];\n public fixtureProfiles: FixtureProfile[] = [];\n public fixtures: Fixture[] = [];\n public scenes: Scene[] = [];\n public presets: Preset[] = [];\n\n constructor(data?: any) {\n if (!data) {\n return;\n }\n\n this.id = data.id;\n this.uuid = data.uuid;\n this.name = data.name;\n this.shareToken = data.shareToken;\n\n this.stageWidthCm = data.stageWidthCm;\n this.stageHeightCm = data.stageHeightCm;\n this.stageDepthCm = data.stageDepthCm;\n\n this.stageFloorHeightCm = data.stageFloorHeightCm;\n this.stageCeilingHeightCm = data.stageCeilingHeightCm;\n this.stagePillarWidthCm = data.stagePillarWidthCm;\n\n this.masterDimmerValue = data.masterDimmerValue;\n\n this.selectedPresetUuid = data.selectedPresetUuid;\n this.selectedSceneUuids = data.selectedSceneUuids;\n this.previewPreset = data.previewPreset;\n this.selectedCompositionUuid = data.selectedCompositionUuid;\n\n if (data.compositions) {\n for (const composition of data.compositions) {\n this.compositions.push(new Composition(composition));\n }\n }\n\n if (data.fixtureProfiles) {\n for (const fixtureProfile of data.fixtureProfiles) {\n this.fixtureProfiles.push(new FixtureProfile(fixtureProfile));\n }\n }\n\n if (data.fixtures) {\n for (const fixture of data.fixtures) {\n this.fixtures.push(new Fixture(fixture));\n }\n }\n\n if (data.scenes) {\n for (const scene of data.scenes) {\n this.scenes.push(new Scene(scene));\n }\n }\n\n if (data.presets) {\n for (const preset of data.presets) {\n this.presets.push(new Preset(preset));\n }\n }\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Project } from '../models/project';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService {\n // the authentication token\n token: string;\n tokenExpiration: Date;\n username: string;\n\n constructor(private http: HttpClient) {\n this.loadFromLocalStorage();\n }\n\n private loadFromLocalStorage() {\n this.token = localStorage.getItem('token');\n this.tokenExpiration = undefined;\n if (localStorage.getItem('tokenExpiration')) {\n this.tokenExpiration = new Date(Date.parse(localStorage.getItem('tokenExpiration')));\n }\n this.username = localStorage.getItem('username');\n }\n\n // register a new user\n register(email: string, username: string, password: string): Observable<any> {\n return this.http.post('register?email=' + email + '&username=' + username + '&password=' + password, null);\n }\n\n // login a user in the api\n login(email: string, password: string): Observable<any> {\n return this.http.post('login?email=' + email + '&password=' + password, null).pipe(\n map((result: any) => {\n this.token = result.token;\n this.username = result.username;\n\n // the token expires one month from now\n this.tokenExpiration = new Date();\n this.tokenExpiration.setDate(this.tokenExpiration.getDate() + 30);\n\n // store to the local storage\n localStorage.setItem('token', this.token);\n localStorage.setItem('tokenExpiration', JSON.stringify(this.tokenExpiration));\n localStorage.setItem('username', this.username);\n\n this.loadFromLocalStorage();\n })\n );\n }\n\n logout() {\n localStorage.removeItem('token');\n localStorage.removeItem('tokenExpiration');\n localStorage.removeItem('username');\n\n this.loadFromLocalStorage();\n }\n\n isLoggedIn(): boolean {\n if (!this.token) {\n return false;\n }\n\n if (new Date() > this.tokenExpiration) {\n this.logout();\n return false;\n }\n\n return true;\n }\n\n getHeaders(): HttpHeaders {\n if (!this.isLoggedIn()) {\n return null;\n }\n\n let headers = new HttpHeaders();\n headers = headers.append('Authorization', this.token);\n return headers;\n }\n\n setAutoLoadProject(project: Project) {\n localStorage.setItem('projectName', project.name);\n if (project.id) {\n localStorage.setItem('projectId', project.id.toString());\n } else {\n localStorage.removeItem('projectId');\n }\n }\n\n getAutoLoadProjectId(): number {\n if (!localStorage.getItem('projectId')) {\n return null;\n }\n return Number.parseInt(localStorage.getItem('projectId'));\n }\n\n getAutoLoadProjectName(): string {\n return localStorage.getItem('projectName');\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UuidService {\n constructor() {}\n\n getUuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n // tslint:disable-next-line:no-bitwise\n const r = (Math.random() * 16) | 0;\n\n // tslint:disable-next-line:no-bitwise\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n\n return v.toString(16);\n });\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { ActivatedRoute, Params, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ToastrService } from 'ngx-toastr';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Project } from '../models/project';\nimport { UserService } from './user.service';\nimport { UuidService } from './uuid.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProjectService {\n // the current project\n public project: Project;\n\n constructor(\n private uuidService: UuidService,\n private http: HttpClient,\n private userService: UserService,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private translateService: TranslateService,\n private toastrService: ToastrService\n ) {\n this.project = new Project();\n this.project.uuid = this.uuidService.getUuid();\n this.project.name = 'New Project';\n }\n\n private saveApi(project: Project): Observable<object> {\n return this.http.post('project', JSON.stringify(project), { headers: this.userService.getHeaders() }).pipe(\n map((response: any) => {\n if (response) {\n project.id = response.id;\n if (response.shareToken) {\n project.shareToken = response.shareToken;\n }\n const queryParams: Params = {\n id: project.id,\n token: project.shareToken,\n };\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams,\n queryParamsHandling: 'merge', // remove to replace all query params by provided\n });\n }\n return null;\n })\n );\n }\n\n save(project: Project) {\n // tries to save the project and returns, whether it has been saved or not\n this.saveApi(project).subscribe(\n () => {\n const msg = 'designer.project.save-success';\n const title = 'designer.project.save-success-title';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.success(result[msg], result[title]);\n });\n\n this.userService.setAutoLoadProject(project);\n },\n (response) => {\n const msg = 'designer.project.save-error';\n const title = 'designer.project.save-error-title';\n const error = response && response.error ? response.error.error : 'unknown';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg] + ' (' + error + ')', result[title]);\n });\n }\n );\n }\n\n getAllProjects(): Observable<Project[]> {\n return this.http.get('projects', { headers: this.userService.getHeaders() }).pipe(\n map((response: any) => {\n const projects: Project[] = [];\n for (const project of response) {\n const projectObject = new Project(project);\n projects.push(projectObject);\n }\n return projects;\n })\n );\n }\n\n deleteProject(project: Project): Observable<any> {\n return this.http.delete('project?id=' + project.id + '&name=' + project.name, { headers: this.userService.getHeaders() });\n }\n\n getProject(id: number, name: string, shareToken?: string): Observable<Project> {\n return this.http.get('project?id=' + id + '&name=' + name + '&token=' + shareToken, { headers: this.userService.getHeaders() }).pipe(\n map((response: any) => {\n const project = new Project(response);\n project.id = id;\n\n return project;\n })\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ToastrService } from 'ngx-toastr';\nimport { forkJoin, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { CachedFixture } from '../models/cached-fixture';\nimport { CachedFixtureCapability } from '../models/cached-fixture-capability';\nimport { CachedFixtureChannel } from '../models/cached-fixture-channel';\nimport { Color } from '../models/color';\nimport { Fixture } from '../models/fixture';\nimport { FixtureCapability, FixtureCapabilityColor, FixtureCapabilityType } from '../models/fixture-capability';\nimport { FixtureChannel } from '../models/fixture-channel';\nimport { FixtureMode } from '../models/fixture-mode';\nimport { FixtureProfile } from '../models/fixture-profile';\nimport { FixtureWheel } from '../models/fixture-wheel';\nimport { FixtureWheelSlot, FixtureWheelSlotType } from '../models/fixture-wheel-slot';\nimport { ProjectService } from './project.service';\nimport { UuidService } from './uuid.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FixtureService {\n cachedFixtures: CachedFixture[] = [];\n\n // is the side-tab settings currently selected?\n settingsSelection = false;\n\n selectedSettingsFixtures: Fixture[] = [];\n\n constructor(\n private http: HttpClient,\n private projectService: ProjectService,\n private translateService: TranslateService,\n private toastrService: ToastrService,\n private uuidService: UuidService\n ) {}\n\n getFixtureByUuid(uuid: string): Fixture {\n for (const fixture of this.projectService.project.fixtures) {\n if (fixture.uuid === uuid) {\n return fixture;\n }\n }\n }\n\n getCachedFixtureByUuid(uuid: string): CachedFixture {\n for (const fixture of this.cachedFixtures) {\n if (fixture.fixture.uuid === uuid) {\n return fixture;\n }\n }\n }\n\n // Get all profiles to search for (only metadata)\n getSearchProfiles(): Observable<FixtureProfile[]> {\n return this.http.get('fixtures').pipe(\n map((response: object[]) => {\n const searchProfiles: FixtureProfile[] = [];\n\n for (const profile of response) {\n searchProfiles.push(new FixtureProfile(profile));\n }\n\n return searchProfiles;\n })\n );\n }\n\n getProfileByUuid(uuid: string): FixtureProfile {\n for (const fixtureProfile of this.projectService.project.fixtureProfiles) {\n if (fixtureProfile.uuid === uuid) {\n return fixtureProfile;\n }\n }\n }\n\n loadProfileByUuid(uuid: string): Observable<void> {\n const loadedProfile = this.getProfileByUuid(uuid);\n\n if (loadedProfile) {\n // This profile is already loaded\n return of(undefined);\n }\n\n // Load the metadata and the profile\n return forkJoin([this.http.get('fixtures?uuid=' + encodeURI(uuid)), this.http.get('fixture?uuid=' + encodeURI(uuid))]).pipe(\n map((result) => {\n const mergedData = { ...result[0][0], ...result[1] };\n const fixtureProfile = new FixtureProfile(mergedData);\n this.projectService.project.fixtureProfiles.push(fixtureProfile);\n })\n );\n }\n\n getRotationAngleDeg(value: string): number {\n // convert a rotation angle value into degrees\n if (value.endsWith('deg')) {\n return Number.parseInt(value.replace('deg', ''));\n } else if (value.endsWith('%')) {\n const perc = Number.parseInt(value.replace('%', ''));\n return (perc / 100) * 360;\n }\n\n return undefined;\n }\n\n getWheelSlotColors(wheel: FixtureWheel, slotNumber: number): string[] {\n let colors: string[] = [];\n const wheelSlots = this.getWheelSlots(wheel, slotNumber);\n\n for (const slot of wheelSlots) {\n if (slot.colors && slot.colors.length > 0) {\n colors = colors.concat(slot.colors);\n }\n }\n\n return colors;\n }\n\n getMixedWheelSlotColor(wheel: FixtureWheel, slotNumber: number): Color {\n const colors = this.getWheelSlotColors(wheel, slotNumber);\n const colorsRgb: Color[] = [];\n\n if (colors.length === 0) {\n return undefined;\n }\n\n for (const color of colors) {\n colorsRgb.push(this.hexToRgb(color));\n }\n\n return this.mixColors(colorsRgb);\n }\n\n private componentToHex(c: number): any {\n const hex = c.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n\n rgbToHex(r: number, g: number, b: number): string {\n return '#' + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);\n }\n\n hexToRgb(hex: string): Color {\n // expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n hex = hex.replace(shorthandRegex, (m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? new Color(parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)) : null;\n }\n\n mixColors(colors: Color[]): Color {\n // mix an array of rgb-colors containing r, g, b values to a new color\n let r = 0;\n let g = 0;\n let b = 0;\n\n for (const color of colors) {\n r += color.red;\n g += color.green;\n b += color.blue;\n }\n\n r /= colors.length;\n g /= colors.length;\n b /= colors.length;\n\n return new Color(r, g, b);\n }\n\n wheelHasSlotType(wheel: FixtureWheel, slotType: FixtureWheelSlotType): boolean {\n for (const slot of wheel.slots) {\n if (slot.type === slotType) {\n return true;\n }\n }\n\n return false;\n }\n\n getWheelByName(profile: FixtureProfile, wheelName: string): FixtureWheel {\n for (const property in profile.wheels) {\n if (property === wheelName) {\n return profile.wheels[property];\n }\n }\n\n // wheel not found\n return undefined;\n }\n\n private getWheelSlots(wheel: FixtureWheel, slotNumber: number): FixtureWheelSlot[] {\n // return one slot or two slots, if they are mixed (e.g. slor number 2.5 returns the slots 2 and 3)\n const slots: FixtureWheelSlot[] = [];\n\n if (!wheel) {\n return slots;\n }\n\n if (slotNumber - Math.floor(slotNumber) > 0) {\n // two slots are set\n const number = Math.floor(slotNumber);\n slots.push(wheel.slots[number - 1]);\n if (number >= 0 && number < wheel.slots.length) {\n slots.push(wheel.slots[number]);\n }\n } else {\n // only one slot is set\n slots.push(wheel.slots[slotNumber - 1]);\n }\n\n return slots;\n }\n\n getModeByFixture(profile: FixtureProfile, fixture: Fixture): FixtureMode {\n for (const mode of profile.modes) {\n if (mode.shortName) {\n if (mode.shortName === fixture.modeShortName) {\n return mode;\n }\n } else {\n if (mode.name === fixture.modeShortName) {\n return mode;\n }\n }\n }\n }\n\n private getFixtureCapability(capability: FixtureCapability, channelName: string, profile: FixtureProfile): CachedFixtureCapability {\n const cachedFixtureCapability = new CachedFixtureCapability();\n cachedFixtureCapability.capability = capability;\n if (capability.slotNumber) {\n // there is a wheel connected to this capability\n if (typeof capability.wheel === 'string') {\n cachedFixtureCapability.wheelName = capability.wheel as string;\n } else if (Array.isArray(capability.wheel)) {\n cachedFixtureCapability.wheelName = capability.wheel[0];\n } else {\n cachedFixtureCapability.wheelName = channelName;\n }\n cachedFixtureCapability.wheel = this.getWheelByName(profile, cachedFixtureCapability.wheelName);\n cachedFixtureCapability.wheelSlots = this.getWheelSlots(cachedFixtureCapability.wheel, capability.slotNumber);\n cachedFixtureCapability.wheelIsColor = this.wheelHasSlotType(cachedFixtureCapability.wheel, FixtureWheelSlotType.Color);\n }\n if (cachedFixtureCapability.capability.dmxRange && cachedFixtureCapability.capability.dmxRange.length === 2) {\n cachedFixtureCapability.centerValue = Math.floor(\n (cachedFixtureCapability.capability.dmxRange[0] + cachedFixtureCapability.capability.dmxRange[1]) / 2\n );\n }\n return cachedFixtureCapability;\n }\n\n private getCapabilitiesByChannel(\n fixtureChannel: FixtureChannel,\n channelName: string,\n profile: FixtureProfile\n ): CachedFixtureCapability[] {\n const capabilites: CachedFixtureCapability[] = [];\n\n if (fixtureChannel.capability) {\n capabilites.push(this.getFixtureCapability(fixtureChannel.capability, channelName, profile));\n } else if (fixtureChannel.capabilities) {\n for (const capability of fixtureChannel.capabilities) {\n capabilites.push(this.getFixtureCapability(capability, channelName, profile));\n }\n }\n\n return capabilites;\n }\n\n private getMaxValueByChannel(fixtureChannel: FixtureChannel): number {\n return Math.pow(256, 1 + fixtureChannel.fineChannelAliases.length) - 1;\n }\n\n private getDefaultValueByChannel(fixtureChannel: FixtureChannel): number {\n if (!fixtureChannel.defaultValue) {\n return undefined;\n }\n\n if (isNaN(fixtureChannel.defaultValue as any) && (fixtureChannel.defaultValue as string).endsWith('%')) {\n // percentage value\n const percentage = Number.parseInt((fixtureChannel.defaultValue as string).replace('%', ''));\n const maxValue = this.getMaxValueByChannel(fixtureChannel);\n return (maxValue / 100) * percentage;\n } else {\n // DMX value\n return Number.parseInt(fixtureChannel.defaultValue as any);\n }\n }\n\n private getColorWheelByChannel(channel: CachedFixtureChannel, profile: FixtureProfile): FixtureWheel {\n for (const channelCapability of channel.capabilities) {\n if (channelCapability.wheelIsColor) {\n return channelCapability.wheel;\n }\n }\n\n return undefined;\n }\n\n // private channelInList(channels: CachedFixtureChannel[], name: string): boolean {\n // for (let channel of channels) {\n // if (channel.channelName === name) {\n // return true;\n // }\n // }\n\n // return false;\n // }\n\n getChannelByName(fixture: CachedFixture, channelName: string): CachedFixtureChannel {\n for (const channel of fixture.channels) {\n if (\n (channel.name && channel.name === channelName) ||\n (channel.channel && channel.channel.fineChannelAliases.indexOf(channelName) > -1)\n ) {\n return channel;\n }\n }\n\n return undefined;\n }\n\n getCachedChannels(profile: FixtureProfile, mode: FixtureMode): CachedFixtureChannel[] {\n const channels: CachedFixtureChannel[] = [];\n\n if (!mode) {\n return channels;\n }\n\n for (const availableChannelName of Object.keys(profile.availableChannels)) {\n const availableChannel: FixtureChannel = profile.availableChannels[availableChannelName];\n\n for (const channel of mode.channels) {\n // check for string channel. It can get creepy for matrix modes\n if (typeof channel === 'string') {\n const modeChannel: string = channel as string;\n\n // don't check the fine channels. only add the coarse channel.\n if (modeChannel === availableChannelName) {\n const cachedFixtureChannel = new CachedFixtureChannel();\n cachedFixtureChannel.channel = availableChannel;\n cachedFixtureChannel.name = availableChannelName;\n cachedFixtureChannel.capabilities = this.getCapabilitiesByChannel(cachedFixtureChannel.channel, availableChannelName, profile);\n const defaultValue = this.getDefaultValueByChannel(cachedFixtureChannel.channel);\n if (defaultValue) {\n cachedFixtureChannel.defaultValue = defaultValue;\n }\n cachedFixtureChannel.maxValue = this.getMaxValueByChannel(cachedFixtureChannel.channel);\n cachedFixtureChannel.colorWheel = this.getColorWheelByChannel(cachedFixtureChannel, profile);\n channels.push(cachedFixtureChannel);\n }\n } else {\n // null may be passed as a placeholder for an undefined channel\n channels.push(new CachedFixtureChannel());\n }\n }\n }\n\n return channels;\n }\n\n updateCachedFixtures() {\n // calculate some frequently used values as a cache to save cpu time\n // afterwards\n this.cachedFixtures = [];\n\n for (const fixture of this.projectService.project.fixtures) {\n const cachedFixture = new CachedFixture();\n\n cachedFixture.fixture = fixture;\n cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);\n cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);\n cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode);\n\n this.cachedFixtures.push(cachedFixture);\n }\n }\n\n capabilitiesMatch(\n type1: FixtureCapabilityType,\n type2: FixtureCapabilityType,\n color1: FixtureCapabilityColor,\n color2: FixtureCapabilityColor,\n wheel1: string,\n wheel2: string,\n profileUuid1: string,\n profileUuid2: string\n ): boolean {\n // checks, whether two provided capapabilities match\n return (\n type1 === type2 &&\n (!color1 || color1 === color2) &&\n (!wheel1 || wheel1 === wheel2) &&\n (!profileUuid1 || profileUuid1 === profileUuid2)\n );\n }\n\n settingsFixtureIsSelected(fixture: Fixture): boolean {\n for (const selectedFixture of this.selectedSettingsFixtures) {\n if (selectedFixture === fixture) {\n return true;\n }\n }\n\n return false;\n }\n\n switchSettingsFixtureSelection(fixture: Fixture) {\n if (this.settingsFixtureIsSelected(fixture)) {\n this.selectedSettingsFixtures.splice(this.selectedSettingsFixtures.indexOf(fixture), 1);\n } else {\n this.selectedSettingsFixtures.push(fixture);\n }\n }\n\n getFixtureIconClass(profile: FixtureProfile): string {\n if (!profile) {\n return '';\n }\n if (profile.categories.length === 0) {\n return '';\n }\n if (!profile.categories[0]) {\n return '';\n }\n return profile.categories[0].replace(' ', '-').toLocaleLowerCase();\n }\n\n updateProfiles() {\n return this.http.post('update-profiles', null);\n }\n\n getNextFreeDmxChannel(fixturePool: Fixture[], neededChannels: number): number {\n // get the next free space for this fixture\n let freeChannels = 0;\n\n for (let i = 0; i < 512; i++) {\n let occupiedChannels = 0;\n\n for (const fixture of fixturePool) {\n const mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);\n\n if (i >= fixture.dmxFirstChannel && i < fixture.dmxFirstChannel + mode.channels.length) {\n // this channel is already occupied by a fixture -> move forward to the end of the fixture\n if (mode.channels.length > occupiedChannels) {\n occupiedChannels = mode.channels.length - (i - fixture.dmxFirstChannel);\n }\n }\n }\n\n if (occupiedChannels > 0) {\n i += occupiedChannels - 1;\n freeChannels = 0;\n } else {\n freeChannels++;\n }\n\n if (freeChannels === neededChannels) {\n return i - freeChannels + 1;\n }\n }\n\n // no free space left for the needed channels\n return -1;\n }\n\n addFixture(profile: FixtureProfile, fixturePool: Fixture[]): Fixture {\n const fixture = new Fixture();\n\n fixture.uuid = this.uuidService.getUuid();\n fixture.profileUuid = profile.uuid;\n fixture.name = profile.name;\n\n if (profile.modes && profile.modes.length > 0) {\n fixture.modeShortName = profile.modes[0].shortName;\n }\n\n // add the same mode as an existing fixture, if available\n let existingModeShortName: string;\n for (const existingFixture of fixturePool) {\n const existingProfile = this.getProfileByUuid(existingFixture.profileUuid);\n\n if (existingProfile === profile) {\n existingModeShortName = existingFixture.modeShortName;\n break;\n }\n }\n\n if (existingModeShortName) {\n fixture.modeShortName = existingModeShortName;\n } else {\n fixture.modeShortName = profile.modes[0].shortName || profile.modes[0].name;\n }\n\n const mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);\n const firstChannel = this.getNextFreeDmxChannel(fixturePool, mode.channels.length);\n\n if (firstChannel >= 0) {\n fixture.dmxFirstChannel = firstChannel;\n fixturePool.push(fixture);\n return fixture;\n } else {\n // no free space anymore\n const msg = 'designer.fixture-pool.no-free-space';\n const title = 'designer.fixture-pool.no-free-space-title';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg], result[title]);\n });\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PreviewMeshService {\n private loader = new GLTFLoader();\n private cachedMeshes = new Map<string, THREE.Mesh>();\n\n // the observable, if the requested mesh is already being loaded currently\n private cachedObservables = new Map<string, Observable<THREE.Mesh>>();\n\n constructor() {}\n\n private loadScene(name: string): Observable<THREE.Scene> {\n return new Observable((observer) => {\n this.loader.load(\n './assets/designer/models/' + name + '.gltf',\n\n // Called when the resource is loaded\n (gltf: any) => {\n const model = gltf.scene.children[0];\n\n model.position.set(0, 0, 0);\n\n observer.next(gltf.scene);\n observer.complete();\n },\n\n // Called while loading is progressing\n (xhr: any) => {},\n\n // Called when loading has errors\n (error: any) => {\n observer.error(error);\n }\n );\n });\n }\n\n private loadMesh(name: string): Observable<THREE.Mesh> {\n const observable = this.loadScene(name).pipe(\n map((scene: any) => {\n const model = scene.children[0];\n\n model.position.set(0, 0, 0);\n\n this.cachedMeshes.set(name, model);\n this.cachedObservables.delete(name);\n\n return model.clone();\n })\n );\n\n this.cachedObservables.set(name, observable);\n\n return observable;\n }\n\n getMesh(name: string): Observable<THREE.Mesh> {\n if (this.cachedMeshes.get(name)) {\n return of(this.cachedMeshes.get(name).clone());\n }\n\n return this.cachedObservables.get(name) || this.loadMesh(name);\n }\n}\n","import { Preset } from './preset';\nimport { Scene } from './scene';\nimport { ScenePlaybackRegion } from './scene-playback-region';\n\nexport class PresetRegionScene {\n preset: Preset;\n region: ScenePlaybackRegion;\n scene: Scene;\n\n constructor(preset: Preset, region: ScenePlaybackRegion, scene: Scene) {\n this.preset = preset;\n this.region = region;\n this.scene = scene;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AnimationService {\n timeMillis = 0;\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConfigService {\n public restUrl: string;\n public enableMediaLibrary = false;\n public loginAvailable = false;\n public shareAvailable = false;\n public menuHeightPx = 0;\n public languageSwitch = false;\n public newProjectTemplate = false;\n public livePreview = false;\n public localProfiles = false;\n public intro = false;\n public uniqueProjectNames = false;\n\n public menuHeightChanged: Subject<void> = new Subject<void>();\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { Effect } from './../models/effect';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EffectService {\n // The currently selected effect\n selectedEffect: Effect;\n\n constructor() {}\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { CachedFixtureCapability } from '../models/cached-fixture-capability';\nimport { CachedFixtureChannel } from '../models/cached-fixture-channel';\nimport { Fixture } from '../models/fixture';\nimport { FixtureCapabilityColor, FixtureCapabilityType } from '../models/fixture-capability';\nimport { FixtureCapabilityValue } from '../models/fixture-capability-value';\nimport { FixtureChannelValue } from '../models/fixture-channel-value';\nimport { FixtureMode } from '../models/fixture-mode';\nimport { FixtureProfile } from '../models/fixture-profile';\nimport { Preset } from '../models/preset';\nimport { AnimationService } from './animation.service';\nimport { ConfigService } from './config.service';\nimport { EffectService } from './effect.service';\nimport { FixtureService } from './fixture.service';\nimport { ProjectService } from './project.service';\nimport { UuidService } from './uuid.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PresetService {\n selectedPreset: Preset;\n\n // fires, when the current preview element has changed (scene/preset)\n previewSelectionChanged: Subject<void> = new Subject<void>();\n\n // fires, when the fixture selection has changed\n fixtureSelectionChanged: Subject<void> = new Subject<void>();\n\n // fires, when the fixture selection has changed for settings\n fixtureSelectionSettingsChanged: Subject<void> = new Subject<void>();\n\n // fires, when the selected color has changed. This is required,\n // because detectChanges is not enough to trigger different components.\n fixtureColorChanged: Subject<void> = new Subject<void>();\n\n livePreviewTimer: any;\n liveChangePending = false;\n\n constructor(\n private effectService: EffectService,\n private uuidService: UuidService,\n private projectService: ProjectService,\n private fixtureService: FixtureService,\n private configService: ConfigService,\n private http: HttpClient,\n private animationService: AnimationService\n ) {}\n\n getPresetByUuid(uuid: string): Preset {\n for (const preset of this.projectService.project.presets) {\n if (preset.uuid === uuid) {\n return preset;\n }\n }\n }\n\n fixtureIsSelected(fixture: Fixture, preset?: Preset): boolean {\n // is the passed fixture selected in the passed/currently selected preset?\n if (!preset) {\n if (this.selectedPreset) {\n preset = this.selectedPreset;\n } else {\n return false;\n }\n }\n\n for (const selectedFixtureUuid of preset.fixtureUuids) {\n if (selectedFixtureUuid === fixture.uuid) {\n return true;\n }\n }\n\n return false;\n }\n\n switchFixtureSelection(fixture: Fixture) {\n if (!this.selectedPreset) {\n return;\n }\n\n // select all fixtures at the specified start channel or unselect them,\n // if already selected\n if (this.fixtureIsSelected(fixture)) {\n for (let i = this.selectedPreset.fixtureUuids.length - 1; i >= 0; i--) {\n const projectFixture = this.fixtureService.getFixtureByUuid(this.selectedPreset.fixtureUuids[i]);\n if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel) {\n this.selectedPreset.fixtureUuids.splice(i, 1);\n }\n }\n } else {\n for (const projectFixture of this.projectService.project.fixtures) {\n if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel) {\n this.selectedPreset.fixtureUuids.push(projectFixture.uuid);\n }\n }\n }\n }\n\n selectAllFixtures() {\n if (!this.selectedPreset) {\n return;\n }\n\n for (const fixture of this.projectService.project.fixtures) {\n if (!this.fixtureIsSelected(fixture)) {\n this.selectedPreset.fixtureUuids.push(fixture.uuid);\n }\n }\n }\n\n selectNoFixtures() {\n if (!this.selectedPreset) {\n return;\n }\n\n this.selectedPreset.fixtureUuids = [];\n }\n\n public removeDeletedFixtures() {\n // after changing the configuration in the fixture pool, we might need to\n // delete some fixtures\n for (const preset of this.projectService.project.presets) {\n for (let i = preset.fixtureUuids.length - 1; i >= 0; i--) {\n const presetFixture = this.fixtureService.getFixtureByUuid(preset.fixtureUuids[i]);\n if (!presetFixture) {\n preset.fixtureUuids.splice(i, 1);\n }\n }\n }\n }\n\n public updateFixtureSelection() {\n // after changing the configuration in the fixture pool, we might need to\n // select some more fixtures on the same channel as already selected ones\n for (const preset of this.projectService.project.presets) {\n for (let i = preset.fixtureUuids.length - 1; i >= 0; i--) {\n const presetFixture = this.fixtureService.getFixtureByUuid(preset.fixtureUuids[i]);\n for (const projectFixture of this.projectService.project.fixtures) {\n if (projectFixture.dmxFirstChannel === presetFixture.dmxFirstChannel && !this.fixtureIsSelected(projectFixture, preset)) {\n preset.fixtureUuids.push(projectFixture.uuid);\n }\n }\n }\n }\n }\n\n deleteCapabilityValue(\n preset: Preset,\n capabilityType: FixtureCapabilityType,\n color?: FixtureCapabilityColor,\n wheel?: string,\n profileUuid?: string\n ) {\n for (let i = 0; i < preset.fixtureCapabilityValues.length; i++) {\n if (\n this.fixtureService.capabilitiesMatch(\n preset.fixtureCapabilityValues[i].type,\n capabilityType,\n preset.fixtureCapabilityValues[i].color,\n color,\n preset.fixtureCapabilityValues[i].wheel,\n wheel,\n preset.fixtureCapabilityValues[i].profileUuid,\n profileUuid\n )\n ) {\n preset.fixtureCapabilityValues.splice(i, 1);\n return;\n }\n }\n }\n\n setCapabilityValue(\n preset: Preset,\n capabilityType: FixtureCapabilityType,\n valuePercentage: number,\n slotNumber?: number,\n color?: FixtureCapabilityColor,\n wheel?: string,\n profileUuid?: string\n ) {\n // Delete existant properties with this type and set the new value\n this.deleteCapabilityValue(preset, capabilityType, color, wheel, profileUuid);\n\n const fixtureCapabilityValue = new FixtureCapabilityValue();\n fixtureCapabilityValue.type = capabilityType;\n fixtureCapabilityValue.color = color;\n fixtureCapabilityValue.wheel = wheel;\n fixtureCapabilityValue.valuePercentage = valuePercentage;\n fixtureCapabilityValue.slotNumber = slotNumber;\n fixtureCapabilityValue.profileUuid = profileUuid;\n\n preset.fixtureCapabilityValues.push(fixtureCapabilityValue);\n }\n\n getCapabilityValue(\n preset: Preset,\n capabilityType: FixtureCapabilityType,\n color?: FixtureCapabilityColor,\n wheel?: string,\n profileUuid?: string\n ): FixtureCapabilityValue {\n for (const capabilityValue of preset.fixtureCapabilityValues) {\n if (\n this.fixtureService.capabilitiesMatch(\n capabilityValue.type,\n capabilityType,\n capabilityValue.color,\n color,\n capabilityValue.wheel,\n wheel,\n capabilityValue.profileUuid,\n profileUuid\n )\n ) {\n return capabilityValue;\n }\n }\n return undefined;\n }\n\n deleteChannelValue(channelName: string, profileUuid: string) {\n for (let i = 0; i < this.selectedPreset.fixtureChannelValues.length; i++) {\n if (\n this.selectedPreset.fixtureChannelValues[i].channelName === channelName &&\n this.selectedPreset.fixtureChannelValues[i].profileUuid === profileUuid\n ) {\n this.selectedPreset.fixtureChannelValues.splice(i, 1);\n return;\n }\n }\n }\n\n setChannelValue(channelName: string, profileUuid: string, value: number) {\n // Delete existant properties with this type and set the new value\n this.deleteChannelValue(channelName, profileUuid);\n\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = channelName;\n fixtureChannelValue.profileUuid = profileUuid;\n fixtureChannelValue.value = value;\n\n this.selectedPreset.fixtureChannelValues.push(fixtureChannelValue);\n }\n\n getChannelValue(channelName: string, profileUuid: string): number {\n for (const channelValue of this.selectedPreset.fixtureChannelValues) {\n if (channelValue.channelName === channelName && channelValue.profileUuid === profileUuid) {\n return channelValue.value;\n }\n }\n }\n\n getApproximatedColorWheelCapability(preset: Preset, cachedChannel: CachedFixtureChannel): CachedFixtureCapability {\n // return an approximated wheel slot channel capability, if a color or a slot on a different\n // wheel has been selected\n let colorRed: number;\n let colorGreen: number;\n let colorBlue: number;\n let lowestDiff = Number.MAX_VALUE;\n let lowestDiffCapability: CachedFixtureCapability;\n let capabilityValue: FixtureCapabilityValue;\n\n capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Red);\n if (capabilityValue) {\n colorRed = 255 * capabilityValue.valuePercentage;\n }\n capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Green);\n if (capabilityValue) {\n colorGreen = 255 * capabilityValue.valuePercentage;\n }\n capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Blue);\n if (capabilityValue) {\n colorBlue = 255 * capabilityValue.valuePercentage;\n }\n\n if (!colorRed && !colorGreen && !colorBlue) {\n // no color found -> search the first color wheel\n // TODO\n }\n\n if (colorRed !== undefined && colorGreen !== undefined && colorBlue !== undefined) {\n for (const capability of cachedChannel.capabilities) {\n if (capability.capability.slotNumber) {\n const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);\n if (mixedColor) {\n const diff =\n Math.abs(mixedColor.red - colorRed) + Math.abs(mixedColor.green - colorGreen) + Math.abs(mixedColor.blue - colorBlue);\n\n if (diff < lowestDiff) {\n lowestDiff = diff;\n lowestDiffCapability = capability;\n }\n }\n }\n }\n }\n\n return lowestDiffCapability;\n }\n\n private hasCapabilityType(type: FixtureCapabilityType): boolean {\n // there is at least one channel with at least one intensity capability\n for (const fixtureUuid of this.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);\n for (const channel of fixture.channels) {\n if (channel.channel) {\n for (const capability of channel.capabilities) {\n if (capability.capability.type === type) {\n return true;\n }\n }\n }\n }\n }\n return false;\n }\n\n hasCapabilityDimmer(): boolean {\n return this.hasCapabilityType(FixtureCapabilityType.Intensity);\n }\n\n hasCapabilityColor(): boolean {\n // TODO optionally color temperature and color white (see stairville/mh-100)\n\n // one of the profiles has a color intensity\n if (this.hasCapabilityType(FixtureCapabilityType.ColorIntensity)) {\n return true;\n }\n\n return false;\n }\n\n hasCapabilityColorOrColorWheel(): boolean {\n // TODO optionally color temperature and color white (see stairville/mh-100)\n\n // one of the profiles has a color intensity\n if (this.hasCapabilityColor()) {\n return true;\n }\n\n // a color wheel is involved\n for (const fixtureUuid of this.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);\n for (const channel of fixture.channels) {\n if (channel.colorWheel) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n hasCapabilityPanTilt(): boolean {\n let hasPan = false;\n let hasTilt = false;\n\n // there is at least one pan and one tilt channel\n if (this.hasCapabilityType(FixtureCapabilityType.Pan)) {\n hasPan = true;\n }\n\n if (this.hasCapabilityType(FixtureCapabilityType.Tilt)) {\n hasTilt = true;\n }\n\n if (hasPan && hasTilt) {\n return true;\n }\n\n return false;\n }\n\n selectPreset(index: number) {\n this.effectService.selectedEffect = undefined;\n this.selectedPreset = this.projectService.project.presets[index];\n this.projectService.project.selectedPresetUuid = this.projectService.project.presets[index].uuid;\n this.autoOpenFirstEffect();\n this.previewSelectionChanged.next();\n this.previewLive();\n }\n\n autoOpenFirstEffect() {\n // open the first effect, if the preset only has one\n if (this.selectedPreset && this.selectedPreset.effects.length === 1) {\n this.effectService.selectedEffect = this.selectedPreset.effects[0];\n }\n }\n\n addPreset(name?: string): void {\n const preset: Preset = new Preset();\n preset.uuid = this.uuidService.getUuid();\n preset.name = name || 'New Preset';\n\n // Insert the new preset before the highest currently selected preset\n let highestSelectedPresetIndex = 0;\n\n for (let i = 0; i < this.projectService.project.presets.length; i++) {\n if (this.selectedPreset === this.projectService.project.presets[i]) {\n highestSelectedPresetIndex = i;\n break;\n }\n }\n\n this.projectService.project.presets.splice(highestSelectedPresetIndex, 0, preset);\n this.selectPreset(highestSelectedPresetIndex);\n }\n\n getSelectedProfiles() {\n const profiles: FixtureProfile[] = [];\n\n if (!this.selectedPreset) {\n return profiles;\n }\n\n for (const fixtureUuid of this.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getFixtureByUuid(fixtureUuid);\n const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);\n\n if (profiles.indexOf(profile) < 0) {\n profiles.push(profile);\n }\n }\n\n return profiles;\n }\n\n getSelectedProfileChannels(selectedProfiles: FixtureProfile[]) {\n const availableChannels: Map<FixtureProfile, CachedFixtureChannel[]> = new Map<FixtureProfile, CachedFixtureChannel[]>();\n\n const calculatedProfileModes = new Map<FixtureProfile, FixtureMode[]>();\n for (const profile of selectedProfiles) {\n const modes: FixtureMode[] = [];\n for (const fixtureUuid of this.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);\n if (modes.indexOf(fixture.mode) < 0) {\n modes.push(fixture.mode);\n }\n }\n calculatedProfileModes.set(profile, modes);\n }\n\n // calculate all required channels from the modes\n calculatedProfileModes.forEach((modes: FixtureMode[], profile: FixtureProfile) => {\n const profileChannels: CachedFixtureChannel[] = [];\n for (const mode of modes) {\n const channels = this.fixtureService.getCachedChannels(profile, mode);\n for (const channel of channels) {\n // only add the channel, if no channel with the same name has already been added\n // (e.g. a fine channel)\n if (channel.channel && !profileChannels.find((c) => c.name === channel.name)) {\n profileChannels.push(channel);\n }\n }\n }\n availableChannels.set(profile, profileChannels);\n });\n\n return availableChannels;\n }\n\n previewLive(compositionName: string = '', positionMillis?: number) {\n if (!this.configService.livePreview) {\n return;\n }\n\n // collect all changes and delay them to not flood the backend\n // (except play events. they need to be delivered always)\n if (this.livePreviewTimer && !compositionName) {\n this.liveChangePending = true;\n return;\n }\n\n let position = positionMillis;\n\n if (position === undefined) {\n position = Math.round(this.animationService.timeMillis);\n }\n\n this.http\n .post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))\n .subscribe();\n\n this.liveChangePending = false;\n\n if (!compositionName) {\n this.livePreviewTimer = setTimeout(() => {\n this.livePreviewTimer = undefined;\n if (this.liveChangePending) {\n this.http\n .post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))\n .subscribe();\n }\n }, 50);\n }\n }\n\n stopPreviewPlay() {\n if (!this.configService.livePreview) {\n return;\n }\n\n this.http.post('stop-preview-play', null).subscribe();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { Preset } from '../models/preset';\nimport { Scene } from '../models/scene';\nimport { EffectService } from './effect.service';\nimport { PresetService } from './preset.service';\nimport { ProjectService } from './project.service';\nimport { UuidService } from './uuid.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SceneService {\n selectedScenes: Scene[] = [];\n sceneColors: string[] = ['#945fda', '#61da5f', '#5fc3da', '#dad65f', '#da5f5f', '#246db7'];\n\n multipleSelection = false;\n\n sceneDeleted: Subject<void> = new Subject<void>();\n sceneSelected: Subject<void> = new Subject<void>();\n\n constructor(\n private uuidService: UuidService,\n private effectService: EffectService,\n private presetService: PresetService,\n private projectService: ProjectService\n ) {}\n\n sceneIsSelected(scene: Scene): boolean {\n for (const selectedScene of this.selectedScenes) {\n if (selectedScene.uuid === scene.uuid) {\n return true;\n }\n }\n\n return false;\n }\n\n presetIsSelected(preset: Preset): boolean {\n if (!this.selectedScenes || this.selectedScenes.length !== 1) {\n return false;\n }\n\n for (const uuid of this.selectedScenes[0].presetUuids) {\n if (preset.uuid === uuid) {\n return true;\n }\n }\n\n return false;\n }\n\n switchSceneSelection(scene: Scene) {\n // Select a scene if not yet selected or unselect it otherwise\n if (this.sceneIsSelected(scene)) {\n for (let i = 0; i < this.selectedScenes.length; i++) {\n if (this.selectedScenes[i].uuid === scene.uuid) {\n this.selectedScenes.splice(i, 1);\n return;\n }\n }\n } else {\n this.selectedScenes.push(scene);\n }\n\n this.sceneSelected.next();\n }\n\n selectPresetFromSelectedScene() {\n // select the first preset of the scene, if no preset of the current scene is already\n // selected to make sure, the user does not edit a preset which is not even\n // active in the current scene (and sees no change).\n\n let firstPresetUuid;\n\n // check, whether a preset of the current scene is already selected and do nothing\n // in this case\n for (const scene of this.selectedScenes) {\n for (const presetUuid of scene.presetUuids) {\n firstPresetUuid = presetUuid;\n\n if (presetUuid === this.presetService.selectedPreset.uuid) {\n // a preset of a currently selected scene is already selected -> do nothing\n return;\n }\n }\n }\n\n if (!firstPresetUuid) {\n return;\n }\n\n for (let i = 0; i < this.projectService.project.presets.length; i++) {\n if (this.projectService.project.presets[i].uuid === firstPresetUuid) {\n this.presetService.selectPreset(i);\n break;\n }\n }\n }\n\n selectScene(index: number) {\n this.effectService.selectedEffect = undefined;\n\n if (index >= this.projectService.project.scenes.length) {\n this.selectedScenes = [];\n } else {\n if (this.multipleSelection) {\n this.switchSceneSelection(this.projectService.project.scenes[index]);\n } else {\n this.selectedScenes = [];\n this.selectedScenes.push(this.projectService.project.scenes[index]);\n }\n }\n\n this.selectPresetFromSelectedScene();\n\n // preview the complete scene\n this.projectService.project.previewPreset = false;\n\n this.projectService.project.selectedSceneUuids = [];\n for (const scene of this.selectedScenes) {\n this.projectService.project.selectedSceneUuids.push(scene.uuid);\n }\n this.presetService.previewSelectionChanged.next();\n this.presetService.previewLive();\n\n this.sceneSelected.next();\n }\n\n addScene(name?: string): void {\n const scene: Scene = new Scene();\n scene.uuid = this.uuidService.getUuid();\n scene.name = name || 'New Scene';\n\n if (this.projectService.project.scenes.length < this.sceneColors.length) {\n scene.color = this.sceneColors[this.projectService.project.scenes.length];\n } else {\n scene.color = '#' + Math.random().toString(16).slice(2, 8).toUpperCase();\n }\n\n // Insert the new scene before the highest currently selected scene\n let highestSelectedSceneIndex = 0;\n\n for (let i = 0; i < this.projectService.project.scenes.length; i++) {\n if (this.sceneIsSelected(this.projectService.project.scenes[i])) {\n highestSelectedSceneIndex = i;\n break;\n }\n }\n\n this.projectService.project.scenes.splice(highestSelectedSceneIndex, 0, scene);\n this.selectScene(highestSelectedSceneIndex);\n }\n\n removeScene(scene: Scene): void {\n // remove all playback regions\n for (const composition of this.projectService.project.compositions) {\n for (let i = composition.scenePlaybackRegions.length - 1; i >= 0; i--) {\n const compositionPlaybackRegion = composition.scenePlaybackRegions[i];\n if (compositionPlaybackRegion.sceneUuid === scene.uuid) {\n composition.scenePlaybackRegions.splice(i, 1);\n }\n }\n }\n\n // remove the scene\n this.projectService.project.scenes.splice(this.projectService.project.scenes.indexOf(scene), 1);\n if (this.projectService.project.scenes.length > 0) {\n this.selectScene(0);\n }\n\n this.sceneDeleted.next();\n }\n\n getSceneByUuid(uuid: string): Scene {\n for (const scene of this.projectService.project.scenes) {\n if (scene.uuid === uuid) {\n return scene;\n }\n }\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, Subject, Subscription, timer } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport WaveSurfer from 'wavesurfer.js';\nimport CursorPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.cursor.min.js';\nimport RegionsPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.regions.min.js';\nimport TimeLinePlugin from 'wavesurfer.js/dist/plugin/wavesurfer.timeline.min.js';\nimport { guess } from 'web-audio-beat-detector';\nimport { Composition } from '../models/composition';\nimport { Preset } from '../models/preset';\nimport { PresetRegionScene } from '../models/preset-region-scene';\nimport { Scene } from '../models/scene';\nimport { ScenePlaybackRegion } from '../models/scene-playback-region';\nimport { ConfigService } from './config.service';\nimport { PresetService } from './preset.service';\nimport { ProjectService } from './project.service';\nimport { SceneService } from './scene.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TimelineService {\n public waveSurfer: WaveSurfer;\n public playState = 'paused';\n\n public zoom = 0;\n private timeUpdateSubscription: Subscription;\n public currentTime: string;\n private timelineClicking = false;\n public selectedPlaybackRegion: ScenePlaybackRegion;\n private intensity = 0.2;\n private intensitySelectedScene = 0.4;\n private intensityHighlighted = 0.8;\n public duration: string;\n public waveSurferReady: Subject<void> = new Subject();\n public detectChanges: Subject<void> = new Subject();\n\n // the current composition\n public selectedComposition: Composition;\n public selectedCompositionIndex: number;\n\n // can we add new compositions based on an external pool and\n // should new compositions not available in this pool be added there?\n public externalCompositionsAvailable = false;\n\n public loadingAudioFile = false;\n\n constructor(\n private sceneService: SceneService,\n private presetService: PresetService,\n private projectService: ProjectService,\n private http: HttpClient,\n private configService: ConfigService\n ) {\n this.presetService.previewSelectionChanged.subscribe(() => {\n this.selectedPlaybackRegion = undefined;\n this.updateRegionSelection();\n });\n this.sceneService.sceneDeleted.subscribe(() => {\n this.redrawAllRegions();\n });\n this.sceneService.sceneSelected.subscribe(() => {\n this.redrawAllRegions();\n });\n }\n\n private redrawAllRegions() {\n // remove all regions from wavesurver\n if (this.waveSurfer) {\n for (const key of Object.keys(this.waveSurfer.regions.list)) {\n const region: any = this.waveSurfer.regions.list[key];\n region.remove();\n }\n }\n\n // draw all regions\n this.drawAllRegions();\n }\n\n private pad(num: number, size: number): string {\n if (!num) {\n num = 0;\n }\n\n let padded: string = num.toString();\n while (padded.length < size) {\n padded = '0' + padded;\n }\n\n return padded;\n }\n\n private msToTime(millis: number, includeMillis: boolean = true): string {\n const ms: number = Math.round(millis % 1000);\n const seconds: number = Math.floor(((millis % 360000) % 60000) / 1000);\n const minutes: number = Math.floor((millis % 3600000) / 60000);\n\n if (includeMillis) {\n return this.pad(minutes, 2) + ':' + this.pad(seconds, 2) + '.' + this.pad(ms, 3);\n } else {\n return this.pad(minutes, 2) + ':' + this.pad(seconds, 2);\n }\n }\n\n private updateCurrentTime() {\n if (!this.waveSurfer) {\n return;\n }\n\n // display the current time\n this.currentTime = this.msToTime(this.waveSurfer.getCurrentTime() * 1000);\n\n if (!this.waveSurfer.timeline.drawer) {\n return;\n }\n\n // draw the current cursor on the timeline\n // TODO redrawing the timeline each update is way to expensive.\n // maybe as a better solution use an element, like the cursor inside Wavesurfer to\n // display the progress?\n let x = 0;\n const duration: number = this.waveSurfer.backend.getDuration();\n const width: number =\n this.waveSurfer.params.fillParent && !this.waveSurfer.params.scrollParent\n ? this.waveSurfer.timeline.drawer.getWidth()\n : this.waveSurfer.timeline.drawer.wrapper.scrollWidth * this.waveSurfer.params.pixelRatio;\n\n x = (width / duration) * this.waveSurfer.getCurrentTime() - 2;\n\n // update the timeline canvas\n this.waveSurfer.timeline.render();\n\n // draw the cursor on the timeline\n this.waveSurfer.timeline.canvases.forEach((canvas, i) => {\n const leftOffset = i * this.waveSurfer.timeline.maxCanvasWidth;\n\n const ctx = canvas.getContext('2d');\n\n ctx.fillStyle = '#fd7e14';\n ctx.beginPath();\n ctx.moveTo(x - 12 - leftOffset, 20);\n ctx.lineTo(x + 12 - leftOffset, 20);\n ctx.lineTo(x - leftOffset, 45);\n ctx.fill();\n });\n }\n\n private startTimeUpdater() {\n this.stopTimeUpdater();\n\n const timeUpdater = timer(0, 40);\n this.timeUpdateSubscription = timeUpdater.subscribe(() => {\n this.updateCurrentTime();\n });\n }\n\n private stopTimeUpdater() {\n if (this.timeUpdateSubscription) {\n this.timeUpdateSubscription.unsubscribe();\n }\n }\n\n formatTimeCallback(seconds: number, pxPerSec: number) {\n if (this.selectedComposition.gridType === 'musical') {\n return Math.round(seconds / this.selectedComposition.timeSignatureUpper / (60 / this.selectedComposition.beatsPerMinute));\n } else {\n // calculate minutes and seconds from seconds count\n const minutes = parseInt((seconds / 60) as any, 10);\n seconds = parseInt((seconds % 60) as any, 10);\n\n // fill up seconds with zeroes\n const secondsStr = seconds < 10 ? '0' + seconds : seconds;\n return `${minutes}:${secondsStr}`;\n }\n }\n\n timeInterval(pxPerSec: number) {\n if (this.selectedComposition.gridType === 'musical') {\n const interval = 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;\n\n if (pxPerSec < 40) {\n return interval * 4;\n } else if (pxPerSec < 80) {\n return interval * 2;\n }\n\n return interval;\n } else {\n if (pxPerSec >= 25) {\n return 1;\n } else if (pxPerSec * 5 >= 25) {\n return 5;\n } else if (pxPerSec * 15 >= 25) {\n return 15;\n }\n\n return Math.ceil(0.5 / pxPerSec) * 60;\n }\n }\n\n primaryLabelInterval(pxPerSec: number) {\n if (this.selectedComposition.gridType === 'musical') {\n const interval = this.selectedComposition.timeSignatureUpper * this.selectedComposition.gridResolution;\n\n return interval;\n } else {\n if (pxPerSec >= 25) {\n return 10;\n } else if (pxPerSec * 5 >= 25) {\n return 6;\n } else if (pxPerSec * 15 >= 25) {\n return 4;\n }\n\n return 4;\n }\n }\n\n secondaryLabelInterval(pxPerSec: number) {\n if (this.selectedComposition.gridType === 'musical') {\n return 0;\n } else {\n if (pxPerSec >= 25) {\n return 5;\n } else if (pxPerSec * 5 >= 25) {\n return 2;\n } else if (pxPerSec * 15 >= 25) {\n return 2;\n }\n return 2;\n }\n }\n\n private seeekWithTimeline(e: any) {\n // taken from wavesurfer -> drawer -> handleEvent\n const clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;\n const bbox = this.waveSurfer.timeline.wrapper.getBoundingClientRect();\n\n const nominalWidth = this.waveSurfer.timeline.drawer.width;\n const parentWidth = this.waveSurfer.timeline.drawer.getWidth();\n\n let progress: number;\n\n if (!this.waveSurfer.timeline.drawer.params.fillParent && nominalWidth < parentWidth) {\n progress =\n (this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) *\n (this.waveSurfer.timeline.drawer.params.pixelRatio / nominalWidth) || 0;\n\n if (progress > 1) {\n progress = 1;\n }\n } else {\n progress =\n ((this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) +\n this.waveSurfer.timeline.wrapper.scrollLeft) /\n this.waveSurfer.timeline.wrapper.scrollWidth || 0;\n }\n\n progress = Math.max(progress, 0);\n\n setTimeout(() => {\n this.waveSurfer.seekTo(progress);\n this.detectChanges.next();\n this.presetService.previewLive(this.selectedComposition.name, Math.round(this.waveSurfer.getCurrentTime() * 1000));\n }, 0);\n }\n\n applyZoom(zoom: any) {\n if (zoom < 0 || zoom > 200) {\n return;\n }\n\n this.zoom = zoom;\n if (this.waveSurfer) {\n setTimeout(() => {\n this.waveSurfer.zoom(this.zoom);\n this.updateCurrentTime();\n }, 0);\n }\n }\n\n private isWaveSurferReady(): boolean {\n if (!this.waveSurfer) {\n return false;\n }\n\n if (!this.waveSurfer.isReady) {\n return false;\n }\n\n return true;\n }\n\n addRegion(waveSurferRegion?: any) {\n if (!this.isWaveSurferReady()) {\n return;\n }\n\n if (!this.sceneService.selectedScenes || this.sceneService.selectedScenes.length !== 1) {\n return;\n }\n\n if (!this.selectedComposition) {\n return;\n }\n\n const scenePlaybackRegion: ScenePlaybackRegion = new ScenePlaybackRegion();\n scenePlaybackRegion.sceneUuid = this.sceneService.selectedScenes[0].uuid;\n\n if (waveSurferRegion) {\n scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;\n scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;\n } else {\n scenePlaybackRegion.startMillis = (this.waveSurfer.getDuration() * 1000) / 3;\n scenePlaybackRegion.endMillis = ((this.waveSurfer.getDuration() * 1000) / 3) * 2;\n }\n\n this.selectedComposition.scenePlaybackRegions.push(scenePlaybackRegion);\n\n this.selectedPlaybackRegion = scenePlaybackRegion;\n\n if (waveSurferRegion) {\n waveSurferRegion.color =\n 'rgba(' +\n this.hexToRgb(this.sceneService.selectedScenes[0].color).r +\n ', ' +\n this.hexToRgb(this.sceneService.selectedScenes[0].color).g +\n ', ' +\n this.hexToRgb(this.sceneService.selectedScenes[0].color).b +\n ', ' +\n this.intensityHighlighted +\n ')';\n waveSurferRegion.attributes.selectable = true;\n this.connectRegion(waveSurferRegion, this.sceneService.selectedScenes[0], scenePlaybackRegion);\n this.updateRegionSelection();\n } else {\n this.drawRegion(scenePlaybackRegion, this.sceneService.selectedScenes[0]);\n }\n\n this.presetService.previewLive();\n }\n\n private getSnapToGridInterval(): number {\n if (this.selectedComposition.snapToGrid) {\n return 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;\n }\n\n return undefined;\n }\n\n private getSnapToGridOffset(): number {\n return this.selectedComposition.gridOffsetMillis / 1000;\n }\n\n deleteSelectedComposition() {\n this.projectService.project.compositions.splice(this.selectedCompositionIndex, 1);\n this.selectedComposition = undefined;\n this.selectedCompositionIndex = undefined;\n this.destroyWaveSurfer();\n if (this.projectService.project.compositions.length > 0) {\n this.selectCompositionIndex(0);\n }\n }\n\n destroyWaveSurfer() {\n this.duration = undefined;\n this.loadingAudioFile = false;\n\n if (this.waveSurfer) {\n this.waveSurfer.destroy();\n this.waveSurfer = undefined;\n }\n }\n\n createWaveSurfer() {\n this.destroyWaveSurfer();\n\n if (!this.selectedComposition.audioFileName) {\n return;\n }\n\n this.loadingAudioFile = true;\n\n setTimeout(() => {\n this.waveSurfer = WaveSurfer.create({\n container: '#waveform',\n waveColor: 'white',\n progressColor: 'white',\n // barWidth: 2,\n height: 1,\n interact: false,\n // Use for timelines without sound. Wave will be displayed\n // wrong, but should work for a dummy audio without any waves.\n // duration: 400,\n plugins: [\n CursorPlugin.create({\n // showTime: true,\n opacity: 1,\n color: '#fd7e14',\n hideOnBlur: false /* don't show/hide the cursor on the wave (only on the timeline) */,\n }),\n RegionsPlugin.create({\n dragSelection: {\n slop: 5,\n },\n color: '#fff',\n snapToGridInterval: this.getSnapToGridInterval(),\n snapToGridOffset: this.getSnapToGridOffset(),\n }),\n TimeLinePlugin.create({\n container: '#waveform-timeline',\n primaryFontColor: '#fff',\n secondaryFontColor: '#fff',\n offset: this.getSnapToGridOffset(),\n formatTimeCallback: this.formatTimeCallback.bind(this),\n timeInterval: this.timeInterval.bind(this),\n primaryLabelInterval: this.primaryLabelInterval.bind(this),\n secondaryLabelInterval: this.secondaryLabelInterval.bind(this),\n }),\n ],\n });\n\n let audioFileName: string;\n\n if (this.configService.enableMediaLibrary) {\n // the file name is also used for the real file name\n audioFileName = 'file/get?name=' + this.selectedComposition.audioFileName + '&type=AUDIO';\n } else {\n // the composition uuid and extension is used as the file name\n audioFileName =\n 'composition-files/?file=' +\n this.selectedComposition.uuid +\n '.' +\n this.selectedComposition.audioFileName.substr(this.selectedComposition.audioFileName.lastIndexOf('.') + 1);\n }\n\n this.waveSurfer.load(this.configService.restUrl + audioFileName);\n\n this.waveSurfer.on('ready', () => {\n setTimeout(() => {\n // try guessing the bpm and offset from the file, if necessary\n if (this.selectedComposition.tempoGuessed) {\n // we already guessed the BPM of this file --> don't do it again\n this.loadingAudioFile = false;\n } else {\n // we have not yet guessed the BPM --> do it now\n this.selectedComposition.tempoGuessed = true;\n guess(this.waveSurfer.backend.buffer)\n .then(({ bpm, offset }) => {\n // the bpm and offset could be guessed\n this.selectedComposition.beatsPerMinute = bpm;\n this.selectedComposition.gridOffsetMillis = offset * 1000;\n this.loadingAudioFile = false;\n })\n .catch((err) => {\n // something went wrong\n console.error('Could not detect the BPM from the audio file', err);\n this.loadingAudioFile = false;\n });\n }\n\n this.duration = this.msToTime(this.waveSurfer.getDuration() * 1000);\n this.drawAllRegions();\n\n // scroll wavesurfer in sync with the timeline\n this.waveSurfer.timeline.wrapper.addEventListener('scroll', () => {\n this.waveSurfer.drawer.wrapper.scrollLeft = this.waveSurfer.timeline.wrapper.scrollLeft;\n\n // Set the scroll position of the timeline to the same position as the wavesurfer,\n // because the timeline is larger than wavesurfer and might get out of sync.\n // This way, if wavesurfer cannot scroll any further, we reset the position\n // of the timeline as well.\n this.waveSurfer.timeline.wrapper.scrollLeft = this.waveSurfer.drawer.wrapper.scrollLeft;\n });\n\n // display the cursor also on the timeline\n this.waveSurfer.timeline.wrapper.addEventListener('mouseenter', () => {\n this.waveSurfer.cursor.showCursor();\n });\n this.waveSurfer.timeline.wrapper.addEventListener('mouseleave', () => {\n this.waveSurfer.cursor.hideCursor();\n });\n this.waveSurfer.timeline.wrapper.addEventListener('mousemove', (e: any) => {\n const bbox = this.waveSurfer.container.getBoundingClientRect();\n const x = e.clientX - bbox.left;\n this.waveSurfer.cursor.updateCursorPosition(x, 0);\n });\n\n // hide the cursor on the wave initially. in combination with the param hideOnBlur = false,\n // it will never be displayed on the wave now. we handle it on the timeline only.\n this.waveSurfer.cursor.hideCursor();\n\n // seek on timeline-click\n this.waveSurfer.timeline.wrapper.addEventListener('mousedown', (e: any) => {\n this.timelineClicking = true;\n this.seeekWithTimeline(e);\n });\n\n this.waveSurfer.timeline.wrapper.addEventListener('mousemove', (e: any) => {\n if (this.timelineClicking) {\n this.seeekWithTimeline(e);\n }\n });\n\n this.waveSurfer.timeline.wrapper.addEventListener('mouseup', (e: any) => {\n this.timelineClicking = false;\n });\n\n this.updateCurrentTime();\n\n this.detectChanges.next();\n this.waveSurferReady.next();\n }, 0);\n });\n\n this.waveSurfer.on('error', (error: any) => {\n // could not load the composition --> delete it\n // (this may occur, when the composition has been deleted but the project is not saved afterwards)\n this.deleteSelectedComposition();\n });\n\n this.waveSurfer.on('seek', () => {\n this.updateCurrentTime();\n });\n\n this.waveSurfer.on('play', () => {\n this.startTimeUpdater();\n });\n\n this.waveSurfer.on('pause', () => {\n this.stopTimeUpdater();\n });\n\n this.waveSurfer.on('region-created', (region) => {\n // region created by selection or programmatically\n if (this.sceneService.selectedScenes && this.sceneService.selectedScenes.length === 1) {\n if (!region.data.handled) {\n this.addRegion(region);\n }\n } else {\n if (!region.data.handled) {\n region.remove();\n }\n }\n });\n\n this.waveSurfer.on('region-updated', (region: any) => {\n this.detectChanges.next();\n this.presetService.previewLive();\n });\n }, 0);\n }\n\n private hexToRgb(hex: string) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n }\n\n private updateRegionSelection() {\n if (!this.waveSurfer) {\n return;\n }\n\n for (const key of Object.keys(this.waveSurfer.regions.list)) {\n const region: any = this.waveSurfer.regions.list[key];\n\n // if no scene is set, the region is not valid (e.g. has been created, while\n // no scene has been selected and remove did not work properly)\n if (region.scene) {\n let intensity = this.intensity;\n\n region.drag = false;\n region.resize = false;\n region.attributes.selectable = false;\n\n if (this.sceneService.sceneIsSelected(region.scene)) {\n intensity = this.intensitySelectedScene;\n region.drag = true;\n region.resize = true;\n region.attributes.selectable = true;\n }\n\n region.attributes.selected = false;\n\n if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === region.scenePlaybackRegion) {\n intensity = this.intensityHighlighted;\n region.attributes.selected = true;\n }\n\n region.color =\n 'rgba(' +\n this.hexToRgb(region.scene.color).r +\n ', ' +\n this.hexToRgb(region.scene.color).g +\n ', ' +\n this.hexToRgb(region.scene.color).b +\n ', ' +\n intensity +\n ')';\n region.updateRender();\n }\n }\n }\n\n updateSelectedRegion() {\n if (!this.waveSurfer) {\n return;\n }\n\n if (!this.selectedPlaybackRegion) {\n return;\n }\n\n for (const key of Object.keys(this.waveSurfer.regions.list)) {\n const region: any = this.waveSurfer.regions.list[key];\n\n if (this.selectedPlaybackRegion === region.scenePlaybackRegion) {\n region.start = this.selectedPlaybackRegion.startMillis / 1000;\n region.end = this.selectedPlaybackRegion.endMillis / 1000;\n region.updateRender();\n break;\n }\n }\n }\n\n private setSelectedRegion(scenePlaybackRegion?: ScenePlaybackRegion) {\n if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === scenePlaybackRegion) {\n // No update required\n return;\n }\n\n if (scenePlaybackRegion) {\n this.selectedPlaybackRegion = scenePlaybackRegion;\n }\n\n this.updateRegionSelection();\n }\n\n private getRegionSnapToGridValue(value: number): number {\n // the regions should snap to a grid\n const offset = this.getSnapToGridOffset() || 0;\n const interval = this.getSnapToGridInterval() || 0;\n return Math.round((value - offset) / interval) * interval + offset;\n }\n\n private connectRegion(waveSurferRegion: any, scene: Scene, scenePlaybackRegion: ScenePlaybackRegion, preset?: Preset) {\n waveSurferRegion.scenePlaybackRegion = scenePlaybackRegion;\n waveSurferRegion.scene = scene;\n waveSurferRegion.preset = preset;\n\n waveSurferRegion.on('click', (event) => {\n if (this.sceneService.sceneIsSelected(scene)) {\n this.setSelectedRegion(scenePlaybackRegion);\n }\n });\n\n waveSurferRegion.on('update', () => {\n this.setSelectedRegion(scenePlaybackRegion);\n if (this.selectedComposition.snapToGrid) {\n // update the regions boundaries. they may not snap to grid, if it has been\n // disabled during creation of the region but activated afterwards.\n waveSurferRegion.start = this.getRegionSnapToGridValue(waveSurferRegion.start);\n waveSurferRegion.end = this.getRegionSnapToGridValue(waveSurferRegion.end);\n }\n scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;\n scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;\n });\n }\n\n private drawRegion(scenePlaybackRegion: ScenePlaybackRegion, scene: Scene) {\n // draw the regions of the currently selected scene\n if (!this.isWaveSurferReady()) {\n return;\n }\n\n // add the playback region\n const waveSurferRegion = this.waveSurfer.addRegion({\n start: scenePlaybackRegion.startMillis / 1000,\n end: scenePlaybackRegion.endMillis / 1000,\n color: '#fff',\n data: { handled: true },\n });\n this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion);\n\n // TODO show the all presets\n // for (let presetUuid of scene.presetUuids) {\n // const preset = this.presetService.getPresetByUuid(presetUuid);\n\n // let waveSurferRegion = this.timelineService.waveSurfer.addRegion({\n // start: (scenePlaybackRegion.startMillis + (preset.startMillis ? preset.startMillis : 0)) / 1000,\n // end: (scenePlaybackRegion.startMillis\n // + (preset.endMillis ? preset.endMillis : scenePlaybackRegion.endMillis - scenePlaybackRegion.startMillis)) / 1000,\n // color: '#fff',\n // data: { handled: true },\n // // TODO\n // attributes: {\n // preset: true,\n // name: 'Preset 1'\n // }\n // });\n // this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion, preset);\n // }\n\n this.updateRegionSelection();\n }\n\n removeRegion() {\n if (!this.selectedPlaybackRegion) {\n return;\n }\n\n if (this.sceneService.selectedScenes.length !== 1) {\n return;\n }\n\n for (let i = 0; i < this.selectedComposition.scenePlaybackRegions.length; i++) {\n if (this.selectedComposition.scenePlaybackRegions[i] === this.selectedPlaybackRegion) {\n // remove the region from wavesurfer\n for (const key of Object.keys(this.waveSurfer.regions.list)) {\n const region: any = this.waveSurfer.regions.list[key];\n\n if (region.scenePlaybackRegion === this.selectedPlaybackRegion) {\n region.remove();\n }\n }\n\n this.selectedPlaybackRegion = undefined;\n this.selectedComposition.scenePlaybackRegions.splice(i, 1);\n\n return;\n }\n }\n\n this.presetService.previewLive();\n }\n\n getPresetsInTime(timeMillis: number): PresetRegionScene[] {\n // Return all presets which should be active during the specified time\n const activePresets: PresetRegionScene[] = [];\n\n for (let sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {\n const scene = this.projectService.project.scenes[sceneIndex];\n\n for (const region of this.selectedComposition.scenePlaybackRegions) {\n if (region.sceneUuid === scene.uuid) {\n for (let presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {\n for (const presetUuid of scene.presetUuids) {\n if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {\n const preset = this.presetService.getPresetByUuid(presetUuid);\n\n if (preset) {\n let presetStartMillis = preset.startMillis === undefined ? region.startMillis : region.startMillis + preset.startMillis;\n let presetEndMillis = preset.endMillis === undefined ? region.endMillis : region.startMillis + preset.endMillis;\n\n // extend the running time, if fading is done outside the boundaries\n presetStartMillis -= preset.fadeInPre ? preset.fadeInMillis : 0;\n presetEndMillis += preset.fadeOutPost ? preset.fadeOutMillis : 0;\n\n if (presetStartMillis <= timeMillis && presetEndMillis >= timeMillis) {\n activePresets.push(new PresetRegionScene(preset, region, scene));\n }\n }\n }\n }\n }\n }\n }\n }\n\n return activePresets;\n }\n\n drawAllRegions() {\n if (!this.selectedComposition) {\n return;\n }\n\n // draw the regions in the same order as their corresponding scenes, but draw\n // the selected ones last, to make sure they're always clickable.\n for (let sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {\n const scene = this.projectService.project.scenes[sceneIndex];\n if (!this.sceneService.sceneIsSelected(scene)) {\n for (const scenePlaybackRegion of this.selectedComposition.scenePlaybackRegions) {\n if (scenePlaybackRegion.sceneUuid === scene.uuid) {\n this.drawRegion(scenePlaybackRegion, scene);\n }\n }\n }\n }\n\n // draw all selected scenes afterwards\n for (let sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {\n const scene = this.projectService.project.scenes[sceneIndex];\n\n if (this.sceneService.sceneIsSelected(scene)) {\n for (const scenePlaybackRegion of this.selectedComposition.scenePlaybackRegions) {\n if (scenePlaybackRegion.sceneUuid === scene.uuid) {\n this.drawRegion(scenePlaybackRegion, scene);\n }\n }\n }\n }\n }\n\n updateGrid() {\n if (this.waveSurferReady) {\n this.waveSurfer.timeline.params.offset = this.getSnapToGridOffset();\n\n this.waveSurfer.regions.params.snapToGridInterval = this.getSnapToGridInterval();\n this.waveSurfer.regions.params.snapToGridOffset = this.getSnapToGridOffset();\n }\n this.updateCurrentTime();\n }\n\n getExternalCompositionNames(): Observable<string[]> {\n // get available compositions from an external pool (e.g. Rocket Show)\n return this.http.get('composition/list').pipe(\n map((response: object[]) => {\n const compositionNames: string[] = [];\n\n for (const responseComposition of response) {\n compositionNames.push((responseComposition as any).name);\n }\n\n return compositionNames;\n })\n );\n }\n\n selectCompositionIndex(index: number) {\n this.selectedComposition = this.projectService.project.compositions[index];\n this.selectedCompositionIndex = index;\n this.projectService.project.selectedCompositionUuid = this.selectedComposition.uuid;\n this.createWaveSurfer();\n\n // required to trigger timeline.component.resize()\n this.waveSurferReady.next();\n\n this.applyZoom(0);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Universe } from '../models/universe';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UniverseService {\n universes: Universe[] = [];\n\n constructor() {}\n\n getUniverseByUuid(uuid: string): Universe {\n for (const universe of this.universes) {\n if (universe.uuid === uuid) {\n return universe;\n }\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport * as THREE from 'three';\nimport { CachedFixture } from '../models/cached-fixture';\nimport { EffectCurve } from '../models/effect-curve';\nimport { FixtureCapabilityType } from '../models/fixture-capability';\nimport { FixtureChannelValue } from '../models/fixture-channel-value';\nimport { Preset } from '../models/preset';\nimport { PresetRegionScene } from '../models/preset-region-scene';\nimport { Universe } from '../models/universe';\nimport { FixtureService } from './fixture.service';\nimport { PresetService } from './preset.service';\nimport { ProjectService } from './project.service';\nimport { SceneService } from './scene.service';\nimport { TimelineService } from './timeline.service';\nimport { UniverseService } from './universe.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PreviewService {\n public doUpdateFixtureSetup: Subject<void> = new Subject();\n\n public scene: THREE.Scene;\n\n private stageMeshes: THREE.Mesh[] = [];\n private stageMaterial = new THREE.MeshStandardMaterial({ color: 0x0d0d0d });\n\n constructor(\n private presetService: PresetService,\n private fixtureService: FixtureService,\n private sceneService: SceneService,\n private timelineService: TimelineService,\n private universeService: UniverseService,\n private projectService: ProjectService\n ) {}\n\n private getAlreadyCalculatedFixture(fixtures: CachedFixture[], fixtureIndex: number): CachedFixture {\n // Has this fixture already been calculated (same universe and dmx start address as a fixture before)\n // --> return it\n for (let i = 0; i < fixtureIndex; i++) {\n const calculatedFixture = fixtures[i];\n\n if (\n calculatedFixture.fixture.dmxUniverseUuid === fixtures[fixtureIndex].fixture.dmxUniverseUuid &&\n calculatedFixture.fixture.dmxFirstChannel === fixtures[fixtureIndex].fixture.dmxFirstChannel\n ) {\n return calculatedFixture;\n }\n }\n\n return undefined;\n }\n\n public getPresets(timeMillis: number): PresetRegionScene[] {\n // Get relevant presets in correct order to process with their corresponding scene, if available\n let presets: PresetRegionScene[] = [];\n\n if (this.timelineService.playState === 'playing') {\n // Only use active presets in current regions\n presets = this.timelineService.getPresetsInTime(timeMillis);\n } else {\n if (this.projectService.project.previewPreset) {\n // Only preview the selected preset\n if (this.presetService.selectedPreset) {\n presets.push(new PresetRegionScene(this.presetService.selectedPreset, undefined, undefined));\n }\n } else {\n // Preview the selected scenes\n for (let sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {\n for (const scene of this.sceneService.selectedScenes) {\n if (scene.uuid === this.projectService.project.scenes[sceneIndex].uuid) {\n for (let presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {\n for (const presetUuid of scene.presetUuids) {\n // Loop over the presets in the preset service to retain the preset order\n if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {\n presets.push(new PresetRegionScene(this.projectService.project.presets[presetIndex], undefined, scene));\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return presets;\n }\n\n private mixChannelValue(\n existingChannelValues: FixtureChannelValue[],\n channelValue: FixtureChannelValue,\n intensityPercentage: number,\n defaultValue: number = 0\n ) {\n let newValue: number = channelValue.value;\n let existingValue: number = defaultValue;\n\n if (intensityPercentage < 1) {\n // We need to mix a possibly existing value (or the default value 0) with the new value (fading)\n\n // Get the existant value for this property\n for (const existingChannelValue of existingChannelValues) {\n if (\n existingChannelValue.channelName === channelValue.channelName &&\n existingChannelValue.profileUuid === channelValue.profileUuid\n ) {\n existingValue = existingChannelValue.value;\n break;\n }\n }\n\n // Mix the existing value with the new value\n newValue = existingValue * (1 - intensityPercentage) + newValue * intensityPercentage;\n }\n\n // Remove the existant value, if available\n for (let i = 0; i < existingChannelValues.length; i++) {\n if (\n existingChannelValues[i].channelName === channelValue.channelName &&\n existingChannelValues[i].profileUuid === channelValue.profileUuid\n ) {\n existingChannelValues.splice(i, 1);\n break;\n }\n }\n\n // Add the new value\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = channelValue.channelName;\n fixtureChannelValue.profileUuid = channelValue.profileUuid;\n fixtureChannelValue.value = newValue;\n existingChannelValues.push(fixtureChannelValue);\n }\n\n // Get the fixture index inside the passed preset (used for chasing)\n private getFixtureIndex(preset: Preset, fixtureUuid: string): number {\n let index = 0;\n const countedDmxChannels: number[] = [];\n\n // Loop over the global fixtures to retain the order\n for (const fixture of this.projectService.project.fixtures) {\n for (const presetFixtureUuid of preset.fixtureUuids) {\n if (presetFixtureUuid === fixture.uuid) {\n if (fixture.uuid === fixtureUuid) {\n return index;\n }\n\n // don't count fixtures on the same channel as already counted ones\n if (!countedDmxChannels.includes(fixture.dmxFirstChannel)) {\n countedDmxChannels.push(fixture.dmxFirstChannel);\n index++;\n }\n break;\n }\n }\n }\n\n // Not found in the preset\n return undefined;\n }\n\n private getPresetIntensity(preset: PresetRegionScene, timeMillis: number): number {\n // When fading is in progress (on preset or scene-level), the current preset does not\n // fully cover underlying values.\n // -> 0 = no covering at all, 1 = fully cover (no fading)\n let intensityPercentageScene = 1;\n let intensityPercentagePreset = 1;\n let intensityPercentage = 1;\n\n if (preset.region && preset.scene) {\n // Fade out is stronger than fade in (if they overlap)\n\n // Take away intensity for scene fading\n const sceneStartMillis = preset.scene.fadeInPre ? preset.region.startMillis - preset.scene.fadeInMillis : preset.region.startMillis;\n const sceneEndMillis = preset.scene.fadeOutPost ? preset.region.endMillis + preset.scene.fadeOutMillis : preset.region.endMillis;\n\n if (timeMillis > sceneEndMillis - preset.scene.fadeOutMillis && timeMillis < sceneEndMillis) {\n // Scene fades out\n intensityPercentageScene = (sceneEndMillis - timeMillis) / preset.scene.fadeOutMillis;\n } else if (timeMillis < sceneStartMillis + preset.scene.fadeInMillis && timeMillis > sceneStartMillis) {\n // Scene fades in\n intensityPercentageScene = (timeMillis - sceneStartMillis) / preset.scene.fadeInMillis;\n }\n }\n\n if (preset.region && preset.preset) {\n // Take away intensity for preset fading\n let presetStartMillis =\n preset.preset.startMillis === undefined ? preset.region.startMillis : preset.region.startMillis + preset.preset.startMillis;\n\n let presetEndMillis =\n preset.preset.endMillis === undefined ? preset.region.endMillis : preset.region.startMillis + preset.preset.endMillis;\n\n // extend the running time, if fading is done outside the boundaries\n presetStartMillis -= preset.preset.fadeInPre ? preset.preset.fadeInMillis : 0;\n presetEndMillis += preset.preset.fadeOutPost ? preset.preset.fadeOutMillis : 0;\n\n if (timeMillis > presetEndMillis - preset.preset.fadeOutMillis && timeMillis < presetEndMillis) {\n // Preset fades out\n intensityPercentagePreset = (presetEndMillis - timeMillis) / preset.preset.fadeOutMillis;\n } else if (timeMillis < presetStartMillis + preset.preset.fadeInMillis && timeMillis > presetStartMillis) {\n // Preset fades in\n intensityPercentagePreset = (timeMillis - presetStartMillis) / preset.preset.fadeInMillis;\n }\n\n intensityPercentage = intensityPercentageScene * intensityPercentagePreset;\n }\n\n return intensityPercentage;\n }\n\n private mixCapabilityValues(\n preset: PresetRegionScene,\n cachedFixture: CachedFixture,\n values: FixtureChannelValue[],\n intensityPercentage: number\n ) {\n let hasColor = false;\n\n // mix the preset capability values\n for (const presetCapabilityValue of preset.preset.fixtureCapabilityValues) {\n for (const cachedChannel of cachedFixture.channels) {\n if (cachedChannel.channel) {\n for (const channelCapability of cachedChannel.capabilities) {\n if (\n this.fixtureService.capabilitiesMatch(\n presetCapabilityValue.type,\n channelCapability.capability.type,\n presetCapabilityValue.color,\n channelCapability.capability.color,\n presetCapabilityValue.wheel,\n channelCapability.wheelName,\n presetCapabilityValue.profileUuid,\n cachedFixture.profile.uuid\n )\n ) {\n // the capabilities match -> apply the value, if possible\n if (\n (presetCapabilityValue.type === FixtureCapabilityType.Intensity ||\n presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) &&\n presetCapabilityValue.valuePercentage >= 0\n ) {\n // intensity and colorIntensity (dimmer and color)\n const valuePercentage = presetCapabilityValue.valuePercentage;\n const defaultValue = 0;\n\n // brightness property\n if (cachedChannel.capabilities.length === 1) {\n // the only capability in this channel\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = cachedChannel.maxValue * valuePercentage;\n this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);\n\n if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {\n hasColor = true;\n }\n } else {\n // more than one capability in the channel\n if (channelCapability.capability.brightness === 'off' && valuePercentage === 0) {\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = channelCapability.centerValue;\n this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);\n\n if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {\n hasColor = true;\n }\n } else if (\n (channelCapability.capability.brightnessStart === 'dark' || channelCapability.capability.brightnessStart === 'off') &&\n channelCapability.capability.brightnessEnd === 'bright'\n ) {\n const value =\n (channelCapability.capability.dmxRange[1] - channelCapability.capability.dmxRange[0]) * valuePercentage +\n channelCapability.capability.dmxRange[0];\n\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = value;\n this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);\n\n if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {\n hasColor = true;\n }\n }\n }\n } else if (\n (presetCapabilityValue.type === FixtureCapabilityType.Pan || presetCapabilityValue.type === FixtureCapabilityType.Tilt) &&\n presetCapabilityValue.valuePercentage >= 0\n ) {\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = cachedChannel.maxValue * presetCapabilityValue.valuePercentage;\n this.mixChannelValue(values, fixtureChannelValue, 1);\n } else if (\n presetCapabilityValue.type === FixtureCapabilityType.WheelSlot &&\n channelCapability.capability.slotNumber === presetCapabilityValue.slotNumber\n ) {\n // wheel slot (color, gobo, etc.)\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = channelCapability.centerValue;\n this.mixChannelValue(values, fixtureChannelValue, 1);\n\n // check, whether we just set a color wheel value\n if (channelCapability.wheelIsColor) {\n hasColor = true;\n }\n }\n }\n }\n }\n\n // approximate the color from a color or a different color wheel, if necessary\n if (!hasColor && cachedChannel.colorWheel) {\n const capability = this.presetService.getApproximatedColorWheelCapability(preset.preset, cachedChannel);\n\n if (capability) {\n // we found an approximated color in the available wheel channel\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = capability.centerValue;\n this.mixChannelValue(values, fixtureChannelValue, 1);\n }\n }\n }\n }\n }\n\n private mixChannelValues(\n preset: PresetRegionScene,\n cachedFixture: CachedFixture,\n values: FixtureChannelValue[],\n intensityPercentage: number\n ) {\n // mix the preset channel values\n for (const cachedChannel of cachedFixture.channels) {\n if (cachedChannel.channel) {\n for (const channelValue of preset.preset.fixtureChannelValues) {\n if (cachedFixture.profile.uuid === channelValue.profileUuid && cachedChannel.name === channelValue.channelName) {\n this.mixChannelValue(values, channelValue, intensityPercentage);\n }\n }\n }\n }\n }\n\n private mixEffects(\n timeMillis: number,\n fixtureIndex: number,\n preset: PresetRegionScene,\n cachedFixture: CachedFixture,\n values: FixtureChannelValue[],\n intensityPercentage: number\n ) {\n for (const effect of preset.preset.effects) {\n if (effect.visible) {\n // EffectCurve\n if (effect instanceof EffectCurve) {\n const effectCurve = effect as EffectCurve;\n\n // capabilities\n for (const capability of effectCurve.capabilities) {\n for (const cachedChannel of cachedFixture.channels) {\n for (const channelCapability of cachedChannel.capabilities) {\n if (\n this.fixtureService.capabilitiesMatch(\n capability.type,\n channelCapability.capability.type,\n capability.color,\n channelCapability.capability.color,\n null,\n null,\n null,\n null\n )\n ) {\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);\n this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);\n }\n }\n }\n }\n\n // channels\n for (const channelProfile of effectCurve.channels) {\n if (channelProfile.profileUuid === cachedFixture.profile.uuid) {\n for (const channel of channelProfile.channels) {\n for (const cachedChannel of cachedFixture.channels) {\n if (cachedChannel.name === channel) {\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);\n this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);\n }\n }\n }\n\n break;\n }\n }\n }\n\n // TODO other effects (PanTilt, etc.)\n }\n }\n }\n\n // return all fixture uuids with their corresponding channel values\n public getChannelValues(timeMillis: number, presets: PresetRegionScene[]): Map<CachedFixture, FixtureChannelValue[]> {\n // Loop over all relevant presets and calc the property values from the presets (capabilities and effects)\n const calculatedFixtures = new Map<CachedFixture, FixtureChannelValue[]>();\n\n for (let i = 0; i < this.fixtureService.cachedFixtures.length; i++) {\n const cachedFixture = this.fixtureService.cachedFixtures[i];\n\n // all values of the current fixture channels\n let values: FixtureChannelValue[] = [];\n\n const alreadyCalculatedFixture = this.getAlreadyCalculatedFixture(this.fixtureService.cachedFixtures, i);\n\n if (alreadyCalculatedFixture) {\n // only relevant for the preview --> reuse all calculated values\n values = Object.assign([], calculatedFixtures.get(alreadyCalculatedFixture));\n } else {\n // apply the default values\n for (const cachedChannel of cachedFixture.channels) {\n if (cachedChannel.channel) {\n if (cachedChannel.channel.defaultValue) {\n const fixtureChannelValue = new FixtureChannelValue();\n fixtureChannelValue.channelName = cachedChannel.name;\n fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;\n fixtureChannelValue.value = cachedChannel.defaultValue;\n this.mixChannelValue(values, fixtureChannelValue, 1);\n }\n }\n }\n\n for (const preset of presets) {\n // search for this fixture in the preset and get it's preset-specific index (for chasing effects)\n const fixtureIndex = this.getFixtureIndex(preset.preset, cachedFixture.fixture.uuid);\n\n if (fixtureIndex >= 0) {\n // this fixture is also in the preset -> mix the required values (overwrite existing values,\n // if set multiple times)\n const intensityPercentage = this.getPresetIntensity(preset, timeMillis);\n\n this.mixCapabilityValues(preset, cachedFixture, values, intensityPercentage);\n this.mixChannelValues(preset, cachedFixture, values, intensityPercentage);\n this.mixEffects(timeMillis, fixtureIndex, preset, cachedFixture, values, intensityPercentage);\n }\n }\n }\n\n // Store the calculated values for subsequent fixtures on the same DMX address\n calculatedFixtures.set(cachedFixture, values);\n }\n\n return calculatedFixtures;\n }\n\n public setUniverseValues(fixtures: Map<CachedFixture, FixtureChannelValue[]>, masterDimmerValue: number) {\n // TODO only, if monitoring is enabled\n return;\n\n // Reset all DMX universes\n for (const universe of this.universeService.universes) {\n universe.channelValues = [];\n for (let i = 0; i < 512; i++) {\n universe.channelValues.push(0);\n }\n }\n\n // loop over each fixture\n fixtures.forEach((channelValues: FixtureChannelValue[], cachedFixture: CachedFixture) => {\n // TODO Get the correct universe for this fixture\n const universe: Universe = this.universeService.getUniverseByUuid(cachedFixture.fixture.dmxUniverseUuid);\n\n // loop over each channel for this fixture\n for (let channelIndex = 0; channelIndex < cachedFixture.mode.channels.length; channelIndex++) {\n const channelObj = cachedFixture.mode.channels[channelIndex];\n if (typeof channelObj === 'string') {\n const channelName = channelObj;\n // match this mode channel with a channel value\n for (const channelValue of channelValues) {\n const channel = this.fixtureService.getChannelByName(cachedFixture, channelName);\n if (channel && channel.channel) {\n const fineIndex = channel.channel.fineChannelAliases.indexOf(channelName);\n if (channel.name === channelValue.channelName || fineIndex > -1) {\n const universeChannel = cachedFixture.fixture.dmxFirstChannel + channelIndex;\n const dmxValue =\n Math.floor(channelValue.value / Math.pow(256, channel.channel.fineChannelAliases.length - (fineIndex + 1))) % 256;\n // TODO\n break;\n }\n }\n }\n }\n }\n });\n }\n\n public fixtureIsSelected(uuid: string, presets: PresetRegionScene[]): boolean {\n for (const preset of presets) {\n for (const fixtureUuid of preset.preset.fixtureUuids) {\n if (fixtureUuid === uuid) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public updateFixtureSetup() {\n this.doUpdateFixtureSetup.next();\n }\n\n public updateStage() {\n if (!this.scene) {\n return;\n }\n\n let geometry: any;\n let mesh: any;\n\n // Remove old meshes from the scene\n for (const existingMesh of this.stageMeshes) {\n this.scene.remove(existingMesh);\n existingMesh.geometry.dispose();\n }\n this.stageMeshes = [];\n\n // Floor\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stageWidthCm,\n this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageDepthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(0, this.projectService.project.stageFloorHeightCm / 2, 0);\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n\n // Pillar front left\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stagePillarWidthCm,\n this.projectService.project.stageHeightCm,\n this.projectService.project.stagePillarWidthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(\n -this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2,\n this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2\n );\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n\n // Pillar front right\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stagePillarWidthCm,\n this.projectService.project.stageHeightCm,\n this.projectService.project.stagePillarWidthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(\n this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2,\n this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2\n );\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n\n // Pillar back left\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stagePillarWidthCm,\n this.projectService.project.stageHeightCm,\n this.projectService.project.stagePillarWidthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(\n -this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2,\n this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm,\n -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2\n );\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n\n // Pillar back right\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stagePillarWidthCm,\n this.projectService.project.stageHeightCm,\n this.projectService.project.stagePillarWidthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(\n this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2,\n this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm,\n -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2\n );\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n\n // Ceiling\n geometry = new THREE.BoxBufferGeometry(\n this.projectService.project.stageWidthCm,\n this.projectService.project.stageCeilingHeightCm,\n this.projectService.project.stageDepthCm\n );\n mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);\n mesh.receiveShadow = false;\n mesh.castShadow = false;\n mesh.position.set(\n 0,\n this.projectService.project.stageHeightCm +\n this.projectService.project.stageCeilingHeightCm / 2 +\n this.projectService.project.stageFloorHeightCm,\n 0\n );\n this.scene.add(mesh);\n this.stageMeshes.push(mesh);\n }\n}\n","import * as THREE from 'three';\nimport { CachedFixture } from '../../models/cached-fixture';\nimport { CachedFixtureCapability } from '../../models/cached-fixture-capability';\nimport { CachedFixtureChannel } from '../../models/cached-fixture-channel';\nimport { Positioning } from '../../models/fixture';\nimport { FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';\nimport { FixtureChannelValue } from '../../models/fixture-channel-value';\nimport { FixtureService } from '../../services/fixture.service';\n\nexport abstract class Fixture3d {\n fixture: CachedFixture;\n fixtureHasDimmer = false;\n fixtureHasColorWheel = false;\n fixtureHasColor = false;\n\n scene: any;\n\n colorRed: number;\n colorGreen: number;\n colorBlue: number;\n\n dimmer = 0;\n\n isSelected = false;\n isLoaded = false;\n\n protected selectedMaterial: THREE.MeshLambertMaterial;\n\n constructor(public fixtureService: FixtureService, fixture: CachedFixture, scene: any) {\n this.fixture = fixture;\n this.scene = scene;\n\n // TODO Don't create it for each fixture but pass it from the preview service\n this.selectedMaterial = new THREE.MeshLambertMaterial({\n color: 0xff00ff,\n emissive: 0xff00ff,\n });\n\n // evaluate, various capabilities of this fixture\n for (const cachedChannel of this.fixture.channels) {\n if (cachedChannel.channel) {\n for (const capability of cachedChannel.capabilities) {\n switch (capability.capability.type) {\n case FixtureCapabilityType.Intensity:\n this.fixtureHasDimmer = true;\n break;\n case FixtureCapabilityType.ColorIntensity:\n this.fixtureHasColor = true;\n break;\n }\n }\n\n if (cachedChannel.colorWheel) {\n this.fixtureHasColorWheel = true;\n }\n }\n }\n }\n\n protected getCapabilityInValue(channel: CachedFixtureChannel, value: number): CachedFixtureCapability {\n for (const capability of channel.capabilities) {\n if (\n capability.capability.dmxRange.length === 0 ||\n (value >= capability.capability.dmxRange[0] && value <= capability.capability.dmxRange[1])\n ) {\n return capability;\n }\n }\n\n return undefined;\n }\n\n // Apply the properties of the base fixture to the preview\n updatePreview(channelValues: FixtureChannelValue[], masterDimmerValue: number) {\n // Apply default settings\n if (this.fixtureHasDimmer) {\n this.dimmer = 0;\n } else {\n this.dimmer = 1;\n }\n\n this.colorRed = 255;\n this.colorGreen = 255;\n this.colorBlue = 255;\n\n if (!this.fixtureHasColorWheel && this.fixtureHasColor) {\n this.colorRed = 0;\n this.colorGreen = 0;\n this.colorBlue = 0;\n }\n\n for (const channelValue of channelValues) {\n const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);\n const capability = this.getCapabilityInValue(channel, channelValue.value);\n\n if (capability) {\n switch (capability.capability.type) {\n case FixtureCapabilityType.Intensity: {\n let valuePercentage: number;\n if (capability.capability.dmxRange.length > 0) {\n valuePercentage =\n (channelValue.value - capability.capability.dmxRange[0]) /\n (capability.capability.dmxRange[1] - capability.capability.dmxRange[0]);\n } else {\n valuePercentage = channelValue.value / channel.maxValue;\n }\n this.dimmer = valuePercentage * masterDimmerValue;\n break;\n }\n case FixtureCapabilityType.ColorIntensity: {\n const valuePercentage = (255 * channelValue.value) / channel.maxValue;\n switch (capability.capability.color) {\n case FixtureCapabilityColor.Red:\n // Round needed for threejs\n this.colorRed = Math.round(valuePercentage);\n break;\n case FixtureCapabilityColor.Green:\n // Round needed for threejs\n this.colorGreen = Math.round(valuePercentage);\n break;\n case FixtureCapabilityColor.Blue:\n // Round needed for threejs\n this.colorBlue = Math.round(valuePercentage);\n break;\n }\n break;\n }\n case FixtureCapabilityType.WheelSlot: {\n const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);\n if (mixedColor) {\n this.colorRed = Math.round(mixedColor.red);\n this.colorGreen = Math.round(mixedColor.green);\n this.colorBlue = Math.round(mixedColor.blue);\n }\n break;\n }\n }\n }\n }\n }\n\n updatePosition(object: THREE.Object3D) {\n // Update the position\n switch (this.fixture.fixture.positioning) {\n case Positioning.topFront: {\n object.rotation.x = THREE.Math.degToRad(0);\n object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);\n break;\n }\n case Positioning.bottomFront: {\n object.rotation.x = THREE.Math.degToRad(180);\n object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);\n break;\n }\n case Positioning.topBack: {\n object.rotation.x = THREE.Math.degToRad(0);\n object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);\n break;\n }\n case Positioning.bottomBack: {\n object.rotation.x = THREE.Math.degToRad(180);\n object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);\n break;\n }\n case Positioning.manual: {\n object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY, this.fixture.fixture.positionZ);\n object.rotation.x = THREE.Math.degToRad(this.fixture.fixture.rotationX);\n object.rotation.y = THREE.Math.degToRad(this.fixture.fixture.rotationY);\n object.rotation.z = THREE.Math.degToRad(this.fixture.fixture.rotationZ);\n break;\n }\n }\n }\n\n destroy() {\n this.selectedMaterial.dispose();\n }\n}\n","import { forkJoin } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as THREE from 'three';\nimport { Mesh } from 'three';\nimport { CachedFixture } from '../../models/cached-fixture';\nimport { FixtureChannelValue } from '../../models/fixture-channel-value';\nimport { FixtureService } from '../../services/fixture.service';\nimport { PreviewMeshService } from '../../services/preview-mesh.service';\nimport { Fixture3d } from './fixture-3d';\n\nexport class ColorChanger3d extends Fixture3d {\n private readonly pointLightMaxIntensity: number = 2;\n private readonly spotLightMaxIntensity: number = 5;\n\n private mesh: THREE.Mesh;\n\n private objectGroup: THREE.Object3D = new THREE.Object3D();\n private spotlightGroup: THREE.Object3D = new THREE.Object3D();\n private spotLight: THREE.SpotLight;\n private spotLightHelper: THREE.SpotLightHelper;\n private spotLightBeam: THREE.Mesh;\n\n private pointLight: THREE.PointLight;\n\n private lastSelected: boolean;\n\n private material: THREE.MeshStandardMaterial;\n private atmosphereMaterial: THREE.ShaderMaterial;\n\n private atmosphereMat() {\n const vertexShader = [\n 'varying vec3\tvVertexWorldPosition;',\n 'varying vec3\tvVertexNormal;',\n\n 'void main(){',\n '\tvVertexNormal = normalize(normalMatrix * normal);',\n\n '\tvVertexWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;',\n\n '\t// set gl_Position',\n '\tgl_Position\t= projectionMatrix * modelViewMatrix * vec4(position, 1.0);',\n '}',\n ].join('\\n');\n const fragmentShader = [\n 'uniform vec3\tglowColor;',\n 'uniform float\tcoeficient;',\n 'uniform float\tpower;',\n 'uniform float\topacity;',\n\n 'varying vec3\tvVertexNormal;',\n 'varying vec3\tvVertexWorldPosition;',\n\n 'void main(){',\n '\tvec3 worldCameraToVertex= vVertexWorldPosition - cameraPosition;',\n '\tvec3 viewCameraToVertex\t= (viewMatrix * vec4(worldCameraToVertex, 0.0)).xyz;',\n '\tviewCameraToVertex\t= normalize(viewCameraToVertex);',\n '\tfloat intensity\t\t= pow(coeficient + dot(vVertexNormal, viewCameraToVertex), power);',\n '\tgl_FragColor\t\t= vec4(glowColor, intensity * opacity);',\n '}',\n ].join('\\n');\n\n // create custom material from the shader code above\n // that is within specially labeled script tags\n const material = new THREE.ShaderMaterial({\n uniforms: {\n coeficient: {\n type: 'f',\n value: 0.3,\n },\n power: {\n type: 'f',\n value: 1.3,\n },\n opacity: {\n type: 'f',\n value: 1.0,\n },\n glowColor: {\n type: 'c',\n value: new THREE.Color('white'),\n },\n },\n vertexShader,\n fragmentShader,\n // blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n });\n\n return material;\n }\n\n private createSpotLightBeam() {\n if (this.spotLightBeam) {\n this.spotlightGroup.remove(this.spotLightBeam);\n }\n\n // TODO update the correct angle from the profile\n const beamAngleDegrees = 14;\n const geometry = new THREE.CylinderGeometry(0.8, beamAngleDegrees * 1.2, 100, 64, 20, false);\n geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));\n geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI / 2));\n\n this.atmosphereMaterial = this.atmosphereMat();\n this.spotLightBeam = new THREE.Mesh(geometry, this.atmosphereMaterial);\n this.spotLightBeam.position.set(0, -0.02, 0);\n\n this.spotlightGroup.add(this.spotLightBeam);\n this.spotLightBeam.rotation.x = Math.PI / 2;\n }\n\n private createObjects() {\n (this.material as any) = new THREE.MeshLambertMaterial({\n color: 0x0d0d0d,\n emissive: 0x0d0d0d,\n });\n\n this.mesh.material = this.material;\n\n // Add the spotlight\n this.spotLight = new THREE.SpotLight(0xffffff, 1);\n this.spotLight.angle = 0.244;\n this.spotLight.penumbra = 0.5;\n this.spotLight.decay = 2;\n this.spotLight.distance = 60000;\n this.spotLight.castShadow = false;\n this.spotLight.intensity = 10;\n\n this.spotLightHelper = new THREE.SpotLightHelper(this.spotLight);\n // scene.add(this.spotLightHelper);\n\n const spotLightTarget = new THREE.Object3D();\n this.spotLight.target = spotLightTarget;\n\n this.spotlightGroup.add(this.spotLight);\n this.spotlightGroup.add(spotLightTarget);\n this.spotLight.position.set(0, -1.4, 0);\n spotLightTarget.position.set(0, -10, 0);\n\n // Add the point light for the surrounding light\n this.pointLight = new THREE.PointLight(0xffffff, 2, 1000);\n this.spotlightGroup.add(this.pointLight);\n this.pointLight.position.set(0, -1.4, 0);\n\n // Add the light beam\n this.createSpotLightBeam();\n\n this.objectGroup.add(this.spotlightGroup);\n this.objectGroup.add(this.mesh);\n\n // A moving head has about 32 cm in width\n this.objectGroup.scale.multiplyScalar(9);\n\n this.scene.add(this.objectGroup);\n\n this.isLoaded = true;\n }\n\n constructor(fixtureService: FixtureService, previewMeshService: PreviewMeshService, fixture: CachedFixture, scene: any) {\n super(fixtureService, fixture, scene);\n\n forkJoin([previewMeshService.getMesh('color-changer')])\n .pipe(\n map(([colorChanger]) => {\n this.mesh = colorChanger;\n\n this.createObjects();\n })\n )\n .subscribe();\n }\n\n public getObject(): THREE.Object3D {\n return this.objectGroup;\n }\n\n public updatePreview(channelValues: FixtureChannelValue[], masterDimmerValue: number): void {\n super.updatePreview(channelValues, masterDimmerValue);\n\n if (!this.isLoaded) {\n return;\n }\n\n this.updatePosition(this.objectGroup);\n\n // Update the material\n if (this.lastSelected !== this.isSelected) {\n if (this.isSelected) {\n for (const child of this.mesh.children) {\n (child as Mesh).material = this.selectedMaterial;\n }\n } else {\n for (const child of this.mesh.children) {\n (child as Mesh).material = this.material;\n }\n }\n\n this.lastSelected = this.isSelected;\n }\n\n // Update the light helpers\n this.spotLightHelper.update();\n\n // Apply the colors\n const color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');\n\n this.pointLight.color = color;\n\n this.spotLight.color = color;\n (this.spotLightBeam.material as any).uniforms.glowColor.value = color;\n\n // Apply the dimmer value\n // Take the color into account for the beam (don't show a black beam)\n const intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);\n (this.spotLightBeam.material as any).uniforms.opacity.value = Math.min(intensityColor, this.dimmer) * 0.5;\n\n this.spotLight.intensity = this.spotLightMaxIntensity * this.dimmer;\n this.pointLight.intensity = this.pointLightMaxIntensity * this.dimmer;\n }\n\n destroy() {\n this.scene.remove(this.objectGroup);\n this.material.dispose();\n this.atmosphereMaterial.dispose();\n }\n}\n","import { forkJoin } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as THREE from 'three';\nimport { CachedFixture } from '../../models/cached-fixture';\nimport { FixtureCapabilityType } from '../../models/fixture-capability';\nimport { FixtureChannelValue } from '../../models/fixture-channel-value';\nimport { FixtureService } from '../../services/fixture.service';\nimport { PreviewMeshService } from '../../services/preview-mesh.service';\nimport { Fixture3d } from './fixture-3d';\n\nexport class MovingHead3d extends Fixture3d {\n private readonly pointLightMaxIntensity: number = 2;\n private readonly spotLightLightMaxIntensity: number = 10;\n\n private pan: number;\n private tilt: number;\n\n private socket: THREE.Mesh;\n private arm: THREE.Mesh;\n private head: THREE.Mesh;\n\n private headGroup: THREE.Object3D = new THREE.Object3D();\n private spotlightGroup: THREE.Object3D = new THREE.Object3D();\n private armGroup: THREE.Object3D = new THREE.Object3D();\n private objectGroup: THREE.Object3D = new THREE.Object3D();\n private spotLight: THREE.SpotLight;\n private spotLightHelper: THREE.SpotLightHelper;\n private spotLightBeam: THREE.Mesh;\n\n private pointLight: THREE.PointLight;\n\n private lastBeamAngleDegrees: number;\n private lastSelected: boolean;\n\n private material: THREE.MeshStandardMaterial;\n private atmosphereMaterial: THREE.ShaderMaterial;\n\n private atmosphereMat() {\n const vertexShader = [\n 'varying vec3\tvVertexWorldPosition;',\n 'varying vec3\tvVertexNormal;',\n\n 'void main(){',\n '\tvVertexNormal = normalize(normalMatrix * normal);',\n\n '\tvVertexWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;',\n\n '\t// set gl_Position',\n '\tgl_Position\t= projectionMatrix * modelViewMatrix * vec4(position, 1.0);',\n '}',\n ].join('\\n');\n const fragmentShader = [\n 'uniform vec3\tglowColor;',\n 'uniform float\tcoeficient;',\n 'uniform float\tpower;',\n 'uniform float\topacity;',\n\n 'varying vec3\tvVertexNormal;',\n 'varying vec3\tvVertexWorldPosition;',\n\n 'void main(){',\n '\tvec3 worldCameraToVertex= vVertexWorldPosition - cameraPosition;',\n '\tvec3 viewCameraToVertex\t= (viewMatrix * vec4(worldCameraToVertex, 0.0)).xyz;',\n '\tviewCameraToVertex\t= normalize(viewCameraToVertex);',\n '\tfloat intensity\t\t= pow(coeficient + dot(vVertexNormal, viewCameraToVertex), power);',\n '\tgl_FragColor\t\t= vec4(glowColor, intensity * opacity);',\n '}',\n ].join('\\n');\n\n // create custom material from the shader code above\n // that is within specially labeled script tags\n const material = new THREE.ShaderMaterial({\n uniforms: {\n coeficient: {\n type: 'f',\n value: 0.3,\n },\n power: {\n type: 'f',\n value: 1.3,\n },\n opacity: {\n type: 'f',\n value: 1.0,\n },\n glowColor: {\n type: 'c',\n value: new THREE.Color('white'),\n },\n },\n vertexShader,\n fragmentShader,\n // blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n });\n\n return material;\n }\n\n private createSpotLightBeam() {\n if (this.spotLightBeam) {\n this.spotlightGroup.remove(this.spotLightBeam);\n }\n\n // TODO update the correct angle from the profile\n const beamAngleDegrees = 14;\n const geometry = new THREE.CylinderGeometry(0.1, beamAngleDegrees * 1.2, 100, 64, 20, false);\n geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));\n geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI / 2));\n\n // var zrak_mat = new THREE.MeshBasicMaterial({ color: 0xffffff, blending: THREE.AdditiveBlending, opacity: 0.1 });\n\n this.atmosphereMaterial = this.atmosphereMat();\n this.spotLightBeam = new THREE.Mesh(geometry, this.atmosphereMaterial);\n this.spotLightBeam.position.set(0, -0.02, 0);\n\n this.spotlightGroup.add(this.spotLightBeam);\n this.spotLightBeam.rotation.x = Math.PI / 2;\n }\n\n private createObjects() {\n (this.material as any) = new THREE.MeshLambertMaterial({\n color: 0x0d0d0d,\n emissive: 0x0d0d0d,\n });\n\n this.socket.material = this.material;\n this.arm.material = this.material;\n this.head.material = this.material;\n\n // Add the head\n this.head.scale.multiplyScalar(0.9);\n this.head.position.set(-0.1, 0, 0);\n const headPivotGroup = new THREE.Object3D();\n headPivotGroup.add(this.head);\n this.headGroup.add(headPivotGroup);\n\n // Add the spotlight\n this.spotLight = new THREE.SpotLight(0xffffff, 1);\n this.spotLight.angle = 0.244;\n this.spotLight.penumbra = 0.5;\n this.spotLight.decay = 2;\n this.spotLight.distance = 60000;\n this.spotLight.castShadow = false;\n this.spotLight.intensity = 10;\n\n this.spotLightHelper = new THREE.SpotLightHelper(this.spotLight);\n // scene.add(this.spotLightHelper);\n\n const spotLightTarget = new THREE.Object3D();\n this.spotLight.target = spotLightTarget;\n\n this.spotlightGroup.add(this.spotLight);\n this.spotlightGroup.add(spotLightTarget);\n this.spotLight.position.set(0, -1.4, 0);\n spotLightTarget.position.set(0, -10, 0);\n\n // Add the point light for the surrounding light\n this.pointLight = new THREE.PointLight(0xffffff, 2, 1000);\n this.spotlightGroup.add(this.pointLight);\n this.pointLight.position.set(0, -1.4, 0);\n\n // Add the light beam\n this.createSpotLightBeam();\n\n this.headGroup.add(this.spotlightGroup);\n\n // Add the arm\n this.armGroup.add(this.headGroup);\n this.headGroup.position.set(0, -0.6, 0);\n this.armGroup.add(this.arm);\n\n // Add the socket\n this.objectGroup.add(this.armGroup);\n this.objectGroup.add(this.socket);\n this.socket.position.set(0, 1.2, 0);\n\n // A moving head has about 32 cm in width\n this.objectGroup.scale.multiplyScalar(9);\n\n this.scene.add(this.objectGroup);\n\n this.isLoaded = true;\n }\n\n constructor(fixtureService: FixtureService, previewMeshService: PreviewMeshService, fixture: CachedFixture, scene: any) {\n super(fixtureService, fixture, scene);\n\n forkJoin([\n previewMeshService.getMesh('moving_head_socket'),\n previewMeshService.getMesh('moving_head_arm'),\n previewMeshService.getMesh('moving_head_head'),\n ])\n .pipe(\n map(([socket, arm, head]) => {\n this.socket = socket;\n this.arm = arm;\n this.head = head;\n\n this.createObjects();\n })\n )\n .subscribe();\n }\n\n public getObject(): THREE.Object3D {\n return this.objectGroup;\n }\n\n public updatePreview(channelValues: FixtureChannelValue[], masterDimmerValue: number): void {\n super.updatePreview(channelValues, masterDimmerValue);\n\n if (!this.isLoaded) {\n return;\n }\n\n // Apply default settings\n let panStart = 0;\n let panEnd = 255;\n\n let tiltStart = 0;\n let tiltEnd = 255;\n\n this.pan = 0;\n this.tilt = 0;\n\n // Apply the known property values\n for (const channelValue of channelValues) {\n const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);\n const capability = this.getCapabilityInValue(channel, channelValue.value);\n if (capability) {\n switch (capability.capability.type) {\n case FixtureCapabilityType.Pan: {\n panStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;\n panEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 540;\n this.pan = channelValue.value / channel.maxValue;\n break;\n }\n case FixtureCapabilityType.Tilt: {\n tiltStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;\n tiltEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 2700;\n this.tilt = channelValue.value / channel.maxValue;\n break;\n }\n }\n }\n }\n\n this.updatePosition(this.objectGroup);\n\n // calculate the y/x rotation in radiants based on pan/tilt (0-1) respecting the max pan/tilt\n this.armGroup.rotation.y = THREE.Math.degToRad(panEnd * this.pan + panStart) - THREE.Math.degToRad(panEnd / 2);\n this.headGroup.rotation.x = THREE.Math.degToRad(tiltEnd * this.tilt + tiltStart) - THREE.Math.degToRad(tiltEnd / 2);\n\n // Update the angle (only on change, because it's expensive)\n // TODO update the correct angle from the profile\n const beamAngleDregrees = 14;\n if (this.lastBeamAngleDegrees !== beamAngleDregrees) {\n this.spotLight.angle = THREE.Math.degToRad(beamAngleDregrees);\n this.createSpotLightBeam();\n this.lastBeamAngleDegrees = beamAngleDregrees;\n }\n\n // Update the material\n if (this.lastSelected !== this.isSelected) {\n if (this.isSelected) {\n this.socket.material = this.selectedMaterial;\n this.arm.material = this.selectedMaterial;\n this.head.material = this.selectedMaterial;\n } else {\n this.socket.material = this.material;\n this.arm.material = this.material;\n this.head.material = this.material;\n }\n\n this.lastSelected = this.isSelected;\n }\n\n // Update the light helpers\n this.spotLightHelper.update();\n\n // Apply the colors\n const color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');\n\n this.pointLight.color = color;\n\n this.spotLight.color = color;\n (this.spotLightBeam.material as any).uniforms.glowColor.value = color;\n\n // Apply the dimmer value\n // Take the color into account for the beam (don't show a black beam)\n const intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);\n (this.spotLightBeam.material as any).uniforms.opacity.value = Math.min(intensityColor, this.dimmer);\n\n this.spotLight.intensity = this.spotLightLightMaxIntensity * this.dimmer;\n this.pointLight.intensity = this.pointLightMaxIntensity * this.dimmer;\n\n // this.spotLightBeam.material.uniforms.viewVector.value =\n // new THREE.Vector3().subVectors(this.camera.position, this.spotLightBeam.position);\n }\n\n destroy() {\n this.scene.remove(this.objectGroup);\n this.material.dispose();\n this.atmosphereMaterial.dispose();\n }\n}\n","import { AfterViewInit, Component, ElementRef, HostListener, ViewChild } from '@angular/core';\nimport * as THREE from 'three';\nimport STATS from 'three/examples/js/libs/stats.min';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\nimport { FixtureCategory } from '../models/fixture-profile';\nimport { FixtureService } from '../services/fixture.service';\nimport { PreviewMeshService } from '../services/preview-mesh.service';\nimport { PreviewService } from '../services/preview.service';\nimport { ProjectService } from '../services/project.service';\nimport { TimelineService } from '../services/timeline.service';\nimport { Positioning } from './../models/fixture';\nimport { AnimationService } from './../services/animation.service';\nimport { ColorChanger3d } from './models/color-changer-3d';\nimport { Fixture3d } from './models/fixture-3d';\nimport { MovingHead3d } from './models/moving-head-3d';\n\n@Component({\n selector: 'lib-app-preview',\n templateUrl: './preview.component.html',\n styleUrls: ['./preview.component.css'],\n})\nexport class PreviewComponent implements AfterViewInit {\n private renderer: THREE.WebGLRenderer;\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n public controls: OrbitControls;\n\n private stats: any = STATS();\n // private rendererStats = new THREEx.RendererStats();\n\n private fixtures3d: Fixture3d[] = [];\n\n @ViewChild('canvas')\n private canvasRef: ElementRef;\n\n constructor(\n private fixtureService: FixtureService,\n private previewMeshService: PreviewMeshService,\n private animationService: AnimationService,\n private previewService: PreviewService,\n private timelineService: TimelineService,\n private projectService: ProjectService\n ) {\n this.previewService.doUpdateFixtureSetup.subscribe(() => {\n // synchronize the 3d-fixtures to the project fixtures\n this.syncFixtures();\n });\n }\n\n private syncFixtures() {\n // remove all fixtures\n for (const fixture3d of this.fixtures3d) {\n fixture3d.destroy();\n }\n this.fixtures3d = [];\n\n // add all fixtures from the project\n for (const fixture of this.fixtureService.cachedFixtures) {\n switch (fixture.profile.categories[0]) {\n case FixtureCategory['Moving Head']:\n this.fixtures3d.push(new MovingHead3d(this.fixtureService, this.previewMeshService, fixture, this.scene));\n break;\n case FixtureCategory['Color Changer']:\n this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));\n break;\n case FixtureCategory['Blinder']:\n this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));\n break;\n }\n }\n }\n\n private get canvas(): HTMLCanvasElement {\n return this.canvasRef.nativeElement;\n }\n\n private render() {\n this.renderer.render(this.scene, this.camera);\n }\n\n private updateStagePosition(\n positioning: Positioning,\n xMin: number,\n xMax: number,\n yMin: number,\n yMax: number,\n zMin: number,\n zMax: number\n ) {\n let positionCount = 0; // Number of fixtures in the same position\n let positionIndex = 1;\n\n this.projectService.project.fixtures.forEach((element, index) => {\n if (element.positioning === positioning) {\n positionCount++;\n }\n });\n\n this.projectService.project.fixtures.forEach((element, index) => {\n if (element.positioning === positioning) {\n element.positionX = xMin + ((xMax - xMin) / (positionCount + 1)) * positionIndex;\n element.positionY = yMin + ((yMax - yMin) / (positionCount + 1)) * positionIndex;\n element.positionZ = zMin + ((zMax - zMin) / (positionCount + 1)) * positionIndex;\n\n positionIndex++;\n }\n });\n }\n\n private animate(timeMillis: number) {\n this.stats.begin();\n\n if (this.timelineService.playState === 'playing') {\n // Overwrite the current time with the playing time, if we're in playback mode\n timeMillis = this.timelineService.waveSurfer.getCurrentTime() * 1000;\n }\n\n this.animationService.timeMillis = timeMillis;\n\n // Update the controls\n if (this.controls) {\n this.controls.update();\n }\n\n // Update the positions\n this.updateStagePosition(\n Positioning.topFront,\n -this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageDepthCm / 2 - 70,\n this.projectService.project.stageDepthCm / 2 - 70\n );\n this.updateStagePosition(\n Positioning.bottomFront,\n -this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageDepthCm / 2 - 70,\n this.projectService.project.stageDepthCm / 2 - 70\n );\n this.updateStagePosition(\n Positioning.topBack,\n -this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm,\n -this.projectService.project.stageDepthCm / 2 + 70,\n -this.projectService.project.stageDepthCm / 2 + 70\n );\n this.updateStagePosition(\n Positioning.bottomBack,\n -this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageWidthCm / 2,\n this.projectService.project.stageFloorHeightCm,\n this.projectService.project.stageFloorHeightCm,\n -this.projectService.project.stageDepthCm / 2 + 70,\n -this.projectService.project.stageDepthCm / 2 + 70\n );\n\n // Update all fixtures and apply the preview properties, if available\n // TODO Update the fixtures only e.g. 40 times per second according to the \"real\" refresh rate of the DMX interface?\n const presets = this.previewService.getPresets(timeMillis);\n\n const calculatedFixtures = this.previewService.getChannelValues(timeMillis, presets);\n\n for (const fixture3d of this.fixtures3d) {\n // Update the fixture properties\n fixture3d.updatePreview(calculatedFixtures.get(fixture3d.fixture) || [], this.projectService.project.masterDimmerValue);\n\n // Select the fixture, if required\n if (this.fixtureService.settingsSelection) {\n fixture3d.isSelected = this.fixtureService.settingsFixtureIsSelected(fixture3d.fixture.fixture);\n } else {\n fixture3d.isSelected = this.previewService.fixtureIsSelected(fixture3d.fixture.fixture.uuid, presets);\n }\n }\n\n // TODO enable for monitoring the DMX universes\n this.previewService.setUniverseValues(calculatedFixtures, this.projectService.project.masterDimmerValue);\n\n // Update the statistics\n // this.rendererStats.update(this.renderer);\n\n // Render the scene\n this.render();\n\n this.stats.end();\n\n requestAnimationFrame(this.animate.bind(this));\n }\n\n private getAspectRatio(): number {\n const height = this.canvas.clientHeight;\n\n if (height === 0) {\n return 0;\n }\n\n return this.canvas.clientWidth / this.canvas.clientHeight;\n }\n\n @HostListener('window:resize')\n public onResize() {\n this.camera.aspect = this.getAspectRatio();\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);\n }\n\n private setupRenderer() {\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.canvas.appendChild(this.renderer.domElement);\n this.renderer.setPixelRatio(devicePixelRatio);\n this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);\n this.renderer.shadowMap.enabled = false;\n this.renderer.gammaInput = true;\n this.renderer.gammaOutput = true;\n }\n\n private setupCamera() {\n this.camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000);\n this.camera.position.set(-600, 80, 700);\n }\n\n private setupControls() {\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.enableKeys = false;\n this.controls.rotateSpeed = 0.05;\n this.controls.zoomSpeed = 1.2;\n this.controls.enableDamping = true;\n this.controls.dampingFactor = 0.25;\n this.controls.screenSpacePanning = false;\n this.controls.minDistance = 700;\n // this.controls.zoom = 1000;\n this.controls.maxDistance = 2000;\n this.controls.maxPolarAngle = Math.PI / 2;\n this.controls.target = new THREE.Vector3(0, 200, 0);\n // this.controls.rotation = 100;\n }\n\n private setupFloor() {\n const width = 4000;\n const height = 1;\n\n const geometry = new THREE.BoxGeometry(width, height, width);\n const material = new THREE.MeshStandardMaterial({ color: 0x0d0d0d });\n\n const floor = new THREE.Mesh(geometry.clone(), material);\n floor.receiveShadow = false;\n floor.castShadow = false;\n floor.position.set(0, -height / 2, 0);\n this.scene.add(floor);\n }\n\n private setupStats() {\n // this.rendererStats.domElement.style.position = 'absolute';\n // this.rendererStats.domElement.style.left = '0px';\n // this.rendererStats.domElement.style.bottom = '0px';\n // this.canvas.appendChild(this.rendererStats.domElement);\n\n this.stats.domElement.style.position = 'absolute';\n this.stats.domElement.style.left = '0px';\n this.canvas.appendChild(this.stats.domElement);\n }\n\n private setupScene() {\n // Create a new scene\n this.scene = new THREE.Scene();\n\n this.previewService.scene = this.scene;\n\n // Add a little bit of ambient light\n const ambient = new THREE.AmbientLight(0xffffff, 0.8);\n this.scene.add(ambient);\n\n // Add a floor\n this.setupFloor();\n\n // Create the stage dimensions\n this.previewService.updateStage();\n\n // TODO refine. background light in a color of the fixtures?\n const lights = [];\n lights[0] = new THREE.PointLight(0xffffff, 0.5, 0);\n lights[1] = new THREE.PointLight(0xffffff, 0.5, 0);\n lights[2] = new THREE.PointLight(0xffffff, 0.5, 0);\n\n lights[0].position.set(0, 2000, 0);\n lights[1].position.set(1000, 2000, 1000);\n lights[2].position.set(-1000, -2000, -1000);\n\n this.scene.add(lights[0]);\n this.scene.add(lights[1]);\n this.scene.add(lights[2]);\n\n // Create the stats\n this.setupStats();\n }\n\n ngAfterViewInit(): void {\n this.setupRenderer();\n this.setupCamera();\n this.setupControls();\n this.setupScene();\n\n this.onResize();\n this.animate(null);\n }\n}\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-wait-dialog',\n templateUrl: './wait-dialog.component.html',\n styleUrls: ['./wait-dialog.component.css'],\n})\nexport class WaitDialogComponent implements OnInit {\n constructor() {}\n\n ngOnInit() {}\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, Params, Router } from '@angular/router';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable } from 'rxjs';\nimport { finalize, map } from 'rxjs/operators';\nimport { Preset } from '../models/preset';\nimport { Project } from '../models/project';\nimport { WaitDialogComponent } from '../wait-dialog/wait-dialog.component';\nimport { FixtureService } from './fixture.service';\nimport { PresetService } from './preset.service';\nimport { PreviewService } from './preview.service';\nimport { ProjectService } from './project.service';\nimport { SceneService } from './scene.service';\nimport { TimelineService } from './timeline.service';\nimport { UuidService } from './uuid.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProjectLoadService {\n constructor(\n private projectService: ProjectService,\n private previewService: PreviewService,\n private fixtureService: FixtureService,\n private presetService: PresetService,\n private sceneService: SceneService,\n private modalService: BsModalService,\n private uuidService: UuidService,\n private timelineService: TimelineService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n private afterLoad() {\n this.fixtureService.updateCachedFixtures();\n this.presetService.removeDeletedFixtures();\n this.previewService.updateFixtureSetup();\n this.presetService.fixtureSelectionChanged.next();\n this.presetService.autoOpenFirstEffect();\n this.previewService.updateStage();\n this.presetService.previewLive();\n this.sceneService.selectPresetFromSelectedScene();\n }\n\n private selectScenesPresetComposition() {\n this.presetService.selectedPreset = this.presetService.getPresetByUuid(this.projectService.project.selectedPresetUuid);\n this.sceneService.selectedScenes = [];\n if (this.projectService.project.selectedSceneUuids) {\n for (const uuid of this.projectService.project.selectedSceneUuids) {\n this.sceneService.selectedScenes.push(this.sceneService.getSceneByUuid(uuid));\n }\n }\n this.timelineService.selectedComposition = undefined;\n this.timelineService.selectedCompositionIndex = undefined;\n this.timelineService.destroyWaveSurfer();\n for (let i = 0; i < this.projectService.project.compositions.length; i++) {\n if (this.projectService.project.compositions[i].uuid === this.projectService.project.selectedCompositionUuid) {\n this.timelineService.selectCompositionIndex(i);\n break;\n }\n }\n }\n\n load(id: number, name: string, shareToken?: string): Observable<void> {\n const ref = this.modalService.show(WaitDialogComponent, { keyboard: false, ignoreBackdropClick: true });\n\n return this.projectService.getProject(id, name, shareToken).pipe(\n map((project) => {\n this.projectService.project = project;\n this.selectScenesPresetComposition();\n this.afterLoad();\n\n const queryParams: Params = {\n id,\n token: project.shareToken,\n };\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams,\n queryParamsHandling: 'merge', // remove to replace all query params by provided\n });\n }),\n finalize(() => {\n // hide the modal again because of:\n // https://github.com/valor-software/ngx-bootstrap/issues/3711\n setTimeout(() => {\n ref.hide();\n }, 250);\n setTimeout(() => {\n ref.hide();\n }, 500);\n setTimeout(() => {\n ref.hide();\n }, 1500);\n })\n );\n }\n\n new() {\n // create an empty new project\n const project = new Project();\n project.uuid = this.uuidService.getUuid();\n this.projectService.project = project;\n this.projectService.project.shareToken = this.uuidService.getUuid();\n\n // Add a default scene and preset\n const preset = new Preset();\n preset.uuid = this.uuidService.getUuid();\n preset.name = 'New Preset';\n this.projectService.project.presets.push(preset);\n this.presetService.selectPreset(0);\n\n this.sceneService.addScene();\n this.projectService.project.scenes[0].presetUuids.push(preset.uuid);\n\n this.projectService.project.previewPreset = true;\n\n this.sceneService.selectedScenes = [this.projectService.project.scenes[0]];\n this.presetService.selectedPreset = this.projectService.project.presets[0];\n\n this.timelineService.selectedComposition = undefined;\n this.timelineService.selectedCompositionIndex = undefined;\n this.timelineService.destroyWaveSurfer();\n\n this.afterLoad();\n\n const queryParams: Params = {\n id: '',\n token: '',\n };\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams,\n queryParamsHandling: 'merge', // remove to replace all query params by provided\n });\n }\n\n template() {\n // load the template project with id 1\n this.load(1, null).subscribe(() => {\n this.projectService.project.id = undefined;\n });\n }\n\n import(data: string) {\n // import a project from a string\n const project = new Project(JSON.parse(data));\n project.id = undefined;\n this.projectService.project = project;\n\n this.selectScenesPresetComposition();\n this.afterLoad();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'lib-app-warning-dialog',\n templateUrl: './warning-dialog.component.html',\n styleUrls: ['./warning-dialog.component.scss'],\n})\nexport class WarningDialogComponent implements OnInit {\n onClose: Subject<number>;\n\n message: string;\n\n constructor(private bsModalRef: BsModalRef) {}\n\n ngOnInit() {\n this.onClose = new Subject();\n }\n\n public ok(): void {\n this.onClose.next(1);\n this.bsModalRef.hide();\n }\n\n public cancel(): void {\n this.onClose.next(2);\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\nimport { WarningDialogComponent } from '../warning-dialog/warning-dialog.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WarningDialogService {\n constructor(private modalService: BsModalService, private translateService: TranslateService) {}\n\n // Show a warning dialog and return true, when the user clicked OK\n show(message: string): Observable<boolean> {\n return this.translateService.get(message).pipe(\n map((result) => {\n return result;\n }),\n mergeMap((result) => {\n const fileDialog = this.modalService.show(WarningDialogComponent, { keyboard: false, ignoreBackdropClick: true });\n (fileDialog.content as WarningDialogComponent).message = result;\n\n return (fileDialog.content as WarningDialogComponent).onClose.pipe(\n map((warningResult) => {\n if (warningResult === 1) {\n return true;\n }\n\n return false;\n })\n );\n })\n );\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { map } from 'rxjs/operators';\nimport { Project } from '../../models/project';\nimport { ConfigService } from '../../services/config.service';\nimport { ProjectLoadService } from '../../services/project-load.service';\nimport { ProjectService } from '../../services/project.service';\nimport { UserService } from '../../services/user.service';\nimport { WarningDialogService } from '../../services/warning-dialog.service';\n\n@Component({\n selector: 'lib-project-browser',\n templateUrl: './project-browser.component.html',\n styleUrls: ['./project-browser.component.css'],\n})\nexport class ProjectBrowserComponent implements OnInit {\n projects: Project[] = [];\n loading = true;\n\n constructor(\n private bsModalRef: BsModalRef,\n private projectService: ProjectService,\n private projectLoadService: ProjectLoadService,\n private userService: UserService,\n private warningDialogService: WarningDialogService,\n private configService: ConfigService\n ) {\n this.loadProjects();\n }\n\n private loadProjects() {\n this.projectService.getAllProjects().subscribe((projects) => {\n this.projects = projects;\n this.loading = false;\n });\n }\n\n ngOnInit() {}\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n openProject(project: Project) {\n this.bsModalRef.hide();\n this.projectLoadService.load(project.id, project.name).subscribe(() => {\n this.userService.setAutoLoadProject(project);\n });\n }\n\n deleteProject(project: Project) {\n this.warningDialogService\n .show('designer.project.delete-warning')\n .pipe(\n map((result) => {\n if (result) {\n this.projectService.deleteProject(project).subscribe((projects) => {\n this.loadProjects();\n });\n }\n })\n )\n .subscribe();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DropzoneConfigInterface } from 'ngx-dropzone-wrapper';\nimport { ToastrService } from 'ngx-toastr';\nimport { map } from 'rxjs/operators';\nimport { ProjectLoadService } from '../../services/project-load.service';\n\n@Component({\n selector: 'lib-project-import',\n templateUrl: './project-import.component.html',\n styleUrls: ['./project-import.component.css'],\n})\nexport class ProjectImportComponent implements OnInit {\n public dropzoneConfig: DropzoneConfigInterface;\n public uploadMessage: string;\n\n constructor(\n public bsModalRef: BsModalRef,\n private translateService: TranslateService,\n private toastrService: ToastrService,\n private projectLoadService: ProjectLoadService\n ) {}\n\n ngOnInit() {\n this.dropzoneConfig = {\n url: 'dummy',\n addRemoveLinks: false,\n maxFilesize: 10 /* 10 MB */,\n acceptedFiles: '.rsd',\n timeout: 0,\n accept: (file: any, done: any) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (event: any) => {\n this.projectLoadService.import(event.target.result);\n done('noerr');\n this.bsModalRef.hide();\n });\n reader.readAsText(file);\n },\n previewTemplate: `\n <div style=\"display: none;\">\n <!-- No preview -->\n </div>\n `,\n };\n\n this.translateService\n .get('designer.misc.dropzone-message')\n .pipe(\n map((result) => {\n this.uploadMessage = '<h3 class=\"mb-0\"><i class=\"fa fa-cloud-upload\"></i></h3>' + result;\n })\n )\n .subscribe();\n }\n\n public onUploadError(args: any) {\n if (args[1] === 'noerr') {\n // this error is set in the accept event listener -> everything OK\n return;\n }\n\n const msg = 'designer.misc.toast-upload-error';\n const title = 'designer.misc.toast-upload-error-title';\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg] + args[1], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });\n });\n }\n\n ok() {\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { map } from 'rxjs/operators';\nimport { Project } from '../../models/project';\nimport { ConfigService } from '../../services/config.service';\nimport { ProjectService } from '../../services/project.service';\nimport { WarningDialogService } from '../../services/warning-dialog.service';\n\n@Component({\n selector: 'lib-project-save',\n templateUrl: './project-save.component.html',\n styleUrls: ['./project-save.component.css'],\n})\nexport class ProjectSaveComponent implements OnInit {\n projects: Project[] = [];\n loading = true;\n projectName: string;\n\n constructor(\n private bsModalRef: BsModalRef,\n private projectService: ProjectService,\n private warningDialogService: WarningDialogService,\n private configService: ConfigService\n ) {\n this.loadProjects();\n if (this.projectService.project.name) {\n this.projectName = this.projectService.project.name;\n } else {\n this.projectName = 'New Project';\n }\n }\n\n ngOnInit() {}\n\n private loadProjects() {\n this.projectService.getAllProjects().subscribe((projects) => {\n this.projects = projects;\n this.loading = false;\n });\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n selectProject(project: Project) {\n this.projectService.project.name = project.name;\n }\n\n private existingProject(uuid: string, name: string) {\n for (const project of this.projects) {\n if (project.name === name && project.uuid !== uuid) {\n return true;\n }\n }\n return false;\n }\n\n private doSave() {\n this.projectService.project.name = this.projectName;\n this.projectService.save(this.projectService.project);\n this.bsModalRef.hide();\n }\n\n saveProject() {\n if (this.existingProject(this.projectService.project.uuid, this.projectName) && this.configService.uniqueProjectNames) {\n this.warningDialogService\n .show('designer.project.overwrite-warning')\n .pipe(\n map((result) => {\n if (result) {\n this.doSave();\n }\n })\n )\n .subscribe();\n } else {\n this.doSave();\n }\n }\n\n deleteProject(project: Project) {\n this.warningDialogService\n .show('designer.project.delete-warning')\n .pipe(\n map((result) => {\n if (result) {\n this.projectService.deleteProject(project).subscribe((projects) => {\n this.loadProjects();\n });\n }\n })\n )\n .subscribe();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.saveProject();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ProjectService } from '../../services/project.service';\n\n@Component({\n selector: 'lib-project-share',\n templateUrl: './project-share.component.html',\n styleUrls: ['./project-share.component.css'],\n})\nexport class ProjectShareComponent implements OnInit {\n shareLink: string;\n\n constructor(public bsModalRef: BsModalRef, private projectService: ProjectService) {}\n\n ngOnInit() {\n this.shareLink =\n window.location.host + '/designer?id=' + this.projectService.project.id + '&token=' + this.projectService.project.shareToken;\n }\n\n ok() {\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'lib-error-dialog',\n templateUrl: './error-dialog.component.html',\n styleUrls: ['./error-dialog.component.css'],\n})\nexport class ErrorDialogComponent implements OnInit {\n onClose: Subject<number>;\n\n message: string;\n details: string;\n\n constructor(private bsModalRef: BsModalRef) {}\n\n ngOnInit() {\n this.onClose = new Subject();\n }\n\n public ok(): void {\n this.onClose.next(1);\n this.bsModalRef.hide();\n }\n\n public cancel(): void {\n this.onClose.next(2);\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\nimport { ErrorDialogComponent } from '../error-dialog/error-dialog.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ErrorDialogService {\n constructor(private modalService: BsModalService, private translateService: TranslateService) {}\n\n // Show a warning dialog and return true, when the user clicked OK\n show(message: string, details?: string): Observable<boolean> {\n return this.translateService.get(message).pipe(\n map((result) => {\n return result;\n }),\n mergeMap((result) => {\n const fileDialog = this.modalService.show(ErrorDialogComponent, { keyboard: true, ignoreBackdropClick: false });\n (fileDialog.content as ErrorDialogComponent).message = result;\n (fileDialog.content as ErrorDialogComponent).details = details;\n\n return (fileDialog.content as ErrorDialogComponent).onClose.pipe(\n map((errorResult) => {\n if (errorResult === 1) {\n return true;\n }\n\n return false;\n })\n );\n })\n );\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DropzoneConfigInterface } from 'ngx-dropzone-wrapper';\nimport { ToastrService } from 'ngx-toastr';\nimport { Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { FixtureProfile } from '../../models/fixture-profile';\nimport { FixtureService } from '../../services/fixture.service';\nimport { ProjectService } from '../../services/project.service';\n\n@Component({\n selector: 'lib-fixture-pool-create-from-file',\n templateUrl: './fixture-pool-create-from-file.component.html',\n styleUrls: ['./fixture-pool-create-from-file.component.css'],\n})\nexport class FixturePoolCreateFromFileComponent implements OnInit {\n public dropzoneConfig: DropzoneConfigInterface;\n public uploadMessage: string;\n public onClose: Subject<FixtureProfile> = new Subject();\n\n constructor(\n public bsModalRef: BsModalRef,\n private translateService: TranslateService,\n private toastrService: ToastrService,\n private fixtureService: FixtureService,\n private projectService: ProjectService\n ) {}\n\n ngOnInit() {\n this.dropzoneConfig = {\n url: 'dummy',\n addRemoveLinks: false,\n maxFilesize: 10 /* 10 MB */,\n acceptedFiles: '.json',\n timeout: 0,\n accept: (file: any, done: any) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (event: any) => {\n // validate the file\n const text = event.target.result;\n const json = JSON.parse(text);\n if (\n json['$schema'].match(\n 'https://raw.githubusercontent.com/OpenLightingProject/open-fixture-library/schema-(.*)/schemas/fixture.json'\n )\n ) {\n // create the metadata from the file. we don't have the corresponding\n // manufacturer-file, therefore we just assume the attributes from the\n // fixture-file.\n const manufacturerShortName = json['manufacturerKey'];\n const manufacturerName = manufacturerShortName;\n const uuid = manufacturerShortName + '/' + json['fixtureKey'];\n const profile = new FixtureProfile(json);\n\n profile.manufacturerShortName = manufacturerShortName;\n profile.manufacturerName = manufacturerName;\n profile.uuid = uuid;\n profile.createdFromFile = true;\n\n // add the profile to the project, if not already added\n const loadedProfile = this.fixtureService.getProfileByUuid(uuid);\n if (!loadedProfile) {\n this.projectService.project.fixtureProfiles.push(profile);\n }\n\n // add a new fixture from this profile\n this.onClose.next(profile);\n this.bsModalRef.hide();\n } else {\n // show an error toast\n const msg = 'designer.fixture-pool.invalid-fixture-profile-file';\n const title = 'designer.misc.toast-upload-error-title';\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });\n });\n }\n\n done('noerr');\n });\n reader.readAsText(file);\n },\n previewTemplate: `\n <div style=\"display: none;\">\n <!-- No preview -->\n </div>\n `,\n };\n\n this.translateService\n .get('designer.misc.dropzone-message')\n .pipe(\n map((result) => {\n this.uploadMessage = '<h3 class=\"mb-0\"><i class=\"fa fa-cloud-upload\"></i></h3>' + result;\n })\n )\n .subscribe();\n }\n\n public onUploadError(args: any) {\n if (args[1] === 'noerr') {\n // this error is set in the accept event listener -> everything OK\n return;\n }\n\n const msg = 'designer.misc.toast-upload-error';\n const title = 'designer.misc.toast-upload-error-title';\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg] + args[1], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });\n });\n }\n\n ok() {\n this.onClose.next(undefined);\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.onClose.next(undefined);\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { ToastrService } from 'ngx-toastr';\nimport { Subject } from 'rxjs';\nimport { catchError, finalize } from 'rxjs/operators';\nimport { Fixture } from '../models/fixture';\nimport { FixtureProfile } from '../models/fixture-profile';\nimport { ConfigService } from '../services/config.service';\nimport { FixtureService } from '../services/fixture.service';\nimport { PresetService } from '../services/preset.service';\nimport { PreviewService } from '../services/preview.service';\nimport { ProjectService } from '../services/project.service';\nimport { UuidService } from '../services/uuid.service';\nimport { FixturePoolCreateFromFileComponent } from './fixture-pool-create-from-file/fixture-pool-create-from-file.component';\n\n@Component({\n selector: 'lib-app-fixture-pool',\n templateUrl: './fixture-pool.component.html',\n styleUrls: ['./fixture-pool.component.css'],\n})\nexport class FixturePoolComponent implements OnInit {\n private profiles: FixtureProfile[];\n public filteredProfiles: FixtureProfile[];\n public loadingProfiles = false;\n\n public fixturePool: Fixture[];\n\n public dmxChannels: number[] = [];\n public selectedFixture: Fixture;\n public selectedFixtureProfile: FixtureProfile;\n public showChannelNumbers = false;\n public channelDragFixture: Fixture;\n public channelDragOffset: number;\n\n public onClose: Subject<number> = new Subject();\n\n public searchExpression: string;\n\n public updatingProfiles: boolean;\n\n constructor(\n public bsModalRef: BsModalRef,\n public fixtureService: FixtureService,\n private uuidService: UuidService,\n public projectService: ProjectService,\n private previewService: PreviewService,\n private translateService: TranslateService,\n private toastrService: ToastrService,\n private presetService: PresetService,\n public configService: ConfigService,\n private modalService: BsModalService\n ) {\n this.fixturePool = [...this.projectService.project.fixtures];\n\n if (this.fixturePool.length > 0) {\n this.selectFixture(this.fixturePool[0]);\n }\n }\n\n ngOnInit() {\n for (let i = 0; i < 512; i++) {\n this.dmxChannels.push(0);\n }\n\n this.loadProfiles();\n }\n\n private loadProfiles() {\n this.loadingProfiles = true;\n\n this.fixtureService.getSearchProfiles().subscribe((profiles) => {\n this.profiles = profiles;\n this.filterProfiles();\n this.loadingProfiles = false;\n });\n }\n\n selectFixture(fixture: Fixture) {\n this.selectedFixtureProfile = undefined;\n if (fixture) {\n this.selectedFixtureProfile = this.fixtureService.getProfileByUuid(fixture.profileUuid);\n }\n this.selectedFixture = fixture;\n }\n\n filterProfiles() {\n if (!this.searchExpression || !this.profiles) {\n this.filteredProfiles = this.profiles;\n return;\n }\n\n this.filteredProfiles = [];\n\n const keywords = this.searchExpression.split(' ');\n\n for (const profile of this.profiles) {\n let foundKeywords = 0;\n\n for (const keyword of keywords) {\n if (\n profile.uuid.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||\n profile.name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||\n profile.manufacturerName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1\n ) {\n foundKeywords++;\n }\n }\n\n if (foundKeywords === keywords.length) {\n this.filteredProfiles.push(profile);\n }\n }\n }\n\n addFixture(searchProfile: FixtureProfile) {\n // Load the profile details, if not already done. There is only a\n // minimal profile passed from the search.\n this.fixtureService.loadProfileByUuid(searchProfile.uuid).subscribe(() => {\n const profile = this.fixtureService.getProfileByUuid(searchProfile.uuid);\n const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);\n this.selectFixture(newFixture);\n });\n }\n\n addCopy(originalFixture: Fixture) {\n const fixture = new Fixture();\n fixture.uuid = this.uuidService.getUuid();\n fixture.profileUuid = originalFixture.profileUuid;\n fixture.name = originalFixture.name;\n fixture.modeShortName = originalFixture.modeShortName;\n fixture.dmxFirstChannel = originalFixture.dmxFirstChannel;\n fixture.dmxUniverseUuid = originalFixture.dmxUniverseUuid;\n\n this.fixturePool.push(fixture);\n this.selectFixture(fixture);\n }\n\n removeFixture(fixture: Fixture) {\n for (let i = 0; i < this.fixturePool.length; i++) {\n if (this.fixturePool[i].uuid === fixture.uuid) {\n if (this.selectedFixture === this.fixturePool[i]) {\n this.selectFixture(undefined);\n }\n this.fixturePool.splice(i, 1);\n break;\n }\n }\n\n if (!this.selectedFixture && this.fixturePool && this.fixturePool.length > 0) {\n this.selectFixture((this.selectedFixture = this.fixturePool[0]));\n }\n\n // remove unused profiles\n for (let i = 0; i < this.projectService.project.fixtureProfiles.length; i++) {\n let profileUsed = false;\n\n for (const fixtureInPool of this.fixturePool) {\n if (fixtureInPool.profileUuid === this.projectService.project.fixtureProfiles[i].uuid) {\n profileUsed = true;\n break;\n }\n }\n\n if (!profileUsed) {\n this.projectService.project.fixtureProfiles.splice(i, 1);\n }\n }\n }\n\n channelOccupied(index: number): boolean {\n for (const fixture of this.fixturePool) {\n const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);\n\n if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {\n return true;\n }\n }\n\n return false;\n }\n\n channelOccupiedStart(index: number): boolean {\n for (const fixture of this.fixturePool) {\n if (index === fixture.dmxFirstChannel) {\n return true;\n }\n }\n\n return false;\n }\n\n channelOccupiedEnd(index: number): boolean {\n for (const fixture of this.fixturePool) {\n const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);\n\n if (index === fixture.dmxFirstChannel + mode.channels.length - 1) {\n return true;\n }\n }\n\n return false;\n }\n\n channelOverlapped(index: number): boolean {\n let occupiedFixture: Fixture;\n\n for (const fixture of this.fixturePool) {\n const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);\n\n if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {\n if (occupiedFixture) {\n if (occupiedFixture.dmxFirstChannel !== fixture.dmxFirstChannel || occupiedFixture.modeShortName !== fixture.modeShortName) {\n // fixtures are allowed to overlap, if they start at the same channel and\n // use the same mode. otherwise it's not allowed.\n return true;\n }\n } else {\n occupiedFixture = fixture;\n }\n }\n }\n\n return false;\n }\n\n channelMouseDown(event: any) {\n // start dragging\n const selectedIndex = event.target.dataset.index;\n let newSelectedFixture: Fixture;\n\n // find a dragging fixture and select it, but don't change the selection, if the\n // currently selected fixture might also be selected (on overlapped fixtures)\n for (const fixture of this.fixturePool) {\n const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);\n\n if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + mode.channels.length - 1) {\n if (this.selectedFixture === fixture) {\n newSelectedFixture = fixture;\n break;\n }\n\n if (!newSelectedFixture) {\n newSelectedFixture = fixture;\n }\n }\n }\n\n if (newSelectedFixture) {\n if (newSelectedFixture !== this.selectedFixture) {\n this.selectFixture(newSelectedFixture);\n }\n\n this.channelDragFixture = newSelectedFixture;\n this.channelDragOffset = selectedIndex - newSelectedFixture.dmxFirstChannel;\n }\n }\n\n channelSelected(index: number): boolean {\n if (!this.selectedFixture) {\n return false;\n }\n\n if (index >= this.selectedFixture.dmxFirstChannel) {\n const mode = this.fixtureService.getModeByFixture(\n this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid),\n this.selectedFixture\n );\n\n if (index < this.selectedFixture.dmxFirstChannel + mode.channels.length) {\n return true;\n }\n }\n\n return false;\n }\n\n // register mouse up globally (e.g. also outside the DMX mapping)\n @HostListener('window:mouseup', ['$event'])\n mouseUp(event: any) {\n // finish dragging\n this.channelDragFixture = undefined;\n this.channelDragOffset = undefined;\n }\n\n channelMouseOver(event: any) {\n // perform dragging\n const selectedIndex = event.target.dataset.index;\n\n if (\n this.channelDragFixture &&\n selectedIndex - this.channelDragOffset >= 0 &&\n selectedIndex -\n this.channelDragOffset +\n this.fixtureService.getModeByFixture(\n this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid),\n this.channelDragFixture\n ).channels.length -\n 1 <=\n 511\n ) {\n this.channelDragFixture.dmxFirstChannel = selectedIndex - this.channelDragOffset;\n }\n }\n\n ok() {\n // don't allow OK if overlapping fixtures exist\n for (let i = 0; i < this.dmxChannels.length; i++) {\n if (this.channelOverlapped(i)) {\n const msg = 'designer.fixture-pool.channel-occupied';\n const title = 'designer.fixture-pool.channel-occupied-title';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg], result[title]);\n });\n\n return;\n }\n }\n\n this.projectService.project.fixtures = this.fixturePool;\n\n this.fixtureService.updateCachedFixtures();\n this.presetService.removeDeletedFixtures();\n this.previewService.updateFixtureSetup();\n this.presetService.updateFixtureSelection();\n this.presetService.fixtureSelectionChanged.next();\n this.presetService.previewLive();\n\n this.onClose.next(1);\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.onClose.next(2);\n this.bsModalRef.hide();\n }\n\n updateProfiles() {\n this.updatingProfiles = true;\n\n // TODO\n this.fixtureService\n .updateProfiles()\n .pipe(\n finalize(() => {\n this.updatingProfiles = false;\n }),\n catchError(() => {\n const msg = 'designer.fixture-pool.profiles-update-error';\n const title = 'designer.fixture-pool.profiles-update-error-title';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg], result[title]);\n });\n\n return undefined;\n })\n )\n .subscribe(() => {\n this.loadProfiles();\n\n const msg = 'designer.fixture-pool.profiles-updated';\n const title = 'designer.fixture-pool.profiles-updated-title';\n\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.success(result[msg], result[title]);\n });\n });\n }\n\n createFixtureFromProfileFile() {\n const bsModalRef = this.modalService.show(FixturePoolCreateFromFileComponent, { keyboard: true, ignoreBackdropClick: false });\n (bsModalRef.content as FixturePoolCreateFromFileComponent).onClose.subscribe((profile: FixtureProfile) => {\n const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);\n this.selectFixture(newFixture);\n });\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { FixturePoolComponent } from '../fixture-pool/fixture-pool.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FixturePoolService {\n private fixturePoolOpened = false;\n\n constructor(private modalService: BsModalService) {}\n\n open() {\n if (this.fixturePoolOpened) {\n return;\n }\n\n this.fixturePoolOpened = true;\n const bsModalRef = this.modalService.show(FixturePoolComponent, { keyboard: false, ignoreBackdropClick: true, class: 'modal-full' });\n (bsModalRef.content as FixturePoolComponent).onClose.subscribe((result) => {\n this.fixturePoolOpened = false;\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HotkeyTargetExcludeService {\n constructor() {}\n\n exclude(event: any): boolean {\n // don't react on certain targets (e.g. the user is inside an input field)\n if (!event.target) {\n return false;\n }\n\n if (event.target.nodeName === 'INPUT') {\n return true;\n }\n\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ConfigService } from './config.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class IntroService {\n showIntro = false;\n activeStep = 'start';\n positionTopPercentage = 50;\n positionLeftPercentage = 50;\n stylePosition = 'top: calc(50% - 150px); left: calc(50% - 200px);';\n stepChanged: Subject<void> = new Subject<void>();\n\n constructor(private configService: ConfigService) {}\n\n refresh() {\n // called, as soon as the config has been updated\n if (this.configService.intro) {\n if (localStorage.getItem('showIntro')) {\n this.showIntro = localStorage.getItem('showIntro') === 'true';\n } else {\n this.showIntro = true;\n }\n }\n }\n\n setShowIntro(value: boolean) {\n this.showIntro = value;\n if (value) {\n localStorage.setItem('showIntro', 'true');\n } else {\n localStorage.setItem('showIntro', 'false');\n }\n this.stepChanged.next();\n }\n\n reset() {\n this.activeStep = 'start';\n this.setShowIntro(true);\n this.stepChanged.next();\n }\n\n showStep(step: string): boolean {\n if (!this.showIntro) {\n return false;\n }\n\n if (this.activeStep !== step) {\n return false;\n }\n\n return true;\n }\n\n next() {\n switch (this.activeStep) {\n case 'start':\n this.activeStep = 'preview';\n this.positionTopPercentage = 60;\n this.positionLeftPercentage = 40;\n break;\n case 'preview':\n this.activeStep = 'fixtures';\n this.positionTopPercentage = 40;\n this.positionLeftPercentage = 30;\n break;\n case 'fixtures':\n this.activeStep = 'presets';\n this.positionTopPercentage = 30;\n this.positionLeftPercentage = 50;\n break;\n case 'presets':\n this.activeStep = 'capabilities';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 60;\n break;\n case 'capabilities':\n this.activeStep = 'scenes';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 40;\n break;\n case 'scenes':\n this.activeStep = 'timeline';\n this.positionTopPercentage = 40;\n this.positionLeftPercentage = 50;\n break;\n case 'timeline':\n this.activeStep = 'finish';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 50;\n break;\n }\n\n this.stepChanged.next();\n }\n\n back() {\n switch (this.activeStep) {\n case 'preview':\n this.activeStep = 'start';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 50;\n break;\n case 'fixtures':\n this.activeStep = 'preview';\n this.positionTopPercentage = 60;\n this.positionLeftPercentage = 40;\n break;\n case 'presets':\n this.activeStep = 'fixtures';\n this.positionTopPercentage = 30;\n this.positionLeftPercentage = 50;\n break;\n case 'capabilities':\n this.activeStep = 'presets';\n this.positionTopPercentage = 40;\n this.positionLeftPercentage = 30;\n break;\n case 'scenes':\n this.activeStep = 'capabilities';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 60;\n break;\n case 'timeline':\n this.activeStep = 'scenes';\n this.positionTopPercentage = 50;\n this.positionLeftPercentage = 40;\n break;\n case 'finish':\n this.activeStep = 'timeline';\n this.positionTopPercentage = 40;\n this.positionLeftPercentage = 50;\n break;\n }\n\n this.stepChanged.next();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\nimport { UserService } from '../../services/user.service';\n\n@Component({\n selector: 'lib-user-login',\n templateUrl: './user-login.component.html',\n styleUrls: ['./user-login.component.css'],\n})\nexport class UserLoginComponent implements OnInit {\n error = '';\n loggingIn = false;\n\n email = '';\n password = '';\n\n // emits, when logged in\n subject: Subject<void>;\n\n constructor(private bsModalRef: BsModalRef, private userService: UserService) {}\n\n ngOnInit() {}\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n login() {\n this.loggingIn = true;\n this.error = '';\n\n if (!this.email || !this.password) {\n this.error = 'fill-all-fields';\n this.loggingIn = false;\n return;\n }\n\n this.userService.login(this.email, this.password).subscribe(\n () => {\n this.bsModalRef.hide();\n if (this.subject) {\n this.subject.next();\n }\n },\n (response) => {\n if (response.error && response.error.error) {\n this.error = response.error.error;\n } else {\n this.error = 'internal';\n }\n this.loggingIn = false;\n }\n );\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.login();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\nimport { UserService } from '../../services/user.service';\nimport { UserLoginComponent } from '../user-login/user-login.component';\n\n@Component({\n selector: 'lib-user-register',\n templateUrl: './user-register.component.html',\n styleUrls: ['./user-register.component.css'],\n})\nexport class UserRegisterComponent implements OnInit {\n error = '';\n registering = false;\n\n username = '';\n email = '';\n password = '';\n passwordRepeat = '';\n\n // emits, when logged in\n subject: Subject<void>;\n\n constructor(private bsModalRef: BsModalRef, private modalService: BsModalService, private userService: UserService) {}\n\n ngOnInit() {}\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n login() {\n this.bsModalRef.hide();\n this.modalService.show(UserLoginComponent, { keyboard: true, ignoreBackdropClick: false, initialState: { subject: this.subject } });\n }\n\n private emailIsValid(email: string): boolean {\n // tslint:disable-next-line:max-line-length\n const re = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(String(email).toLowerCase());\n }\n\n register() {\n this.registering = true;\n this.error = '';\n\n if (!this.username || !this.email || !this.password || !this.passwordRepeat) {\n this.error = 'fill-all-fields';\n this.registering = false;\n return;\n }\n\n if (!this.emailIsValid(this.email)) {\n this.error = 'email-valid';\n this.registering = false;\n return;\n }\n\n if (this.password !== this.passwordRepeat) {\n this.error = 'password-mismatch';\n this.registering = false;\n return;\n }\n\n this.userService.register(this.email, this.username, this.password).subscribe(\n () => {\n // automatically login after registering\n this.userService.login(this.email, this.password).subscribe(() => {\n this.registering = false;\n this.bsModalRef.hide();\n });\n },\n (response) => {\n if (response.error && response.error.error) {\n this.error = response.error.error;\n } else {\n this.error = 'internal';\n }\n this.registering = false;\n }\n );\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.register();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable, of, Subject } from 'rxjs';\nimport { UserRegisterComponent } from '../user/user-register/user-register.component';\nimport { ConfigService } from './config.service';\nimport { UserService } from './user.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserEnsureLoginService {\n constructor(private userService: UserService, private modalService: BsModalService, private configService: ConfigService) {}\n\n // show the login form and log a user in, if required\n login(): Observable<void> {\n if (this.userService.isLoggedIn()) {\n return of(null);\n }\n\n if (!this.configService.loginAvailable) {\n return of(null);\n }\n\n const subject = new Subject<void>();\n this.modalService.show(UserRegisterComponent, { keyboard: true, ignoreBackdropClick: false, initialState: { subject } });\n return subject;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Component, HostListener, OnInit } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DropzoneConfigInterface } from 'ngx-dropzone-wrapper';\nimport { ToastrService } from 'ngx-toastr';\nimport { Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Composition } from '../../models/composition';\nimport { ConfigService } from '../../services/config.service';\nimport { ProjectService } from '../../services/project.service';\nimport { TimelineService } from '../../services/timeline.service';\nimport { WarningDialogService } from '../../services/warning-dialog.service';\n\n@Component({\n selector: 'lib-app-composition-settings',\n templateUrl: './composition-settings.component.html',\n styleUrls: ['./composition-settings.component.css'],\n})\nexport class CompositionSettingsComponent implements OnInit {\n composition: Composition;\n existingCompositionNames: string[] = [];\n\n public onClose: Subject<number> = new Subject();\n\n public dropzoneConfig: DropzoneConfigInterface;\n public uploadMessage: string;\n\n public existingFiles: string[] = [];\n public filteredExistingFiles: string[] = [];\n\n public uploading = false;\n\n constructor(\n public bsModalRef: BsModalRef,\n private timelineService: TimelineService,\n public configService: ConfigService,\n private translateService: TranslateService,\n private http: HttpClient,\n private warningDialogService: WarningDialogService,\n private toastrService: ToastrService,\n private projectService: ProjectService\n ) {}\n\n ngOnInit() {\n const projectId = this.projectService.project.id ? this.projectService.project.id : '';\n this.dropzoneConfig = {\n url: this.configService.restUrl + 'file/upload?compositionUuid=' + this.composition.uuid + '&projectId=' + projectId,\n addRemoveLinks: false,\n maxFilesize: 100 /* 100 MB */,\n acceptedFiles: 'audio/*',\n timeout: 0,\n parallelUploads: 1,\n previewTemplate: `\n <div class=\"dz-preview dz-file-preview\">\n <!-- The attachment details -->\n <div class=\"dz-details\" style=\"text-align: left\">\n <i class=\"fa fa-file-o\"></i> <span data-dz-name></span> <small>\n <span class=\"label label-default file-size\" data-dz-size></span></small>\n </div>\n\n <!--div class=\"mt-5\">\n <span data-dz-errormessage></span>\n </div-->\n\n <div class=\"progress mt-4 mb-1\" style=\"height: 10px\">\n <div class=\"progress-bar progress-bar-striped progress-bar-animated\"\n role=\"progressbar\" style=\"width:0%;\" data-dz-uploadprogress>\n </div>\n </div>\n </div>\n `,\n };\n\n this.translateService\n .get('designer.misc.dropzone-message')\n .pipe(\n map((result) => {\n this.uploadMessage = '<h3 class=\"mb-0\"><i class=\"fa fa-cloud-upload\"></i></h3>' + result;\n })\n )\n .subscribe();\n\n this.loadFiles();\n\n if (this.timelineService.externalCompositionsAvailable) {\n this.timelineService.getExternalCompositionNames().subscribe((compositionNames) => {\n this.existingCompositionNames = compositionNames;\n });\n }\n }\n\n ok() {\n this.onClose.next(1);\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.onClose.next(2);\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n\n private getNameFromFile(data: any): string {\n return data.name;\n }\n\n private loadFiles() {\n if (!this.configService.enableMediaLibrary) {\n return;\n }\n\n this.http\n .get('file/list')\n .pipe(\n map((response: object[]) => {\n this.existingFiles = [];\n\n for (const file of response) {\n // only load audio files\n if ((file as any).audioFile) {\n this.existingFiles.push(this.getNameFromFile((file as any).audioFile));\n }\n }\n\n this.filterExistingFiles();\n })\n )\n .subscribe();\n }\n\n public onUploadError(args: any) {\n const msg = 'designer.misc.toast-upload-error';\n const title = 'designer.misc.toast-upload-error-title';\n this.translateService.get([msg, title]).subscribe((result) => {\n this.toastrService.error(result[msg] + args[1], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });\n // Hide the preview element\n args[0].previewElement.hidden = true;\n });\n }\n\n public onUploadSuccess(args: any) {\n this.loadFiles();\n\n // allow to guess the bpm of the newly uploaded file\n this.composition.tempoGuessed = false;\n\n // hide the preview element\n args[0].previewElement.hidden = true;\n\n // select this file\n this.composition.audioFileName = args[0].name;\n\n if (this.configService.enableMediaLibrary) {\n // the file has been uploaded to the media library\n this.composition.audioFileInLibrary = true;\n }\n }\n\n public onQueueComplete(args: any) {\n this.uploading = false;\n }\n\n public onAddedFile(args: any) {\n this.uploading = true;\n }\n\n // Filter the existing files\n filterExistingFiles(searchValue?: string) {\n if (!searchValue) {\n this.filteredExistingFiles = this.existingFiles;\n return;\n }\n\n this.filteredExistingFiles = [];\n\n for (const file of this.existingFiles) {\n if (file.toLowerCase().indexOf(searchValue.toLowerCase()) !== -1) {\n this.filteredExistingFiles.push(file);\n }\n }\n }\n\n selectExistingFile(existingFile: string) {\n this.composition.audioFileName = existingFile;\n\n // the file has been selected from the media library\n this.composition.audioFileInLibrary = true;\n }\n\n deleteFile(existingFile: string) {\n this.warningDialogService\n .show('designer.timeline.warning-delete-file')\n .pipe(\n map((result) => {\n if (result) {\n this.http\n .post('file/delete?name=' + existingFile + '&type=AUDIO', undefined)\n .pipe(\n map((response: Response) => {\n this.loadFiles();\n })\n )\n .subscribe();\n }\n })\n )\n .subscribe();\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { TimelineService } from '../../services/timeline.service';\n\n@Component({\n selector: 'lib-app-timeline-grid',\n templateUrl: './timeline-grid.component.html',\n styleUrls: ['./timeline-grid.component.css'],\n})\nexport class TimelineGridComponent implements OnInit {\n public gridType: string;\n public beatsPerMinute: number;\n public timeSignatureUpper: number;\n public timeSignatureLower: number;\n public snapToGrid: boolean;\n public gridOffsetMillis: number;\n public gridResolution: number;\n\n constructor(public bsModalRef: BsModalRef, public timelineService: TimelineService) {\n this.gridType = timelineService.selectedComposition.gridType;\n this.beatsPerMinute = timelineService.selectedComposition.beatsPerMinute;\n this.timeSignatureUpper = timelineService.selectedComposition.timeSignatureUpper;\n this.timeSignatureLower = timelineService.selectedComposition.timeSignatureLower;\n this.snapToGrid = timelineService.selectedComposition.snapToGrid;\n this.gridOffsetMillis = timelineService.selectedComposition.gridOffsetMillis;\n this.gridResolution = timelineService.selectedComposition.gridResolution;\n }\n\n ngOnInit() {}\n\n ok() {\n this.timelineService.selectedComposition.gridType = this.gridType;\n this.timelineService.selectedComposition.beatsPerMinute = this.beatsPerMinute;\n this.timelineService.selectedComposition.timeSignatureUpper = this.timeSignatureUpper;\n this.timelineService.selectedComposition.timeSignatureLower = this.timeSignatureLower;\n this.timelineService.selectedComposition.snapToGrid = this.snapToGrid;\n this.timelineService.selectedComposition.gridOffsetMillis = this.gridOffsetMillis;\n this.timelineService.selectedComposition.gridResolution = this.gridResolution;\n\n this.timelineService.updateGrid();\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { map } from 'rxjs/operators';\nimport { Composition } from '../models/composition';\nimport { ConfigService } from '../services/config.service';\nimport { HotkeyTargetExcludeService } from '../services/hotkey-target-exclude.service';\nimport { IntroService } from '../services/intro.service';\nimport { PresetService } from '../services/preset.service';\nimport { ProjectService } from '../services/project.service';\nimport { TimelineService } from '../services/timeline.service';\nimport { UuidService } from '../services/uuid.service';\nimport { WarningDialogService } from '../services/warning-dialog.service';\nimport { CompositionSettingsComponent } from './composition-settings/composition-settings.component';\nimport { TimelineGridComponent } from './timeline-grid/timeline-grid.component';\n\n@Component({\n selector: 'lib-app-timeline',\n templateUrl: './timeline.component.html',\n styleUrls: ['./timeline.component.css'],\n})\nexport class TimelineComponent implements OnInit, AfterViewInit {\n @ViewChild('waveWrapper')\n waveWrapper: ElementRef;\n\n @ViewChild('waveElement')\n waveElement: ElementRef;\n\n private lastHeight: number;\n private lastWidth: number;\n\n constructor(\n public timelineService: TimelineService,\n private changeDetectorRef: ChangeDetectorRef,\n private modalService: BsModalService,\n private uuidService: UuidService,\n public projectService: ProjectService,\n private hotkeyTargetExcludeService: HotkeyTargetExcludeService,\n private warningDialogService: WarningDialogService,\n private http: HttpClient,\n private configService: ConfigService,\n private presetService: PresetService,\n public introService: IntroService\n ) {\n this.timelineService.waveSurferReady.subscribe(() => {\n this.onResize();\n });\n this.timelineService.detectChanges.subscribe(() => {\n this.changeDetectorRef.detectChanges();\n });\n }\n\n ngOnInit() {}\n\n ngAfterViewInit() {}\n\n @HostListener('window:resize')\n public onResize() {\n if (!this.waveElement) {\n return;\n }\n\n // Hide wavesurfer to calculate the height, because it will grow infinitely\n // otherwise\n this.waveElement.nativeElement.style.display = 'none';\n const height = this.waveWrapper.nativeElement.clientHeight;\n this.waveElement.nativeElement.style.display = 'block';\n\n const width = this.waveWrapper.nativeElement.clientWidth;\n\n if (!this.lastHeight || this.lastHeight !== height || !this.lastWidth || this.lastWidth !== width) {\n // Set height and redraw\n if (this.timelineService.waveSurfer) {\n this.timelineService.waveSurfer.setHeight(height);\n }\n\n this.lastHeight = height;\n this.lastWidth = width;\n }\n }\n\n play() {\n this.timelineService.playState = 'playing';\n this.presetService.previewLive(\n this.timelineService.selectedComposition.name,\n Math.round(this.timelineService.waveSurfer.getCurrentTime() * 1000)\n );\n this.timelineService.waveSurfer.play();\n }\n\n pause() {\n this.timelineService.playState = 'paused';\n this.presetService.stopPreviewPlay();\n this.timelineService.waveSurfer.pause();\n }\n\n rewind() {\n this.timelineService.playState = 'paused';\n this.pause();\n this.timelineService.waveSurfer.seekTo(0);\n }\n\n addRegion(waveSurferRegion?: any) {\n this.timelineService.addRegion(waveSurferRegion);\n }\n\n removeRegion() {\n this.timelineService.removeRegion();\n }\n\n openGridSettings() {\n const bsModalRef = this.modalService.show(TimelineGridComponent, { keyboard: true, ignoreBackdropClick: false, class: '' });\n }\n\n private afterDeleteFile() {\n this.timelineService.deleteSelectedComposition();\n }\n\n removeComposition() {\n this.warningDialogService\n .show('designer.timeline.warning-delete-composition')\n .pipe(\n map((result) => {\n if (result) {\n if (this.configService.enableMediaLibrary) {\n // don't delete the file from the library\n this.afterDeleteFile();\n } else {\n // the composition uuid and extension is used as the file name\n this.http\n .post('file/delete?compositionUuid=' + this.timelineService.selectedComposition.uuid, undefined)\n .pipe(\n map((response: Response) => {\n this.afterDeleteFile();\n })\n )\n .subscribe();\n }\n }\n })\n )\n .subscribe();\n }\n\n private openCompositionSettings(compositionIndex?: number, newComposition?: Composition) {\n const editComposition: Composition =\n newComposition || JSON.parse(JSON.stringify(this.projectService.project.compositions[compositionIndex]));\n\n const bsModalRef = this.modalService.show(CompositionSettingsComponent, {\n keyboard: false,\n ignoreBackdropClick: true,\n class: '',\n initialState: { composition: editComposition },\n });\n\n (bsModalRef.content as CompositionSettingsComponent).onClose.subscribe((result) => {\n if (result === 1) {\n // OK has been pressed -> save\n if (newComposition) {\n this.projectService.project.compositions.push(editComposition);\n this.timelineService.selectedCompositionIndex = this.projectService.project.compositions.length - 1;\n\n // create the composition, if externally necessary\n if (this.timelineService.externalCompositionsAvailable) {\n // TODO check, if this composition already exists externally and create it, if not\n // maybe not needed and even confusing?\n }\n } else {\n this.projectService.project.compositions[compositionIndex] = editComposition;\n }\n\n this.selectComposition(this.timelineService.selectedCompositionIndex);\n }\n });\n }\n\n compositionSettings() {\n this.openCompositionSettings(this.timelineService.selectedCompositionIndex);\n }\n\n addComposition() {\n // create a new composition\n const composition = new Composition();\n composition.uuid = this.uuidService.getUuid();\n composition.name = 'New Composition';\n\n this.openCompositionSettings(undefined, composition);\n }\n\n selectComposition(index: number) {\n this.timelineService.selectCompositionIndex(index);\n }\n\n @HostListener('document:keydown', ['$event'])\n handleKeyboardEvent(event: KeyboardEvent) {\n if (this.hotkeyTargetExcludeService.exclude(event)) {\n return;\n }\n\n if (!this.timelineService.selectedComposition) {\n return;\n }\n\n if (event.key === ' ') {\n if (this.timelineService.playState === 'paused') {\n this.play();\n } else {\n this.pause();\n }\n\n // prevent checkboxes being toggled, if in focus e.g.\n event.stopPropagation();\n event.preventDefault();\n }\n }\n\n setRegionStartMillis(value: any) {\n if (!this.timelineService.selectedPlaybackRegion) {\n return;\n }\n\n if (isNaN(value) || value < 0) {\n return;\n }\n\n this.timelineService.selectedPlaybackRegion.startMillis = +value;\n this.timelineService.updateSelectedRegion();\n }\n\n setRegionEndMillis(value: any) {\n if (!this.timelineService.selectedPlaybackRegion) {\n return;\n }\n\n if (isNaN(value) || value < 0) {\n return;\n }\n\n this.timelineService.selectedPlaybackRegion.endMillis = +value;\n this.timelineService.updateSelectedRegion();\n }\n}\n","import { AfterViewInit, Component, HostListener, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ToastrService } from 'ngx-toastr';\nimport { map } from 'rxjs/operators';\nimport Split from 'split.js';\nimport { PreviewComponent } from './preview/preview.component';\nimport { ProjectBrowserComponent } from './project/project-browser/project-browser.component';\nimport { ProjectImportComponent } from './project/project-import/project-import.component';\nimport { ProjectSaveComponent } from './project/project-save/project-save.component';\nimport { ProjectShareComponent } from './project/project-share/project-share.component';\nimport { ConfigService } from './services/config.service';\nimport { ErrorDialogService } from './services/error-dialog.service';\nimport { FixturePoolService } from './services/fixture-pool.service';\nimport { FixtureService } from './services/fixture.service';\nimport { HotkeyTargetExcludeService } from './services/hotkey-target-exclude.service';\nimport { IntroService } from './services/intro.service';\nimport { ProjectLoadService } from './services/project-load.service';\nimport { ProjectService } from './services/project.service';\nimport { TimelineService } from './services/timeline.service';\nimport { UserEnsureLoginService } from './services/user-ensure-login.service';\nimport { UserService } from './services/user.service';\nimport { WarningDialogService } from './services/warning-dialog.service';\nimport { TimelineComponent } from './timeline/timeline.component';\nimport { UserRegisterComponent } from './user/user-register/user-register.component';\n\n@Component({\n selector: 'lib-designer',\n templateUrl: './designer.component.html',\n styleUrls: ['./designer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class DesignerComponent implements OnInit, AfterViewInit {\n @Input()\n set menuHeightPx(value: number) {\n this.configService.menuHeightPx = value;\n this.configService.menuHeightChanged.next();\n }\n\n @Input()\n set externalCompositionsAvailable(value: boolean) {\n this.timelineService.externalCompositionsAvailable = value;\n }\n\n @Input()\n set restUrl(value: string) {\n this.configService.restUrl = value;\n }\n\n @Input()\n set enableMediaLibrary(value: boolean) {\n this.configService.enableMediaLibrary = value;\n }\n\n @Input()\n set loginAvailable(value: boolean) {\n this.configService.loginAvailable = value;\n }\n\n @Input()\n set shareAvailable(value: boolean) {\n this.configService.shareAvailable = value;\n }\n\n @Input()\n set languageSwitch(value: boolean) {\n this.configService.languageSwitch = value;\n }\n\n @Input()\n set newProjectTemplate(value: boolean) {\n this.configService.newProjectTemplate = value;\n }\n\n @Input()\n set livePreview(value: boolean) {\n this.configService.livePreview = value;\n }\n\n @Input()\n set localProfiles(value: boolean) {\n this.configService.localProfiles = value;\n }\n\n @Input()\n set intro(value: boolean) {\n this.configService.intro = value;\n this.introService.refresh();\n }\n\n @Input()\n set uniqueProjectNames(value: boolean) {\n this.configService.uniqueProjectNames = value;\n }\n\n // the size of the menu used in the designer\n private designerMenuSizePx = 20;\n\n private splitGutterSizePx = 13;\n\n public totalMenuHeightPx = 0;\n\n currentTab = 'properties';\n\n @ViewChild(PreviewComponent)\n previewComponent: PreviewComponent;\n\n @ViewChild(TimelineComponent)\n timelineComponent: TimelineComponent;\n\n constructor(\n private translateService: TranslateService,\n private projectService: ProjectService,\n public configService: ConfigService,\n private fixturePoolService: FixturePoolService,\n private hotkeyTargetExcludeService: HotkeyTargetExcludeService,\n private modalService: BsModalService,\n public userService: UserService,\n private userEnsureLoginService: UserEnsureLoginService,\n private toastrService: ToastrService,\n private projectLoadService: ProjectLoadService,\n private warningDialogService: WarningDialogService,\n private errorDialogService: ErrorDialogService,\n private fixtureService: FixtureService,\n private timelineService: TimelineService,\n public introService: IntroService\n ) {\n this.configService.menuHeightChanged.subscribe(() => {\n this.calcTotalMenuHeight();\n });\n }\n\n ngOnInit() {\n if (localStorage.getItem('language')) {\n this.translateService.use(localStorage.getItem('language'));\n } else {\n this.translateService.use('en');\n }\n\n this.calcTotalMenuHeight();\n\n const urlParams = new URLSearchParams(window.location.search);\n const projectId = urlParams.get('id');\n const projectName = urlParams.get('name');\n let shareToken = urlParams.get('token');\n\n if (projectId) {\n // load a project by query param ID\n if (!shareToken) {\n shareToken = '';\n }\n\n this.projectLoadService.load(Number.parseInt(projectId), projectName, shareToken).subscribe(\n () => {},\n (response) => {\n let error = response && response.error ? response.error.error : 'unknown';\n\n let msg = '';\n\n if (error === 'no-permission') {\n msg = 'designer.project.open-no-permission-error';\n error = undefined;\n } else {\n msg = 'designer.project.open-error';\n }\n\n this.errorDialogService.show(msg, error).subscribe(() => {\n this.projectLoadService.new();\n });\n }\n );\n } else if (this.userService.isLoggedIn() && (this.userService.getAutoLoadProjectId() || this.userService.getAutoLoadProjectName())) {\n // restore the last saved project\n this.projectLoadService.load(this.userService.getAutoLoadProjectId(), this.userService.getAutoLoadProjectName()).subscribe(\n () => {},\n (response) => {\n const msg = 'designer.project.open-error';\n const error = response && response.error ? response.error.error : 'unknown';\n\n this.errorDialogService.show(msg, error).subscribe(() => {\n this.projectLoadService.new();\n });\n }\n );\n } else {\n if (this.configService.newProjectTemplate) {\n // load the new project template\n this.projectLoadService.template();\n } else {\n this.projectLoadService.new();\n }\n }\n }\n\n private calcTotalMenuHeight() {\n this.totalMenuHeightPx = this.designerMenuSizePx + this.splitGutterSizePx + this.configService.menuHeightPx;\n }\n\n private onResize() {\n if (this.previewComponent) {\n this.previewComponent.onResize();\n }\n\n if (this.timelineComponent) {\n this.timelineComponent.onResize();\n }\n }\n\n ngAfterViewInit(): void {\n // Set up the splitter\n setTimeout(() => {\n Split(['#row1', '#row2', '#row3'], {\n sizes: [42, 38, 20],\n direction: 'vertical',\n cursor: 'row-resize',\n snapOffset: 0,\n gutterSize: this.splitGutterSizePx,\n onDrag: this.onResize.bind(this),\n });\n\n Split(['#scenes', '#presets', '#preview'], {\n sizes: [15, 15, 70],\n snapOffset: 0,\n gutterSize: this.splitGutterSizePx,\n onDrag: this.onResize.bind(this),\n });\n\n Split(['#capabilities', '#fixtures', '#masterDimmer'], {\n sizes: [74, 18, 8],\n snapOffset: 0,\n gutterSize: this.splitGutterSizePx,\n onDrag: this.onResize.bind(this),\n minSize: 50,\n });\n\n this.onResize();\n });\n }\n\n openTab(tab: string) {\n // open a side tab (e.g. effects, channels, settings, etc.)\n\n if (tab === 'settings') {\n this.fixtureService.settingsSelection = true;\n } else {\n this.fixtureService.settingsSelection = false;\n }\n\n this.currentTab = tab;\n }\n\n openFixturePool() {\n this.fixturePoolService.open();\n }\n\n projectNew() {\n this.warningDialogService\n .show('designer.misc.warning-proceed-unsaved')\n .pipe(\n map((result) => {\n if (result) {\n this.projectLoadService.new();\n }\n })\n )\n .subscribe();\n }\n\n projectOpen() {\n this.warningDialogService\n .show('designer.misc.warning-proceed-unsaved')\n .pipe(\n map((result) => {\n if (result) {\n this.userEnsureLoginService.login().subscribe(() => {\n this.modalService.show(ProjectBrowserComponent, { keyboard: true, ignoreBackdropClick: false });\n });\n }\n })\n )\n .subscribe();\n }\n\n projectSave() {\n if (this.projectService.project.name) {\n // this project has been saved before -> just save it again\n this.projectService.save(this.projectService.project);\n } else {\n // this project has not yet been saved -> show the save as-dialog\n this.userEnsureLoginService.login().subscribe(() => {\n this.modalService.show(ProjectSaveComponent, { keyboard: true, ignoreBackdropClick: false });\n });\n }\n }\n\n projectSaveAs() {\n this.userEnsureLoginService.login().subscribe(() => {\n this.modalService.show(ProjectSaveComponent, { keyboard: true, ignoreBackdropClick: false });\n });\n }\n\n userRegister() {\n this.modalService.show(UserRegisterComponent, { keyboard: true, ignoreBackdropClick: false });\n }\n\n projectImport() {\n this.warningDialogService\n .show('designer.misc.warning-proceed-unsaved')\n .pipe(\n map((result) => {\n if (result) {\n this.modalService.show(ProjectImportComponent, { keyboard: true, ignoreBackdropClick: false });\n }\n })\n )\n .subscribe();\n }\n\n projectExport() {\n const json = JSON.stringify(this.projectService.project, null, 2);\n const element = document.createElement('a');\n element.setAttribute('href', 'data:text/json;charset=UTF-8,' + encodeURIComponent(json));\n element.setAttribute('download', this.projectService.project.name + '.rsd');\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n }\n\n projectShare() {\n if (!this.projectService.project.id) {\n // a save is required first\n this.errorDialogService.show('designer.project.share-no-save').subscribe();\n return;\n }\n\n // ignore backdrop click, because selecting the link text will also close the modal\n this.modalService.show(ProjectShareComponent, { keyboard: true, ignoreBackdropClick: true });\n }\n\n @HostListener('document:keydown', ['$event'])\n handleKeyboardEvent(event: any) {\n if (this.hotkeyTargetExcludeService.exclude(event)) {\n return;\n }\n\n if (event.key === 'p') {\n this.openFixturePool();\n\n // prevent checkboxes being toggled, if in focus e.g.\n event.stopPropagation();\n event.preventDefault();\n }\n\n if ((event.ctrlKey || event.metaKey) && event.key === 'n') {\n this.projectNew();\n event.stopPropagation();\n event.preventDefault();\n }\n\n if ((event.ctrlKey || event.metaKey) && event.key === 's') {\n this.projectSave();\n event.stopPropagation();\n event.preventDefault();\n }\n\n if ((event.ctrlKey || event.metaKey) && event.key === 'o') {\n this.projectOpen();\n event.stopPropagation();\n event.preventDefault();\n }\n }\n\n switchLanguage(language: string) {\n this.translateService.use(language);\n localStorage.setItem('language', language);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'sort',\n})\nexport class ArraySortPipe implements PipeTransform {\n transform(array: any, field: string): any[] {\n if (!Array.isArray(array)) {\n return;\n }\n array.sort((a: any, b: any) => {\n if (a[field] < b[field]) {\n return -1;\n } else if (a[field] > b[field]) {\n return 1;\n } else {\n return 0;\n }\n });\n return array;\n }\n}\n","import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subscription, timer } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { CachedFixtureChannel } from '../../models/cached-fixture-channel';\nimport { EffectCurveProfileChannels } from '../../models/effect-curve-profile-channel';\nimport { FixtureCapability, FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';\nimport { FixtureProfile } from '../../models/fixture-profile';\nimport { FixtureService } from '../../services/fixture.service';\nimport { PresetService } from '../../services/preset.service';\nimport { EffectCurve } from './../../models/effect-curve';\nimport { AnimationService } from './../../services/animation.service';\n\n@Component({\n selector: 'lib-app-effect-curve',\n templateUrl: './effect-curve.component.html',\n styleUrls: ['./effect-curve.component.css'],\n})\nexport class EffectCurveComponent implements OnInit {\n private gridUpdateSubscription: Subscription;\n private ctx: any;\n private maxWidth: number;\n private maxHeight: number;\n\n public lengthMillisMin = 20;\n public lengthMillisMax = 8000;\n public amplitudeMin = 0;\n public amplitudeMax = 4;\n public percentageMin = 0;\n public percentageMax = 1;\n public phaseMillisMin = -1000;\n public phaseMillisMax = 1000;\n public phasingMillisMin = 0;\n public phasingMillisMax = 1000;\n\n // the selected capabilities\n public availableCapabilities: FixtureCapability[] = [];\n\n // the selected channels\n public availableChannels: Map<FixtureProfile, CachedFixtureChannel[]> = new Map<FixtureProfile, CachedFixtureChannel[]>();\n public availableProfiles: FixtureProfile[] = [];\n public selectedProfiles: FixtureProfile[] = [];\n\n @Input() curve: EffectCurve;\n\n // whether the effect is currently being edited (open) or not\n @Input()\n set isSelected(value: boolean) {\n if (value) {\n // start the update timer\n if (!this.gridUpdateSubscription) {\n this.gridUpdateSubscription = timer(0, 15).subscribe(() => {\n this.redraw();\n });\n }\n } else {\n // stop the update timer\n if (this.gridUpdateSubscription) {\n this.gridUpdateSubscription.unsubscribe();\n this.gridUpdateSubscription = undefined;\n }\n }\n }\n\n @ViewChild('curveGrid', { static: true }) curveGrid: ElementRef;\n\n constructor(\n public presetService: PresetService,\n private animationService: AnimationService,\n private fixtureService: FixtureService,\n private translate: TranslateService\n ) {\n this.presetService.fixtureSelectionChanged.subscribe(() => {\n this.updateCapabilitiesAndChannels();\n });\n\n this.updateCapabilitiesAndChannels();\n }\n\n ngOnInit() {\n const canvas = this.curveGrid.nativeElement;\n this.ctx = canvas.getContext('2d');\n this.maxWidth = canvas.width;\n this.maxHeight = canvas.height;\n\n this.redraw();\n }\n\n private drawCurrentValue(currMillis: number, radius: number, lineWidth: number, durationMillis: number, maxHeight: number) {\n const currVal = 1 - this.curve.getValueAtMillis(currMillis);\n\n const x = (this.maxWidth * (currMillis % durationMillis)) / durationMillis;\n const y = maxHeight * currVal + lineWidth;\n\n this.ctx.beginPath();\n this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n this.ctx.fillStyle = '#fff';\n this.ctx.fill();\n this.ctx.lineWidth = 1;\n this.ctx.strokeStyle = '#000';\n this.ctx.stroke();\n }\n\n private getPhasingCount(): number {\n let count = 0;\n const countedDmxChannels: number[] = [];\n\n for (const fixtureUuid of this.presetService.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getFixtureByUuid(fixtureUuid);\n\n if (!countedDmxChannels.includes(fixture.dmxFirstChannel)) {\n count++;\n countedDmxChannels.push(fixture.dmxFirstChannel);\n }\n }\n\n return count;\n }\n\n redraw() {\n this.ctx.clearRect(0, 0, this.maxWidth, this.maxHeight);\n this.ctx.fillStyle = '#fff';\n this.ctx.strokeStyle = '#fff';\n\n // the width of the lines\n const width = 3;\n\n this.ctx.lineWidth = width;\n\n let oldX: number;\n let oldY: number;\n\n let step = 50;\n\n if (length < 500) {\n step = 5;\n }\n\n const durationMillis = this.curve.lengthMillis * Math.max(Math.round(4 - this.curve.lengthMillis / 1000), 1);\n const maxHeight = this.maxHeight - width * 2;\n\n // draw the curve\n for (let i = -step * 2; i < durationMillis + step * 2; i += step) {\n const val = 1 - this.curve.getValueAtMillis(i);\n\n // Scale the values to the grid dimensions\n const x = (this.maxWidth * i) / durationMillis;\n const y = maxHeight * val + width;\n\n if (oldY) {\n this.ctx.beginPath();\n this.ctx.moveTo(oldX, oldY);\n this.ctx.lineTo(x, y);\n this.ctx.stroke();\n }\n\n oldX = x;\n oldY = y;\n }\n\n // draw the current value\n this.drawCurrentValue(this.animationService.timeMillis % durationMillis, 5, width, durationMillis, maxHeight);\n\n // draw the phasing values (chase), if required\n let phasingCount = 0;\n\n if (this.curve.phasingMillis > 0 && this.presetService.selectedPreset) {\n phasingCount = this.getPhasingCount();\n }\n\n for (let i = 1; i < phasingCount; i++) {\n this.drawCurrentValue(\n (this.animationService.timeMillis - i * this.curve.phasingMillis) % durationMillis,\n 3,\n width,\n durationMillis,\n maxHeight\n );\n }\n }\n\n private calculateChannelCapabilities() {\n this.availableChannels = this.presetService.getSelectedProfileChannels(this.selectedProfiles);\n }\n\n changeProfileSelection($event: any, profile: FixtureProfile) {\n if (this.selectedProfiles.indexOf(profile) >= 0) {\n this.selectedProfiles.splice(this.selectedProfiles.indexOf(profile), 1);\n } else {\n this.selectedProfiles.push(profile);\n }\n\n this.calculateChannelCapabilities();\n }\n\n private updateCapabilitiesAndChannels() {\n // capabilities\n this.availableCapabilities = [];\n\n if (this.presetService.hasCapabilityDimmer()) {\n const capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.Intensity;\n this.availableCapabilities.push(capability);\n }\n\n if (this.presetService.hasCapabilityColor()) {\n let capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.ColorIntensity;\n capability.color = FixtureCapabilityColor.Red;\n this.availableCapabilities.push(capability);\n\n capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.ColorIntensity;\n capability.color = FixtureCapabilityColor.Green;\n this.availableCapabilities.push(capability);\n\n capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.ColorIntensity;\n capability.color = FixtureCapabilityColor.Blue;\n this.availableCapabilities.push(capability);\n }\n\n if (this.presetService.hasCapabilityPanTilt()) {\n let capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.Pan;\n this.availableCapabilities.push(capability);\n\n capability = new FixtureCapability();\n capability.type = FixtureCapabilityType.Tilt;\n this.availableCapabilities.push(capability);\n }\n\n // calculate all profiles\n this.availableProfiles = this.presetService.getSelectedProfiles();\n\n // select all profiles by default\n this.selectedProfiles = [...this.availableProfiles];\n\n // calculate all channels\n this.calculateChannelCapabilities();\n }\n\n getCapabilityName(capability: FixtureCapability): Observable<string> {\n return this.translate\n .get(['designer.fixtureCapabilityType.' + capability.type, 'designer.fixtureCapabilityColor.' + capability.color])\n .pipe(\n map((result: string) => {\n let name = '';\n name += result['designer.fixtureCapabilityType.' + capability.type];\n\n if (capability.color) {\n name += ', ' + result['designer.fixtureCapabilityColor.' + capability.color];\n } else {\n return name;\n }\n\n return name;\n })\n );\n }\n\n capabilityChecked(capability: FixtureCapability): boolean {\n for (const existingCapability of this.curve.capabilities) {\n if (\n this.fixtureService.capabilitiesMatch(\n existingCapability.type,\n capability.type,\n existingCapability.color,\n capability.color,\n null,\n null,\n null,\n null\n )\n ) {\n return true;\n }\n }\n return false;\n }\n\n toggleCapability(event: any, capability: FixtureCapability) {\n if (event.currentTarget.checked) {\n // add the capability\n this.curve.capabilities.push(capability);\n } else {\n // Remove the channel\n for (let i = 0; i < this.curve.capabilities.length; i++) {\n const existingCapability = this.curve.capabilities[i];\n if (\n this.fixtureService.capabilitiesMatch(\n existingCapability.type,\n capability.type,\n existingCapability.color,\n capability.color,\n null,\n null,\n null,\n null\n )\n ) {\n this.curve.capabilities.splice(i, 1);\n }\n }\n }\n\n this.presetService.previewLive();\n }\n\n getChannelName(profileName: string, channelName: string) {\n if (this.availableProfiles.length > 1) {\n return profileName + ' - ' + channelName;\n }\n\n return channelName;\n }\n\n channelChecked(profile: FixtureProfile, channel: CachedFixtureChannel): boolean {\n for (const profileChannels of this.curve.channels) {\n if (profileChannels.profileUuid === profile.uuid) {\n if (profileChannels.channels.includes(channel.name)) {\n return true;\n }\n\n break;\n }\n }\n\n return false;\n }\n\n toggleChannel(event: any, profile: FixtureProfile, channel: CachedFixtureChannel) {\n // add the profile, if necessary\n let profileContained = false;\n for (const profileChannels of this.curve.channels) {\n if (profileChannels.profileUuid === profile.uuid) {\n profileContained = true;\n break;\n }\n }\n\n if (!profileContained) {\n const profileChannels = new EffectCurveProfileChannels();\n profileChannels.profileUuid = profile.uuid;\n this.curve.channels.push(profileChannels);\n }\n\n // add or delete the channel\n for (const profileChannels of this.curve.channels) {\n if (profileChannels.profileUuid === profile.uuid) {\n const index = profileChannels.channels.indexOf(channel.name);\n\n if (index >= 0) {\n profileChannels.channels.splice(index, 1);\n } else {\n profileChannels.channels.push(channel.name);\n }\n\n break;\n }\n }\n\n this.presetService.previewLive();\n }\n\n setLengthMillis(value: any) {\n if (!isNaN(value) && value >= this.lengthMillisMin && value <= this.lengthMillisMax) {\n this.curve.lengthMillis = +value;\n this.presetService.previewLive();\n }\n }\n\n setAmplitude(value: any) {\n if (!isNaN(value) && value >= this.amplitudeMin && value <= this.amplitudeMax) {\n this.curve.amplitude = +value;\n this.presetService.previewLive();\n }\n }\n\n setPosition(value: any) {\n if (!isNaN(value) && value >= this.percentageMin && value <= this.percentageMax) {\n this.curve.position = +value;\n this.presetService.previewLive();\n }\n }\n\n setPhaseMillis(value: any) {\n if (!isNaN(value) && value >= this.phaseMillisMin && value <= this.phaseMillisMax) {\n this.curve.phaseMillis = +value;\n this.presetService.previewLive();\n }\n }\n\n setPhasingMillis(value: any) {\n if (!isNaN(value) && value >= this.phasingMillisMin && value <= this.phasingMillisMax) {\n this.curve.phasingMillis = +value;\n this.presetService.previewLive();\n }\n }\n}\n","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\n\n@Component({\n selector: 'lib-app-effect-pan-tilt',\n templateUrl: './effect-pan-tilt.component.html',\n styleUrls: ['./effect-pan-tilt.component.css'],\n})\nexport class EffectPanTiltComponent implements OnInit {\n @ViewChild('panTiltGrid') panTiltGrid: ElementRef;\n\n // private line = d3.line();\n private svg;\n private path;\n\n private points = [\n [0, 500],\n [500, 0],\n [1000, 500],\n [500, 1000],\n ];\n\n private dragged = null;\n private selected = this.points[0];\n\n constructor() {}\n\n private redraw() {}\n\n ngOnInit() {}\n}\n","import { Component, OnInit } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { Effect } from '../models/effect';\nimport { EffectCurve } from '../models/effect-curve';\nimport { EffectPanTilt } from '../models/effect-pan-tilt';\nimport { EffectService } from '../services/effect.service';\nimport { PresetService } from '../services/preset.service';\nimport { UuidService } from '../services/uuid.service';\nimport { WarningDialogService } from '../services/warning-dialog.service';\n\n@Component({\n selector: 'lib-app-effect',\n templateUrl: './effect.component.html',\n styleUrls: ['./effect.component.css'],\n})\nexport class EffectComponent implements OnInit {\n constructor(\n private uuidService: UuidService,\n public presetService: PresetService,\n public effectService: EffectService,\n private warningDialogService: WarningDialogService\n ) {}\n\n ngOnInit() {}\n\n private addEffect(effect: Effect) {\n this.effectService.selectedEffect = effect;\n\n if (this.presetService.selectedPreset) {\n this.presetService.selectedPreset.effects.push(effect);\n }\n }\n\n addCurveEffect() {\n const effect = new EffectCurve();\n effect.uuid = this.uuidService.getUuid();\n this.addEffect(effect);\n this.presetService.previewLive();\n }\n\n addPanTiltEffect() {\n this.addEffect(new EffectPanTilt());\n }\n\n openEffect(effect: Effect, event: any) {\n if (event) {\n this.effectService.selectedEffect = effect;\n } else {\n if (this.effectService.selectedEffect === effect) {\n this.effectService.selectedEffect = undefined;\n }\n }\n }\n\n deleteEffect(effect: Effect) {\n this.warningDialogService\n .show('designer.effect.delete-warning')\n .pipe(\n map((result) => {\n if (result) {\n this.presetService.selectedPreset.effects.splice(this.presetService.selectedPreset.effects.indexOf(effect), 1);\n this.presetService.previewLive();\n }\n })\n )\n .subscribe();\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { CachedFixtureCapability } from '../../../models/cached-fixture-capability';\nimport { CachedFixtureChannel } from '../../../models/cached-fixture-channel';\nimport { FixtureProfile } from '../../../models/fixture-profile';\nimport { PresetService } from '../../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-capability-channel',\n templateUrl: './fixture-capability-channel.component.html',\n styleUrls: ['./fixture-capability-channel.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FixtureCapabilityChannelComponent implements OnInit {\n @ViewChild('sliderValue', { static: false }) sliderValue: ElementRef;\n\n selectedCapability: CachedFixtureCapability;\n _channel: CachedFixtureChannel;\n\n rangeMin = 0;\n rangeMax = 0;\n defaultValue = 0;\n value = 0;\n templateValue = 0;\n\n valueSetTimer: any;\n\n @Input()\n profile: FixtureProfile;\n\n @Input()\n set channel(value: CachedFixtureChannel) {\n this._channel = value;\n this.updateChannel();\n }\n\n @Input()\n capabilityIndex: number;\n\n constructor(private presetService: PresetService) {}\n\n private updateChannel() {\n this.selectedCapability = this._channel.capabilities[0];\n\n this.value = this.presetService.getChannelValue(this._channel.name, this.profile.uuid);\n this.calculateTemplateValue();\n\n if (this.value >= 0) {\n for (const capability of this._channel.capabilities) {\n if (capability.capability.dmxRange.length > 0 && capability.centerValue === this.value) {\n this.selectedCapability = capability;\n break;\n }\n }\n }\n\n this.rangeMin = this.getRangeMin();\n this.rangeMax = this.getRangeMax();\n this.defaultValue = this.getDefaultValue();\n }\n\n capabilityHasRange(): boolean {\n if (this._channel.capabilities && this._channel.capabilities.length === 1) {\n return true;\n }\n\n if (this.selectedCapability && this.selectedCapability.capability.angleStart) {\n return true;\n }\n\n return false;\n }\n\n private getRangeMin(): number {\n if (this.selectedCapability.capability.dmxRange.length > 0) {\n return this.selectedCapability.capability.dmxRange[0];\n }\n\n return 0;\n }\n\n private getRangeMax(): number {\n if (this.selectedCapability.capability.dmxRange.length > 0) {\n return this.selectedCapability.capability.dmxRange[1];\n }\n\n return this._channel.maxValue;\n }\n\n ngOnInit() {}\n\n setValue(value: any, ignoreCapabilityRange: boolean = false) {\n if (isNaN(value)) {\n return;\n }\n\n if (!ignoreCapabilityRange && (value < this.getRangeMin() || value > this.getRangeMax())) {\n return;\n }\n\n this.value = value;\n this.calculateTemplateValue();\n\n this.presetService.setChannelValue(this._channel.name, this.profile.uuid, value);\n if (this.sliderValue) {\n // update the value without change detector for performance reasons and only in a specific\n // interval. each value set will trigger a layout/reflow event and slow down the performance\n // TODO use the same technique in the dimmer/pan/tilt/color sliders\n if (!this.valueSetTimer) {\n this.valueSetTimer = setTimeout(() => {\n this.sliderValue.nativeElement.value = this.value;\n this.valueSetTimer = undefined;\n }, 30);\n }\n }\n this.presetService.previewLive();\n }\n\n private calculateTemplateValue() {\n this.templateValue = this.value ? this.value : this.getDefaultValue();\n }\n\n private getDefaultValue(): number {\n if (this._channel.defaultValue) {\n return this._channel.defaultValue;\n }\n\n return 0;\n }\n\n changeActive(active: boolean) {\n if (active) {\n this.setValue(this.getDefaultValue(), true);\n } else {\n this.presetService.deleteChannelValue(this._channel.name, this.profile.uuid);\n this.selectedCapability = this._channel.capabilities[0];\n this.value = undefined;\n this.calculateTemplateValue();\n }\n this.presetService.previewLive();\n }\n\n capabilitySelected() {\n // select the center value of the selected capability\n if (this.capabilityHasRange) {\n this.setValue(this.selectedCapability.capability.dmxRange[0], true);\n } else {\n this.setValue(this.selectedCapability.centerValue, true);\n }\n }\n}\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CachedFixtureCapability } from '../../../models/cached-fixture-capability';\nimport { CachedFixtureChannel } from '../../../models/cached-fixture-channel';\nimport { FixtureCapabilityType } from '../../../models/fixture-capability';\nimport { FixtureProfile } from '../../../models/fixture-profile';\nimport { FixtureWheel } from '../../../models/fixture-wheel';\nimport { FixtureService } from '../../../services/fixture.service';\nimport { PresetService } from '../../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-capability-color-wheel',\n templateUrl: './fixture-capability-color-wheel.component.html',\n styleUrls: ['./fixture-capability-color-wheel.component.css'],\n})\nexport class FixtureCapabilityColorWheelComponent implements OnInit, OnDestroy {\n _fixtureProfile: FixtureProfile;\n _channel: CachedFixtureChannel;\n wheelName: string;\n wheel: FixtureWheel;\n slotCapabilities: CachedFixtureCapability[];\n\n private colorChangeSubscription: Subscription;\n\n @Input()\n set profile(value: FixtureProfile) {\n this._fixtureProfile = value;\n this.update();\n }\n\n @Input()\n set channel(value: CachedFixtureChannel) {\n this._channel = value;\n this.update();\n }\n\n @Input()\n wheelIndex: number;\n\n @Input()\n showContainer = false;\n\n constructor(public presetService: PresetService, private changeDetectorRef: ChangeDetectorRef, private fixtureService: FixtureService) {}\n\n ngOnInit() {\n this.colorChangeSubscription = this.presetService.fixtureColorChanged.subscribe(() => {\n this.changeDetectorRef.detectChanges();\n });\n }\n\n ngOnDestroy() {\n this.colorChangeSubscription.unsubscribe();\n }\n\n private update() {\n if (this._fixtureProfile && this._channel) {\n this.wheelName = undefined;\n this.slotCapabilities = [];\n\n // get the wheel name\n for (const capability of this._channel.capabilities) {\n if (capability.wheel) {\n this.wheelName = capability.wheelName;\n break;\n }\n }\n if (!this.wheelName) {\n this.wheelName = this._channel.name;\n }\n\n this.wheel = this.fixtureService.getWheelByName(this._fixtureProfile, this.wheelName);\n\n // calculate all available slots\n for (const capability of this._channel.capabilities) {\n if (capability.capability.type === FixtureCapabilityType.WheelSlot) {\n this.slotCapabilities.push(capability);\n }\n }\n }\n\n this.changeDetectorRef.detectChanges();\n }\n\n getCapabilityColorStyle(capability: CachedFixtureCapability): any {\n let property = 'background-color';\n let value = 'black';\n let colors: string[] = [];\n\n if (capability.wheelSlots) {\n for (const slot of capability.wheelSlots) {\n // calculate the color based on the color wheel slot\n if (slot.colors.length > 0) {\n colors = colors.concat(slot.colors);\n }\n }\n }\n\n if (colors.length > 1) {\n // mixed colors -> gradient\n let colorString: string;\n for (const color of colors) {\n if (colorString) {\n colorString += ', ';\n } else {\n colorString = '';\n }\n colorString += color;\n }\n property = 'background-image';\n value = 'linear-gradient(to bottom right, ' + colorString + ')';\n } else if (colors.length === 1) {\n value = colors[0];\n } else {\n value = '#fff';\n }\n\n const style = {};\n style[property] = value;\n return style;\n }\n\n getCurrentSlotNumber(): number {\n const capabilityValue = this.presetService.getCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.WheelSlot,\n undefined,\n this.wheelName,\n this._fixtureProfile.uuid\n );\n\n if (capabilityValue) {\n return capabilityValue.slotNumber;\n }\n return undefined;\n }\n\n slotCapabilityIsSelected(slotNumber: number): boolean {\n const selectedSlotNumber = this.getCurrentSlotNumber();\n\n if (selectedSlotNumber >= 0) {\n // a slot is selected\n return selectedSlotNumber === slotNumber;\n } else {\n // no slot is selected and the capability is inactive\n // -> show the approx. color, if a color or a similar slot from a different wheel has been selected\n const approximatedCapability = this.presetService.getApproximatedColorWheelCapability(\n this.presetService.selectedPreset,\n this._channel\n );\n\n if (approximatedCapability) {\n return slotNumber === approximatedCapability.capability.slotNumber;\n } else {\n return false;\n }\n }\n }\n\n changeActive(active: boolean) {\n if (active) {\n this.presetService.setCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.WheelSlot,\n undefined,\n 1,\n undefined,\n this.wheelName,\n this._fixtureProfile.uuid\n );\n } else {\n this.presetService.deleteCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.WheelSlot,\n undefined,\n this.wheelName,\n this._fixtureProfile.uuid\n );\n }\n\n this.presetService.previewLive();\n }\n\n selectSlotNumber(slotNumber: number) {\n this.presetService.setCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.WheelSlot,\n undefined,\n slotNumber,\n undefined,\n this.wheelName,\n this._fixtureProfile.uuid\n );\n this.presetService.previewLive();\n }\n}\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { FixtureCapabilityColor, FixtureCapabilityType } from '../../../models/fixture-capability';\nimport { FixtureCapabilityValue } from '../../../models/fixture-capability-value';\nimport { FixtureService } from '../../../services/fixture.service';\nimport { PresetService } from '../../../services/preset.service';\n\ndeclare var iro: any;\n\n@Component({\n selector: 'lib-app-fixture-capability-color',\n templateUrl: './fixture-capability-color.component.html',\n styleUrls: ['./fixture-capability-color.component.css'],\n})\nexport class FixtureCapabilityColorComponent implements OnInit, OnDestroy {\n color = '#ffffff';\n colorPicker: any;\n active = false;\n private colorPickerMounted = false;\n\n // avoid internal updating events\n private updatingColor = false;\n\n private updateSubscription: Subscription;\n\n constructor(private presetService: PresetService, private fixtureService: FixtureService, private changeDetectorRef: ChangeDetectorRef) {\n this.updateSubscription = this.presetService.previewSelectionChanged.subscribe(() => {\n this.update();\n this.changeDetectorRef.detectChanges();\n });\n this.update();\n }\n\n private update() {\n let red: number;\n let green: number;\n let blue: number;\n let capabilityValue: FixtureCapabilityValue;\n capabilityValue = this.presetService.getCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Red\n );\n if (capabilityValue) {\n red = 255 * capabilityValue.valuePercentage;\n }\n capabilityValue = this.presetService.getCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Green\n );\n if (capabilityValue) {\n green = 255 * capabilityValue.valuePercentage;\n }\n capabilityValue = this.presetService.getCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Blue\n );\n if (capabilityValue) {\n blue = 255 * capabilityValue.valuePercentage;\n }\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this.active = true;\n } else {\n this.active = false;\n red = 255;\n green = 255;\n blue = 255;\n }\n this.color = this.fixtureService.rgbToHex(red, green, blue);\n this.setPickerColor(red, green, blue);\n }\n\n private setPickerColor(red: number, green: number, blue: number) {\n this.updatingColor = true;\n if (this.colorPicker) {\n this.colorPicker.color.rgb = { r: red, g: green, b: blue };\n }\n this.updatingColor = false;\n }\n\n ngOnDestroy() {\n this.updateSubscription.unsubscribe();\n }\n\n ngOnInit() {\n this.colorPicker = new iro.ColorPicker('#color-picker-container', {\n width: 180,\n color: this.color,\n borderWidth: 1,\n borderColor: '#ffffff',\n sliderMargin: 20,\n });\n\n this.colorPicker.on('color:change', this.changeColor.bind(this));\n\n // mounted may be called, before this callback has been added. use input:start therefore\n this.colorPicker.on('input:start', this.mount.bind(this));\n }\n\n mount() {\n this.colorPickerMounted = true;\n }\n\n private updateFixtureColor(color: any) {\n if (this.presetService.selectedPreset) {\n if (color) {\n this.presetService.setCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n color.rgb.r / 255,\n undefined,\n FixtureCapabilityColor.Red\n );\n this.presetService.setCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n color.rgb.g / 255,\n undefined,\n FixtureCapabilityColor.Green\n );\n this.presetService.setCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n color.rgb.b / 255,\n undefined,\n FixtureCapabilityColor.Blue\n );\n } else {\n this.presetService.deleteCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Red\n );\n this.presetService.deleteCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Green\n );\n this.presetService.deleteCapabilityValue(\n this.presetService.selectedPreset,\n FixtureCapabilityType.ColorIntensity,\n FixtureCapabilityColor.Blue\n );\n }\n this.changeDetectorRef.detectChanges();\n this.presetService.fixtureColorChanged.next();\n this.presetService.previewLive();\n }\n }\n\n changeActive(active: boolean) {\n this.active = active;\n\n if (active) {\n this.updateFixtureColor(this.colorPicker.color);\n } else {\n this.updateFixtureColor(undefined);\n this.setPickerColor(255, 255, 255);\n this.color = '#ffffff';\n }\n this.presetService.previewLive();\n }\n\n changeColor(color: any) {\n if (!this.colorPickerMounted || this.updatingColor) {\n return;\n }\n\n this.active = true;\n this.color = color.hexString;\n this.updateFixtureColor(color);\n }\n}\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { FixtureCapabilityType } from '../../../models/fixture-capability';\nimport { PresetService } from '../../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-capability-dimmer',\n templateUrl: './fixture-capability-dimmer.component.html',\n styleUrls: ['./fixture-capability-dimmer.component.css'],\n})\nexport class FixtureCapabilityDimmerComponent implements OnInit {\n constructor(private presetService: PresetService, private changeDetectorRef: ChangeDetectorRef) {}\n\n ngOnInit() {}\n\n getValue(): number {\n const capabilityValue = this.presetService.getCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Intensity);\n if (capabilityValue) {\n return capabilityValue.valuePercentage;\n }\n return undefined;\n }\n\n getValueText(): number {\n const value = this.getValue();\n if (value >= 0) {\n return Math.round(value * 100 * 100) / 100;\n }\n return undefined;\n }\n\n setValue(value: any) {\n if (isNaN(value)) {\n return;\n }\n\n if (value < 0 || value > 1) {\n return;\n }\n\n this.presetService.setCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Intensity, value);\n this.changeDetectorRef.detectChanges();\n this.presetService.previewLive();\n }\n\n changeActive(active: boolean) {\n if (active) {\n this.setValue(1);\n } else {\n this.presetService.deleteCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Intensity);\n this.changeDetectorRef.detectChanges();\n }\n this.presetService.previewLive();\n }\n}\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { FixtureCapabilityType } from '../../../models/fixture-capability';\nimport { PresetService } from '../../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-capability-pan-tilt',\n templateUrl: './fixture-capability-pan-tilt.component.html',\n styleUrls: ['./fixture-capability-pan-tilt.component.css'],\n})\nexport class FixtureCapabilityPanTiltComponent implements OnInit {\n constructor(private presetService: PresetService, private changeDetectorRef: ChangeDetectorRef) {}\n\n ngOnInit() {}\n\n getValuePan(): number {\n const capabilityValue = this.presetService.getCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Pan);\n if (capabilityValue) {\n return capabilityValue.valuePercentage;\n }\n return undefined;\n }\n\n getValueTextPan(): number {\n const value = this.getValuePan();\n if (value >= 0) {\n return Math.round(value * 100 * 100) / 100;\n }\n return undefined;\n }\n\n setValuePan(value: any) {\n if (isNaN(value)) {\n return;\n }\n\n if (value < 0 || value > 1) {\n return;\n }\n\n this.presetService.setCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Pan, value);\n this.changeDetectorRef.detectChanges();\n this.presetService.previewLive();\n }\n\n getValueTilt(): number {\n const capabilityValue = this.presetService.getCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Tilt);\n if (capabilityValue) {\n return capabilityValue.valuePercentage;\n }\n return undefined;\n }\n\n getValueTextTilt(): number {\n const value = this.getValueTilt();\n if (value >= 0) {\n return Math.round(value * 100 * 100) / 100;\n }\n return undefined;\n }\n\n setValueTilt(value: any) {\n if (isNaN(value)) {\n return;\n }\n\n if (value < 0 || value > 1) {\n return;\n }\n\n this.presetService.setCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Tilt, value);\n this.changeDetectorRef.detectChanges();\n this.presetService.previewLive();\n }\n\n changeActive(active: boolean) {\n if (active) {\n this.setValuePan(0.5);\n this.setValueTilt(0.5);\n } else {\n this.presetService.deleteCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Pan);\n this.presetService.deleteCapabilityValue(this.presetService.selectedPreset, FixtureCapabilityType.Tilt);\n this.changeDetectorRef.detectChanges();\n }\n this.presetService.previewLive();\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CachedFixtureChannel } from '../../models/cached-fixture-channel';\nimport { FixtureProfile } from '../../models/fixture-profile';\nimport { FixtureWheelSlotType } from '../../models/fixture-wheel-slot';\nimport { FixtureService } from '../../services/fixture.service';\nimport { IntroService } from '../../services/intro.service';\nimport { PresetService } from '../../services/preset.service';\nimport { ProjectService } from '../../services/project.service';\n\n@Component({\n selector: 'lib-app-fixture-capability',\n templateUrl: './fixture-capability.component.html',\n styleUrls: ['./fixture-capability.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FixtureCapabilityComponent implements OnInit, OnDestroy {\n // map containing the profile and the channel name containing the wheel\n colorWheelChannels: Map<FixtureProfile, CachedFixtureChannel> = new Map<FixtureProfile, CachedFixtureChannel>();\n\n private fixtureSelectionChangedSubscription: Subscription;\n private previewSelectionChangedSubscription: Subscription;\n\n constructor(\n public presetService: PresetService,\n private fixtureService: FixtureService,\n private changeDetectorRef: ChangeDetectorRef,\n public projectService: ProjectService,\n public introService: IntroService\n ) {\n this.fixtureSelectionChangedSubscription = this.presetService.fixtureSelectionChanged.subscribe(() => {\n this.update();\n });\n\n this.previewSelectionChangedSubscription = this.presetService.previewSelectionChanged.subscribe(() => {\n this.update();\n });\n\n this.introService.stepChanged.subscribe(() => {\n this.changeDetectorRef.detectChanges();\n });\n }\n\n ngOnInit() {}\n\n ngOnDestroy() {\n this.fixtureSelectionChangedSubscription.unsubscribe();\n this.previewSelectionChangedSubscription.unsubscribe();\n }\n\n private wheelInList(wheels: Map<FixtureProfile, CachedFixtureChannel>, profile: FixtureProfile, channel: CachedFixtureChannel) {\n wheels.forEach((existingChannel: CachedFixtureChannel, existingProfile: FixtureProfile) => {\n if (existingProfile.uuid === profile.uuid && existingChannel.name === channel.name) {\n return true;\n }\n });\n\n return false;\n }\n\n private updateColorWheels() {\n this.colorWheelChannels = new Map<FixtureProfile, CachedFixtureChannel>();\n\n if (!this.presetService.selectedPreset) {\n return;\n }\n\n for (const fixtureUuid of this.presetService.selectedPreset.fixtureUuids) {\n const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);\n for (const channel of fixture.channels) {\n for (const capability of channel.capabilities) {\n if (capability.wheel && capability.wheelSlots && capability.wheelSlots.length > 0) {\n if (this.fixtureService.wheelHasSlotType(capability.wheel, FixtureWheelSlotType.Color)) {\n // color wheel\n if (!this.wheelInList(this.colorWheelChannels, fixture.profile, channel)) {\n this.colorWheelChannels.set(fixture.profile, channel);\n }\n } else if (this.fixtureService.wheelHasSlotType(capability.wheel, FixtureWheelSlotType.Gobo)) {\n // gobo wheel\n // TODO\n }\n }\n }\n }\n }\n }\n\n private update() {\n this.updateColorWheels();\n this.changeDetectorRef.detectChanges();\n }\n\n isChrome(): boolean {\n if (navigator.appVersion.indexOf('Chrome/') !== -1) {\n return true;\n }\n return false;\n }\n}\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CachedFixtureChannel } from '../../models/cached-fixture-channel';\nimport { FixtureProfile } from '../../models/fixture-profile';\nimport { PresetService } from '../../services/preset.service';\nimport { ProjectService } from '../../services/project.service';\n\n@Component({\n selector: 'lib-app-fixture-channel',\n templateUrl: './fixture-channel.component.html',\n styleUrls: ['./fixture-channel.component.css'],\n})\nexport class FixtureChannelComponent implements OnInit, OnDestroy {\n public channelCapabilities: Map<FixtureProfile, CachedFixtureChannel[]> = new Map<FixtureProfile, CachedFixtureChannel[]>();\n public profiles: FixtureProfile[] = [];\n public selectedProfiles: FixtureProfile[] = [];\n\n private fixtureSelectionChangedSubscription: Subscription;\n private previewSelectionChangedSubscription: Subscription;\n\n constructor(public presetService: PresetService, private changeDetectorRef: ChangeDetectorRef, public projectService: ProjectService) {\n this.fixtureSelectionChangedSubscription = this.presetService.fixtureSelectionChanged.subscribe(() => {\n this.calculateProfiles();\n });\n\n this.previewSelectionChangedSubscription = this.presetService.previewSelectionChanged.subscribe(() => {\n this.calculateProfiles();\n });\n }\n\n ngOnInit() {}\n\n ngOnDestroy() {\n this.fixtureSelectionChangedSubscription.unsubscribe();\n this.previewSelectionChangedSubscription.unsubscribe();\n }\n\n private calculateChannelCapabilities() {\n this.channelCapabilities = this.presetService.getSelectedProfileChannels(this.selectedProfiles);\n\n this.changeDetectorRef.detectChanges();\n }\n\n private calculateProfiles() {\n // calculate all profiels\n this.profiles = this.presetService.getSelectedProfiles();\n\n // select all profiles by default\n this.selectedProfiles = [...this.profiles];\n\n this.calculateChannelCapabilities();\n }\n\n changeProfileSelection($event: any, profile: FixtureProfile) {\n if (this.selectedProfiles.indexOf(profile) >= 0) {\n this.selectedProfiles.splice(this.selectedProfiles.indexOf(profile), 1);\n } else {\n this.selectedProfiles.push(profile);\n }\n\n this.calculateChannelCapabilities();\n }\n\n isChrome(): boolean {\n if (navigator.appVersion.indexOf('Chrome/') !== -1) {\n return true;\n }\n return false;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { Positioning } from '../../../models/fixture';\nimport { FixtureService } from '../../../services/fixture.service';\nimport { PresetService } from '../../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-settings-position',\n templateUrl: './fixture-settings-position.component.html',\n styleUrls: ['./fixture-settings-position.component.css'],\n})\nexport class FixtureSettingsPositionComponent implements OnInit {\n selectUndefinedOptionValue: any = undefined;\n\n selectedPositioning: string = undefined;\n\n positionX = 0;\n positionY = 0;\n positionZ = 0;\n\n positionXMin = -400;\n positionXMax = 400;\n positionYMin = 0;\n positionYMax = 400;\n positionZMin = -400;\n positionZMax = 400;\n\n rotationX = 0;\n rotationY = 0;\n rotationZ = 0;\n\n rotationMin = 0;\n rotationMax = 360;\n\n constructor(public fixtureService: FixtureService, private presetService: PresetService) {\n presetService.fixtureSelectionSettingsChanged.subscribe(() => {\n this.updateSelection();\n });\n }\n\n ngOnInit() {}\n\n private updateSelection() {\n // get all display values for the selected settings fixtures\n this.selectedPositioning = undefined;\n\n this.positionX = undefined;\n this.positionY = undefined;\n this.positionZ = undefined;\n\n this.rotationX = undefined;\n this.rotationY = undefined;\n this.rotationZ = undefined;\n\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.selectedPositioning) {\n if (this.selectedPositioning !== fixture.positioning) {\n this.selectedPositioning = undefined;\n break;\n }\n } else {\n this.selectedPositioning = fixture.positioning;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.positionX) {\n if (this.positionX !== fixture.positionX) {\n this.positionX = undefined;\n break;\n }\n } else {\n this.positionX = fixture.positionX;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.positionY) {\n if (this.positionY !== fixture.positionY) {\n this.positionY = undefined;\n break;\n }\n } else {\n this.positionY = fixture.positionY;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.positionZ) {\n if (this.positionZ !== fixture.positionZ) {\n this.positionZ = undefined;\n break;\n }\n } else {\n this.positionZ = fixture.positionZ;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.rotationX) {\n if (this.rotationX !== fixture.rotationX) {\n this.rotationX = undefined;\n break;\n }\n } else {\n this.rotationX = fixture.rotationX;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.rotationY) {\n if (this.rotationY !== fixture.rotationY) {\n this.rotationY = undefined;\n break;\n }\n } else {\n this.rotationY = fixture.rotationY;\n }\n }\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (this.rotationZ) {\n if (this.rotationZ !== fixture.rotationZ) {\n this.rotationZ = undefined;\n break;\n }\n } else {\n this.rotationZ = fixture.rotationZ;\n }\n }\n }\n\n changePosition(positioningStr: string) {\n const positioning: Positioning = Positioning[positioningStr];\n\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n fixture.positioning = positioning;\n }\n }\n\n changePositionManual(position: string, value: any) {\n if (isNaN(value)) {\n return;\n }\n\n if (position === 'x') {\n if (value >= this.positionXMin && value <= this.positionXMax) {\n this.positionX = +value;\n }\n } else if (position === 'y') {\n if (value >= this.positionYMin && value <= this.positionYMax) {\n this.positionY = +value;\n }\n } else if (position === 'z') {\n if (value >= this.positionZMin && value <= this.positionZMax) {\n this.positionZ = +value;\n }\n }\n\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (position === 'x') {\n if (value >= this.positionXMin && value <= this.positionXMax) {\n fixture.positionX = +value;\n }\n } else if (position === 'y') {\n if (value >= this.positionYMin && value <= this.positionYMax) {\n fixture.positionY = +value;\n }\n } else if (position === 'z') {\n if (value >= this.positionZMin && value <= this.positionZMax) {\n fixture.positionZ = +value;\n }\n }\n }\n }\n\n changeRotationManual(rotation: string, value: any) {\n if (isNaN(value) || value < this.rotationMin || value > this.rotationMax) {\n return;\n }\n\n if (rotation === 'x') {\n this.rotationX = +value;\n } else if (rotation === 'y') {\n this.rotationY = +value;\n } else if (rotation === 'z') {\n this.rotationZ = +value;\n }\n\n for (const fixture of this.fixtureService.selectedSettingsFixtures) {\n if (rotation === 'x') {\n fixture.rotationX = +value;\n } else if (rotation === 'y') {\n fixture.rotationY = +value;\n } else if (rotation === 'z') {\n fixture.rotationZ = +value;\n }\n }\n }\n}\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { PreviewService } from '../../../services/preview.service';\nimport { ProjectService } from '../../../services/project.service';\n\n@Component({\n selector: 'lib-app-fixture-settings-stage',\n templateUrl: './fixture-settings-stage.component.html',\n styleUrls: ['./fixture-settings-stage.component.css'],\n})\nexport class FixtureSettingsStageComponent implements OnInit {\n constructor(public projectService: ProjectService, public previewService: PreviewService, private changeDetectorRef: ChangeDetectorRef) {}\n\n ngOnInit() {}\n\n update() {\n this.previewService.updateStage();\n this.changeDetectorRef.detectChanges();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { FixtureService } from '../../services/fixture.service';\nimport { PresetService } from '../../services/preset.service';\n\n@Component({\n selector: 'lib-app-fixture-settings',\n templateUrl: './fixture-settings.component.html',\n styleUrls: ['./fixture-settings.component.css'],\n})\nexport class FixtureSettingsComponent implements OnInit {\n dmxChannels: number[] = [];\n\n constructor(private fixtureService: FixtureService, public presetService: PresetService) {\n for (let i = 0; i < 512; i++) {\n this.dmxChannels.push(0);\n }\n }\n\n ngOnInit() {}\n\n isChrome(): boolean {\n if (navigator.appVersion.indexOf('Chrome/') !== -1) {\n return true;\n }\n return false;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { Fixture } from '../models/fixture';\nimport { FixturePoolService } from '../services/fixture-pool.service';\nimport { FixtureService } from '../services/fixture.service';\nimport { IntroService } from '../services/intro.service';\nimport { PresetService } from '../services/preset.service';\nimport { ProjectService } from '../services/project.service';\n\n@Component({\n selector: 'lib-app-fixture',\n templateUrl: './fixture.component.html',\n styleUrls: ['./fixture.component.css'],\n})\nexport class FixtureComponent implements OnInit {\n constructor(\n public projectService: ProjectService,\n public presetService: PresetService,\n private fixturePoolService: FixturePoolService,\n public fixtureService: FixtureService,\n public introService: IntroService\n ) {}\n\n ngOnInit() {}\n\n fixtureIsSelected(fixture: Fixture): boolean {\n if (this.fixtureService.settingsSelection) {\n return this.fixtureService.settingsFixtureIsSelected(fixture);\n } else {\n return this.presetService.fixtureIsSelected(fixture);\n }\n }\n\n selectFixture(event: any, fixture: Fixture) {\n if (this.fixtureService.settingsSelection) {\n // select fixtures for the settings\n this.fixtureService.switchSettingsFixtureSelection(fixture);\n this.presetService.fixtureSelectionSettingsChanged.next();\n } else {\n // select fixtures for the current preset\n this.presetService.switchFixtureSelection(fixture);\n this.presetService.fixtureSelectionChanged.next();\n this.presetService.previewLive();\n }\n }\n\n selectAll() {\n this.presetService.selectAllFixtures();\n this.presetService.fixtureSelectionChanged.next();\n }\n\n selectNone() {\n this.presetService.selectNoFixtures();\n this.presetService.fixtureSelectionChanged.next();\n }\n\n openFixturePool() {\n this.fixturePoolService.open();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { IntroService } from '../services/intro.service';\n\n@Component({\n selector: 'lib-app-intro',\n templateUrl: './intro.component.html',\n styleUrls: ['./intro.component.css'],\n})\nexport class IntroComponent implements OnInit {\n constructor(public introService: IntroService) {}\n\n ngOnInit() {}\n\n close() {\n this.introService.setShowIntro(false);\n }\n}\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { PresetService } from '../services/preset.service';\nimport { ProjectService } from '../services/project.service';\n\n@Component({\n selector: 'lib-app-master-dimmer',\n templateUrl: './master-dimmer.component.html',\n styleUrls: ['./master-dimmer.component.css'],\n})\nexport class MasterDimmerComponent implements OnInit {\n constructor(public projectService: ProjectService, private changeDetectorRef: ChangeDetectorRef, private presetService: PresetService) {}\n\n ngOnInit() {}\n\n setValue(value: any) {\n if (isNaN(value)) {\n return;\n }\n\n if (value < 0 || value > 1) {\n return;\n }\n\n this.projectService.project.masterDimmerValue = value;\n this.changeDetectorRef.detectChanges();\n this.presetService.previewLive();\n }\n\n getValue(): number {\n return Math.round(this.projectService.project.masterDimmerValue * 100 * 100) / 100;\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Preset } from '../../models/preset';\n\n@Component({\n selector: 'lib-preset-settings',\n templateUrl: './preset-settings.component.html',\n styleUrls: ['./preset-settings.component.css'],\n})\nexport class PresetSettingsComponent implements OnInit {\n preset: Preset;\n\n name: string;\n startMillis: number;\n endMillis: number;\n fadeInMillis: number;\n fadeOutMillis: number;\n fadeInPre: boolean;\n fadeOutPost: boolean;\n\n constructor(public bsModalRef: BsModalRef) {}\n\n ngOnInit() {\n this.name = this.preset.name;\n this.startMillis = this.preset.startMillis;\n this.endMillis = this.preset.endMillis;\n this.fadeInMillis = this.preset.fadeInMillis;\n this.fadeOutMillis = this.preset.fadeOutMillis;\n this.fadeInPre = this.preset.fadeInPre;\n this.fadeOutPost = this.preset.fadeOutPost;\n }\n\n ok() {\n this.preset.name = this.name;\n\n if (this.startMillis === undefined || this.startMillis === null || (this.startMillis as any) === '') {\n this.preset.startMillis = undefined;\n } else if (!isNaN(this.startMillis) && this.startMillis >= 0) {\n this.preset.startMillis = +this.startMillis;\n }\n if (this.endMillis === undefined || this.endMillis === null || (this.endMillis as any) === '') {\n this.preset.endMillis = undefined;\n } else if (!isNaN(this.endMillis) && this.endMillis >= 0) {\n this.preset.endMillis = +this.endMillis;\n }\n if (!isNaN(this.fadeInMillis) && this.fadeInMillis >= 0) {\n this.preset.fadeInMillis = +this.fadeInMillis;\n }\n if (!isNaN(this.fadeOutMillis) && this.fadeOutMillis >= 0) {\n this.preset.fadeOutMillis = +this.fadeOutMillis;\n }\n\n this.preset.fadeInPre = this.fadeInPre;\n this.preset.fadeOutPost = this.fadeOutPost;\n\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Preset } from '../models/preset';\nimport { IntroService } from '../services/intro.service';\nimport { PresetService } from '../services/preset.service';\nimport { ProjectService } from '../services/project.service';\nimport { SceneService } from '../services/scene.service';\nimport { PresetSettingsComponent } from './preset-settings/preset-settings.component';\n\n@Component({\n selector: 'lib-app-preset',\n templateUrl: './preset.component.html',\n styleUrls: ['./preset.component.css'],\n})\nexport class PresetComponent implements OnInit {\n constructor(\n public presetService: PresetService,\n public sceneService: SceneService,\n public projectService: ProjectService,\n public introService: IntroService,\n private modalService: BsModalService\n ) {}\n\n ngOnInit() {}\n\n selectPreset(index: number) {\n this.projectService.project.previewPreset = true;\n this.presetService.selectPreset(index);\n }\n\n enableCheckbox(): boolean {\n return this.sceneService.selectedScenes && this.sceneService.selectedScenes.length === 1;\n }\n\n activatePreset(active: boolean, index: number) {\n if (this.sceneService.selectedScenes && this.sceneService.selectedScenes.length === 1) {\n const uuid = this.projectService.project.presets[index].uuid;\n\n if (active) {\n // Activate a new uuid\n this.sceneService.selectedScenes[0].presetUuids.push(uuid);\n } else {\n // Remove the uuid\n for (let i = 0; i < this.sceneService.selectedScenes[0].presetUuids.length; i++) {\n if (this.sceneService.selectedScenes[0].presetUuids[i] === uuid) {\n this.sceneService.selectedScenes[0].presetUuids.splice(i, 1);\n return;\n }\n }\n }\n }\n }\n\n addPreset() {\n this.presetService.addPreset();\n\n if (this.sceneService.selectedScenes && this.sceneService.selectedScenes.length === 1) {\n this.sceneService.selectedScenes[0].presetUuids.push(this.presetService.selectedPreset.uuid);\n }\n }\n\n removePreset() {\n if (!this.presetService.selectedPreset) {\n return;\n }\n\n this.projectService.project.presets.splice(this.projectService.project.presets.indexOf(this.presetService.selectedPreset), 1);\n this.presetService.selectPreset(0);\n }\n\n openSettings(preset: Preset) {\n const bsModalRef = this.modalService.show(PresetSettingsComponent, {\n keyboard: true,\n ignoreBackdropClick: false,\n class: '',\n initialState: { preset },\n });\n }\n}\n","import { Component, HostListener, OnInit } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Scene } from '../../models/scene';\n\n@Component({\n selector: 'lib-scene-settings',\n templateUrl: './scene-settings.component.html',\n styleUrls: ['./scene-settings.component.css'],\n})\nexport class SceneSettingsComponent implements OnInit {\n scene: Scene;\n\n name: string;\n fadeInMillis: number;\n fadeOutMillis: number;\n fadeInPre: boolean;\n fadeOutPost: boolean;\n\n constructor(public bsModalRef: BsModalRef) {}\n\n ngOnInit() {\n this.name = this.scene.name;\n this.fadeInMillis = this.scene.fadeInMillis;\n this.fadeOutMillis = this.scene.fadeOutMillis;\n this.fadeInPre = this.scene.fadeInPre;\n this.fadeOutPost = this.scene.fadeOutPost;\n }\n\n ok() {\n this.scene.name = this.name;\n\n if (!isNaN(this.fadeInMillis) && this.fadeInMillis >= 0) {\n this.scene.fadeInMillis = +this.fadeInMillis;\n }\n if (!isNaN(this.fadeOutMillis) && this.fadeOutMillis >= 0) {\n this.scene.fadeOutMillis = +this.fadeOutMillis;\n }\n\n this.scene.fadeInPre = this.fadeInPre;\n this.scene.fadeOutPost = this.fadeOutPost;\n\n this.bsModalRef.hide();\n }\n\n cancel() {\n this.bsModalRef.hide();\n }\n\n @HostListener('document:keydown.enter', ['$event'])\n handleKeyboardEvent(event: any) {\n this.ok();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Scene } from '../models/scene';\nimport { IntroService } from '../services/intro.service';\nimport { PresetService } from '../services/preset.service';\nimport { ProjectService } from '../services/project.service';\nimport { SceneService } from '../services/scene.service';\nimport { SceneSettingsComponent } from './scene-settings/scene-settings.component';\n\n@Component({\n selector: 'lib-app-scene',\n templateUrl: './scene.component.html',\n styleUrls: ['./scene.component.css'],\n})\nexport class SceneComponent implements OnInit {\n constructor(\n public sceneService: SceneService,\n public presetService: PresetService,\n public projectService: ProjectService,\n private modalService: BsModalService,\n public introService: IntroService\n ) {}\n\n ngOnInit() {}\n\n selectScene(event: any, index: number) {\n this.sceneService.selectScene(index);\n }\n\n removeScene() {\n if (this.sceneService.selectedScenes.length === 0) {\n return;\n }\n\n this.sceneService.removeScene(this.sceneService.selectedScenes[0]);\n }\n\n openSettings(scene: Scene) {\n const bsModalRef = this.modalService.show(SceneSettingsComponent, {\n keyboard: true,\n ignoreBackdropClick: false,\n class: '',\n initialState: { scene },\n });\n }\n}\n","import { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NgxBootstrapSliderModule } from 'ngx-bootstrap-slider';\nimport { AccordionModule } from 'ngx-bootstrap/accordion';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TypeaheadModule } from 'ngx-bootstrap/typeahead';\nimport { DropzoneModule } from 'ngx-dropzone-wrapper';\nimport { SortablejsModule } from 'ngx-sortablejs';\nimport { ToastrModule } from 'ngx-toastr';\nimport { ArraySortPipe } from './array-sort-pipe';\nimport { DesignerComponent } from './designer.component';\nimport { EffectCurveComponent } from './effect/effect-curve/effect-curve.component';\nimport { EffectPanTiltComponent } from './effect/effect-pan-tilt/effect-pan-tilt.component';\nimport { EffectComponent } from './effect/effect.component';\nimport { ErrorDialogComponent } from './error-dialog/error-dialog.component';\nimport { FixturePoolCreateFromFileComponent } from './fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component';\nimport { FixturePoolComponent } from './fixture-pool/fixture-pool.component';\nimport { FixtureCapabilityChannelComponent } from './fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component';\nimport { FixtureCapabilityColorWheelComponent } from './fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component';\nimport { FixtureCapabilityColorComponent } from './fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component';\nimport { FixtureCapabilityDimmerComponent } from './fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component';\nimport { FixtureCapabilityPanTiltComponent } from './fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component';\nimport { FixtureCapabilityComponent } from './fixture/fixture-capability/fixture-capability.component';\nimport { FixtureChannelComponent } from './fixture/fixture-channel/fixture-channel.component';\nimport { FixtureSettingsPositionComponent } from './fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component';\nimport { FixtureSettingsStageComponent } from './fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component';\nimport { FixtureSettingsComponent } from './fixture/fixture-settings/fixture-settings.component';\nimport { FixtureComponent } from './fixture/fixture.component';\nimport { IntroComponent } from './intro/intro.component';\nimport { MasterDimmerComponent } from './master-dimmer/master-dimmer.component';\nimport { PresetSettingsComponent } from './preset/preset-settings/preset-settings.component';\nimport { PresetComponent } from './preset/preset.component';\nimport { PreviewComponent } from './preview/preview.component';\nimport { ProjectBrowserComponent } from './project/project-browser/project-browser.component';\nimport { ProjectImportComponent } from './project/project-import/project-import.component';\nimport { ProjectSaveComponent } from './project/project-save/project-save.component';\nimport { ProjectShareComponent } from './project/project-share/project-share.component';\nimport { SceneSettingsComponent } from './scene/scene-settings/scene-settings.component';\nimport { SceneComponent } from './scene/scene.component';\nimport { CompositionSettingsComponent } from './timeline/composition-settings/composition-settings.component';\nimport { TimelineGridComponent } from './timeline/timeline-grid/timeline-grid.component';\nimport { TimelineComponent } from './timeline/timeline.component';\nimport { UserLoginComponent } from './user/user-login/user-login.component';\nimport { UserRegisterComponent } from './user/user-register/user-register.component';\nimport { WaitDialogComponent } from './wait-dialog/wait-dialog.component';\nimport { WarningDialogComponent } from './warning-dialog/warning-dialog.component';\n\n@NgModule({\n declarations: [\n DesignerComponent,\n WarningDialogComponent,\n PreviewComponent,\n EffectCurveComponent,\n EffectPanTiltComponent,\n SceneComponent,\n TimelineComponent,\n FixtureCapabilityColorComponent,\n FixtureComponent,\n FixtureSettingsPositionComponent,\n FixtureCapabilityComponent,\n FixtureSettingsComponent,\n EffectComponent,\n FixturePoolComponent,\n PresetComponent,\n MasterDimmerComponent,\n FixtureCapabilityDimmerComponent,\n TimelineGridComponent,\n CompositionSettingsComponent,\n ArraySortPipe,\n FixtureCapabilityPanTiltComponent,\n FixtureCapabilityChannelComponent,\n FixtureChannelComponent,\n FixtureCapabilityColorWheelComponent,\n UserLoginComponent,\n UserRegisterComponent,\n ProjectBrowserComponent,\n WaitDialogComponent,\n ProjectImportComponent,\n ProjectShareComponent,\n ErrorDialogComponent,\n FixtureSettingsStageComponent,\n IntroComponent,\n PresetSettingsComponent,\n SceneSettingsComponent,\n ProjectSaveComponent,\n FixturePoolCreateFromFileComponent,\n ],\n imports: [\n RouterModule.forRoot([]),\n BrowserModule,\n BrowserAnimationsModule,\n HttpClientModule,\n FormsModule,\n NgxBootstrapSliderModule,\n TranslateModule,\n AccordionModule,\n PopoverModule,\n TypeaheadModule,\n SortablejsModule,\n DropzoneModule,\n ToastrModule.forRoot({\n newestOnTop: true,\n }),\n ],\n exports: [DesignerComponent],\n})\nexport class DesignerModule {}\n"]}