@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
@@ -0,0 +1,209 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
+ import { BsModalService } from 'ngx-bootstrap/modal';
4
+ import { finalize, map } from 'rxjs/operators';
5
+ import { Preset } from '../models/preset';
6
+ import { Project } from '../models/project';
7
+ import { WaitDialogComponent } from '../wait-dialog/wait-dialog.component';
8
+ import { FixtureService } from './fixture.service';
9
+ import { PresetService } from './preset.service';
10
+ import { PreviewService } from './preview.service';
11
+ import { ProjectService } from './project.service';
12
+ import { SceneService } from './scene.service';
13
+ import { TimelineService } from './timeline.service';
14
+ import { UuidService } from './uuid.service';
15
+ import { PresetFixture } from '../models/preset-fixture';
16
+ import { WarningDialogService } from './warning-dialog.service';
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "./project.service";
19
+ import * as i2 from "./preview.service";
20
+ import * as i3 from "./fixture.service";
21
+ import * as i4 from "./preset.service";
22
+ import * as i5 from "./scene.service";
23
+ import * as i6 from "ngx-bootstrap/modal";
24
+ import * as i7 from "./uuid.service";
25
+ import * as i8 from "./timeline.service";
26
+ import * as i9 from "@angular/router";
27
+ import * as i10 from "./warning-dialog.service";
28
+ export class ProjectLoadService {
29
+ constructor(projectService, previewService, fixtureService, presetService, sceneService, modalService, uuidService, timelineService, router, activatedRoute, warningDialogService) {
30
+ this.projectService = projectService;
31
+ this.previewService = previewService;
32
+ this.fixtureService = fixtureService;
33
+ this.presetService = presetService;
34
+ this.sceneService = sceneService;
35
+ this.modalService = modalService;
36
+ this.uuidService = uuidService;
37
+ this.timelineService = timelineService;
38
+ this.router = router;
39
+ this.activatedRoute = activatedRoute;
40
+ this.warningDialogService = warningDialogService;
41
+ }
42
+ migrateToVersion2() {
43
+ for (let fixture of this.projectService.project.fixtures) {
44
+ const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
45
+ if (pixelKeys.length > 0) {
46
+ for (let pixelKey of pixelKeys) {
47
+ const projectFixture = new PresetFixture();
48
+ projectFixture.fixtureUuid = fixture.uuid;
49
+ projectFixture.pixelKey = pixelKey;
50
+ this.projectService.project.presetFixtures.push(projectFixture);
51
+ }
52
+ }
53
+ else {
54
+ const projectFixture = new PresetFixture();
55
+ projectFixture.fixtureUuid = fixture.uuid;
56
+ this.projectService.project.presetFixtures.push(projectFixture);
57
+ }
58
+ }
59
+ for (let preset of this.projectService.project.presets) {
60
+ for (let fixtureUuid of preset.fixtureUuids) {
61
+ const fixture = this.fixtureService.getFixtureByUuid(fixtureUuid);
62
+ const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
63
+ if (pixelKeys.length > 0) {
64
+ for (let pixelKey of pixelKeys) {
65
+ const presetFixture = new PresetFixture();
66
+ presetFixture.fixtureUuid = fixtureUuid;
67
+ presetFixture.pixelKey = pixelKey;
68
+ preset.fixtures.push(presetFixture);
69
+ }
70
+ }
71
+ else {
72
+ const presetFixture = new PresetFixture();
73
+ presetFixture.fixtureUuid = fixtureUuid;
74
+ preset.fixtures.push(presetFixture);
75
+ }
76
+ }
77
+ }
78
+ this.projectService.project.version = 2;
79
+ }
80
+ migrateFromOldProject() {
81
+ let migrated = false;
82
+ if (!this.projectService.project.version) {
83
+ // Migrate from version 1
84
+ this.migrateToVersion2();
85
+ migrated = true;
86
+ }
87
+ if (migrated) {
88
+ this.warningDialogService.show('designer.project.migrated').subscribe();
89
+ }
90
+ }
91
+ afterLoad() {
92
+ this.migrateFromOldProject();
93
+ this.fixtureService.updateCachedFixtures();
94
+ this.presetService.removeDeletedFixtures();
95
+ this.previewService.updateFixtureSetup();
96
+ this.presetService.fixtureSelectionChanged.next();
97
+ this.presetService.autoOpenFirstEffect();
98
+ this.previewService.updateStage();
99
+ this.presetService.previewLive();
100
+ this.sceneService.selectPresetFromSelectedScene();
101
+ }
102
+ selectScenesPresetComposition() {
103
+ this.presetService.selectedPreset = this.presetService.getPresetByUuid(this.projectService.project.selectedPresetUuid);
104
+ this.sceneService.selectedScenes = [];
105
+ if (this.projectService.project.selectedSceneUuids) {
106
+ for (const uuid of this.projectService.project.selectedSceneUuids) {
107
+ this.sceneService.selectedScenes.push(this.sceneService.getSceneByUuid(uuid));
108
+ }
109
+ }
110
+ this.timelineService.selectedComposition = undefined;
111
+ this.timelineService.selectedCompositionIndex = undefined;
112
+ this.timelineService.destroyWaveSurfer();
113
+ for (let i = 0; i < this.projectService.project.compositions.length; i++) {
114
+ if (this.projectService.project.compositions[i].uuid === this.projectService.project.selectedCompositionUuid) {
115
+ this.timelineService.selectCompositionIndex(i);
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ load(id, name, shareToken) {
121
+ const ref = this.modalService.show(WaitDialogComponent, { keyboard: false, ignoreBackdropClick: true });
122
+ return this.projectService.getProject(id, name, shareToken).pipe(map((project) => {
123
+ if (project.version > this.projectService.currentProjectVersion) {
124
+ throw new Error('The project version ' +
125
+ project.version +
126
+ ' is created with a newer version of the designer. Please update your Rocket Show version to open this project.');
127
+ }
128
+ this.projectService.project = project;
129
+ this.selectScenesPresetComposition();
130
+ this.afterLoad();
131
+ const queryParams = {
132
+ id,
133
+ token: project.shareToken,
134
+ };
135
+ this.router.navigate([], {
136
+ relativeTo: this.activatedRoute,
137
+ queryParams,
138
+ queryParamsHandling: 'merge', // remove to replace all query params by provided
139
+ });
140
+ }), finalize(() => {
141
+ // hide the modal again because of:
142
+ // https://github.com/valor-software/ngx-bootstrap/issues/3711
143
+ setTimeout(() => {
144
+ ref.hide();
145
+ }, 250);
146
+ setTimeout(() => {
147
+ ref.hide();
148
+ }, 500);
149
+ setTimeout(() => {
150
+ ref.hide();
151
+ }, 1500);
152
+ }));
153
+ }
154
+ new() {
155
+ // create an empty new project
156
+ const project = new Project();
157
+ project.uuid = this.uuidService.getUuid();
158
+ project.version = this.projectService.currentProjectVersion;
159
+ this.projectService.project = project;
160
+ this.projectService.project.shareToken = this.uuidService.getUuid();
161
+ // Add a default scene and preset
162
+ const preset = new Preset();
163
+ preset.uuid = this.uuidService.getUuid();
164
+ preset.name = 'New Preset';
165
+ this.projectService.project.presets.push(preset);
166
+ this.presetService.selectPreset(0);
167
+ this.sceneService.addScene();
168
+ this.projectService.project.scenes[0].presetUuids.push(preset.uuid);
169
+ this.projectService.project.previewPreset = true;
170
+ this.sceneService.selectedScenes = [this.projectService.project.scenes[0]];
171
+ this.presetService.selectedPreset = this.projectService.project.presets[0];
172
+ this.timelineService.selectedComposition = undefined;
173
+ this.timelineService.selectedCompositionIndex = undefined;
174
+ this.timelineService.destroyWaveSurfer();
175
+ this.afterLoad();
176
+ const queryParams = {
177
+ id: '',
178
+ token: '',
179
+ };
180
+ this.router.navigate([], {
181
+ relativeTo: this.activatedRoute,
182
+ queryParams,
183
+ queryParamsHandling: 'merge', // remove to replace all query params by provided
184
+ });
185
+ }
186
+ template() {
187
+ // load the template project with id 1
188
+ this.load(1, null).subscribe(() => {
189
+ this.projectService.project.id = undefined;
190
+ });
191
+ }
192
+ import(data) {
193
+ // import a project from a string
194
+ const project = new Project(JSON.parse(data));
195
+ project.id = undefined;
196
+ this.projectService.project = project;
197
+ this.selectScenesPresetComposition();
198
+ this.afterLoad();
199
+ }
200
+ static { this.ɵfac = function ProjectLoadService_Factory(t) { return new (t || ProjectLoadService)(i0.ɵɵinject(i1.ProjectService), i0.ɵɵinject(i2.PreviewService), i0.ɵɵinject(i3.FixtureService), i0.ɵɵinject(i4.PresetService), i0.ɵɵinject(i5.SceneService), i0.ɵɵinject(i6.BsModalService), i0.ɵɵinject(i7.UuidService), i0.ɵɵinject(i8.TimelineService), i0.ɵɵinject(i9.Router), i0.ɵɵinject(i9.ActivatedRoute), i0.ɵɵinject(i10.WarningDialogService)); }; }
201
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ProjectLoadService, factory: ProjectLoadService.ɵfac, providedIn: 'root' }); }
202
+ }
203
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProjectLoadService, [{
204
+ type: Injectable,
205
+ args: [{
206
+ providedIn: 'root',
207
+ }]
208
+ }], () => [{ type: i1.ProjectService }, { type: i2.PreviewService }, { type: i3.FixtureService }, { type: i4.PresetService }, { type: i5.SceneService }, { type: i6.BsModalService }, { type: i7.UuidService }, { type: i8.TimelineService }, { type: i9.Router }, { type: i9.ActivatedRoute }, { type: i10.WarningDialogService }], null); })();
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1sb2FkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3NlcnZpY2VzL3Byb2plY3QtbG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBVSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQUtoRSxN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Q0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7bUZBbE1VLGtCQUFrQjt1RUFBbEIsa0JBQWtCLFdBQWxCLGtCQUFrQixtQkFGakIsTUFBTTs7aUZBRVAsa0JBQWtCO2NBSDlCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByZXNldCB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQnO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uL21vZGVscy9wcm9qZWN0JztcbmltcG9ydCB7IFdhaXREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi93YWl0LWRpYWxvZy93YWl0LWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRml4dHVyZVNlcnZpY2UgfSBmcm9tICcuL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi9wcmVzZXQuc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3U2VydmljZSB9IGZyb20gJy4vcHJldmlldy5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NlbmVTZXJ2aWNlIH0gZnJvbSAnLi9zY2VuZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRpbWVsaW5lU2VydmljZSB9IGZyb20gJy4vdGltZWxpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkU2VydmljZSB9IGZyb20gJy4vdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNldEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LWZpeHR1cmUnO1xuaW1wb3J0IHsgV2FybmluZ0RpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3dhcm5pbmctZGlhbG9nLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdExvYWRTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmV2aWV3U2VydmljZTogUHJldmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2NlbmVTZXJ2aWNlOiBTY2VuZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGltZWxpbmVTZXJ2aWNlOiBUaW1lbGluZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHdhcm5pbmdEaWFsb2dTZXJ2aWNlOiBXYXJuaW5nRGlhbG9nU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBtaWdyYXRlVG9WZXJzaW9uMigpIHtcbiAgICBmb3IgKGxldCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgY29uc3QgcGl4ZWxLZXlzID0gdGhpcy5maXh0dXJlU2VydmljZS5maXh0dXJlR2V0VW5pcXVlUGl4ZWxLZXlzKGZpeHR1cmUpO1xuICAgICAgaWYgKHBpeGVsS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IHBpeGVsS2V5IG9mIHBpeGVsS2V5cykge1xuICAgICAgICAgIGNvbnN0IHByb2plY3RGaXh0dXJlID0gbmV3IFByZXNldEZpeHR1cmUoKTtcbiAgICAgICAgICBwcm9qZWN0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgICBwcm9qZWN0Rml4dHVyZS5waXhlbEtleSA9IHBpeGVsS2V5O1xuICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5wdXNoKHByb2plY3RGaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvamVjdEZpeHR1cmUgPSBuZXcgUHJlc2V0Rml4dHVyZSgpO1xuICAgICAgICBwcm9qZWN0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzLnB1c2gocHJvamVjdEZpeHR1cmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBwcmVzZXQgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMpIHtcbiAgICAgIGZvciAobGV0IGZpeHR1cmVVdWlkIG9mIHByZXNldC5maXh0dXJlVXVpZHMpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUJ5VXVpZChmaXh0dXJlVXVpZCk7XG4gICAgICAgIGNvbnN0IHBpeGVsS2V5cyA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZml4dHVyZUdldFVuaXF1ZVBpeGVsS2V5cyhmaXh0dXJlKTtcbiAgICAgICAgaWYgKHBpeGVsS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgcGl4ZWxLZXkgb2YgcGl4ZWxLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVzZXRGaXh0dXJlID0gbmV3IFByZXNldEZpeHR1cmUoKTtcbiAgICAgICAgICAgIHByZXNldEZpeHR1cmUuZml4dHVyZVV1aWQgPSBmaXh0dXJlVXVpZDtcbiAgICAgICAgICAgIHByZXNldEZpeHR1cmUucGl4ZWxLZXkgPSBwaXhlbEtleTtcbiAgICAgICAgICAgIHByZXNldC5maXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwcmVzZXRGaXh0dXJlID0gbmV3IFByZXNldEZpeHR1cmUoKTtcbiAgICAgICAgICBwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gZml4dHVyZVV1aWQ7XG4gICAgICAgICAgcHJlc2V0LmZpeHR1cmVzLnB1c2gocHJlc2V0Rml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnZlcnNpb24gPSAyO1xuICB9XG5cbiAgcHJpdmF0ZSBtaWdyYXRlRnJvbU9sZFByb2plY3QoKSB7XG4gICAgbGV0IG1pZ3JhdGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC52ZXJzaW9uKSB7XG4gICAgICAvLyBNaWdyYXRlIGZyb20gdmVyc2lvbiAxXG4gICAgICB0aGlzLm1pZ3JhdGVUb1ZlcnNpb24yKCk7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkKSB7XG4gICAgICB0aGlzLndhcm5pbmdEaWFsb2dTZXJ2aWNlLnNob3coJ2Rlc2lnbmVyLnByb2plY3QubWlncmF0ZWQnKS5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFmdGVyTG9hZCgpIHtcbiAgICB0aGlzLm1pZ3JhdGVGcm9tT2xkUHJvamVjdCgpO1xuICAgIHRoaXMuZml4dHVyZVNlcnZpY2UudXBkYXRlQ2FjaGVkRml4dHVyZXMoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucmVtb3ZlRGVsZXRlZEZpeHR1cmVzKCk7XG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS51cGRhdGVGaXh0dXJlU2V0dXAoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UuZml4dHVyZVNlbGVjdGlvbkNoYW5nZWQubmV4dCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5hdXRvT3BlbkZpcnN0RWZmZWN0KCk7XG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS51cGRhdGVTdGFnZSgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICAgIHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdFByZXNldEZyb21TZWxlY3RlZFNjZW5lKCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdFNjZW5lc1ByZXNldENvbXBvc2l0aW9uKCkge1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RlZFByZXNldCA9IHRoaXMucHJlc2V0U2VydmljZS5nZXRQcmVzZXRCeVV1aWQodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNlbGVjdGVkUHJlc2V0VXVpZCk7XG4gICAgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNlbGVjdGVkU2NlbmVVdWlkcykge1xuICAgICAgZm9yIChjb25zdCB1dWlkIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zZWxlY3RlZFNjZW5lVXVpZHMpIHtcbiAgICAgICAgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMucHVzaCh0aGlzLnNjZW5lU2VydmljZS5nZXRTY2VuZUJ5VXVpZCh1dWlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGltZWxpbmVTZXJ2aWNlLnNlbGVjdGVkQ29tcG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50aW1lbGluZVNlcnZpY2Uuc2VsZWN0ZWRDb21wb3NpdGlvbkluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGltZWxpbmVTZXJ2aWNlLmRlc3Ryb3lXYXZlU3VyZmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuY29tcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmNvbXBvc2l0aW9uc1tpXS51dWlkID09PSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2VsZWN0ZWRDb21wb3NpdGlvblV1aWQpIHtcbiAgICAgICAgdGhpcy50aW1lbGluZVNlcnZpY2Uuc2VsZWN0Q29tcG9zaXRpb25JbmRleChpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIHNoYXJlVG9rZW4/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCByZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KFdhaXREaWFsb2dDb21wb25lbnQsIHsga2V5Ym9hcmQ6IGZhbHNlLCBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFNlcnZpY2UuZ2V0UHJvamVjdChpZCwgbmFtZSwgc2hhcmVUb2tlbikucGlwZShcbiAgICAgIG1hcCgocHJvamVjdCkgPT4ge1xuICAgICAgICBpZiAocHJvamVjdC52ZXJzaW9uID4gdGhpcy5wcm9qZWN0U2VydmljZS5jdXJyZW50UHJvamVjdFZlcnNpb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIHByb2plY3QgdmVyc2lvbiAnICtcbiAgICAgICAgICAgICAgcHJvamVjdC52ZXJzaW9uICtcbiAgICAgICAgICAgICAgJyBpcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBkZXNpZ25lci4gUGxlYXNlIHVwZGF0ZSB5b3VyIFJvY2tldCBTaG93IHZlcnNpb24gdG8gb3BlbiB0aGlzIHByb2plY3QuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5zZWxlY3RTY2VuZXNQcmVzZXRDb21wb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmFmdGVyTG9hZCgpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdG9rZW46IHByb2plY3Quc2hhcmVUb2tlbixcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsIC8vIHJlbW92ZSB0byByZXBsYWNlIGFsbCBxdWVyeSBwYXJhbXMgYnkgcHJvdmlkZWRcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgLy8gaGlkZSB0aGUgbW9kYWwgYWdhaW4gYmVjYXVzZSBvZjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZhbG9yLXNvZnR3YXJlL25neC1ib290c3RyYXAvaXNzdWVzLzM3MTFcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVmLmhpZGUoKTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVmLmhpZGUoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVmLmhpZGUoKTtcbiAgICAgICAgfSwgMTUwMCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZXcoKSB7XG4gICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5ldyBwcm9qZWN0XG4gICAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7XG4gICAgcHJvamVjdC51dWlkID0gdGhpcy51dWlkU2VydmljZS5nZXRVdWlkKCk7XG4gICAgcHJvamVjdC52ZXJzaW9uID0gdGhpcy5wcm9qZWN0U2VydmljZS5jdXJyZW50UHJvamVjdFZlcnNpb247XG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2hhcmVUb2tlbiA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuXG4gICAgLy8gQWRkIGEgZGVmYXVsdCBzY2VuZSBhbmQgcHJlc2V0XG4gICAgY29uc3QgcHJlc2V0ID0gbmV3IFByZXNldCgpO1xuICAgIHByZXNldC51dWlkID0gdGhpcy51dWlkU2VydmljZS5nZXRVdWlkKCk7XG4gICAgcHJlc2V0Lm5hbWUgPSAnTmV3IFByZXNldCc7XG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMucHVzaChwcmVzZXQpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RQcmVzZXQoMCk7XG5cbiAgICB0aGlzLnNjZW5lU2VydmljZS5hZGRTY2VuZSgpO1xuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbMF0ucHJlc2V0VXVpZHMucHVzaChwcmVzZXQudXVpZCk7XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJldmlld1ByZXNldCA9IHRydWU7XG5cbiAgICB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lcyA9IFt0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzWzBdXTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0c1swXTtcblxuICAgIHRoaXMudGltZWxpbmVTZXJ2aWNlLnNlbGVjdGVkQ29tcG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50aW1lbGluZVNlcnZpY2Uuc2VsZWN0ZWRDb21wb3NpdGlvbkluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGltZWxpbmVTZXJ2aWNlLmRlc3Ryb3lXYXZlU3VyZmVyKCk7XG5cbiAgICB0aGlzLmFmdGVyTG9hZCgpO1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHtcbiAgICAgIGlkOiAnJyxcbiAgICAgIHRva2VuOiAnJyxcbiAgICB9O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLCAvLyByZW1vdmUgdG8gcmVwbGFjZSBhbGwgcXVlcnkgcGFyYW1zIGJ5IHByb3ZpZGVkXG4gICAgfSk7XG4gIH1cblxuICB0ZW1wbGF0ZSgpIHtcbiAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSBwcm9qZWN0IHdpdGggaWQgMVxuICAgIHRoaXMubG9hZCgxLCBudWxsKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmlkID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgaW1wb3J0KGRhdGE6IHN0cmluZykge1xuICAgIC8vIGltcG9ydCBhIHByb2plY3QgZnJvbSBhIHN0cmluZ1xuICAgIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdChKU09OLnBhcnNlKGRhdGEpKTtcbiAgICBwcm9qZWN0LmlkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdCA9IHByb2plY3Q7XG5cbiAgICB0aGlzLnNlbGVjdFNjZW5lc1ByZXNldENvbXBvc2l0aW9uKCk7XG4gICAgdGhpcy5hZnRlckxvYWQoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,93 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { ActivatedRoute, Router } from '@angular/router';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { ToastrService } from 'ngx-toastr';
6
+ import { map } from 'rxjs/operators';
7
+ import { Project } from '../models/project';
8
+ import { UserService } from './user.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common/http";
11
+ import * as i2 from "./user.service";
12
+ import * as i3 from "@angular/router";
13
+ import * as i4 from "@ngx-translate/core";
14
+ import * as i5 from "ngx-toastr";
15
+ export class ProjectService {
16
+ constructor(http, userService, router, activatedRoute, translateService, toastrService) {
17
+ this.http = http;
18
+ this.userService = userService;
19
+ this.router = router;
20
+ this.activatedRoute = activatedRoute;
21
+ this.translateService = translateService;
22
+ this.toastrService = toastrService;
23
+ // the project-file versions used in this version of the designer (older ones will be migrated, newer ones are not supported)
24
+ this.currentProjectVersion = 2;
25
+ }
26
+ saveApi(project) {
27
+ return this.http.post('project', JSON.stringify(project), { headers: this.userService.getHeaders() }).pipe(map((response) => {
28
+ if (response) {
29
+ project.id = response.id;
30
+ if (response.shareToken) {
31
+ project.shareToken = response.shareToken;
32
+ }
33
+ const queryParams = {
34
+ id: project.id,
35
+ token: project.shareToken,
36
+ };
37
+ this.router.navigate([], {
38
+ relativeTo: this.activatedRoute,
39
+ queryParams,
40
+ queryParamsHandling: 'merge', // remove to replace all query params by provided
41
+ });
42
+ }
43
+ return null;
44
+ }));
45
+ }
46
+ save(project) {
47
+ // tries to save the project and returns, whether it has been saved or not
48
+ this.saveApi(project).subscribe(() => {
49
+ const msg = 'designer.project.save-success';
50
+ const title = 'designer.project.save-success-title';
51
+ this.translateService.get([msg, title]).subscribe((result) => {
52
+ this.toastrService.success(result[msg], result[title]);
53
+ });
54
+ this.userService.setAutoLoadProject(project);
55
+ }, (response) => {
56
+ const msg = 'designer.project.save-error';
57
+ const title = 'designer.project.save-error-title';
58
+ const error = response && response.error ? response.error.error : 'unknown';
59
+ this.translateService.get([msg, title]).subscribe((result) => {
60
+ this.toastrService.error(result[msg] + ' (' + error + ')', result[title]);
61
+ });
62
+ });
63
+ }
64
+ getAllProjects() {
65
+ return this.http.get('projects', { headers: this.userService.getHeaders() }).pipe(map((response) => {
66
+ const projects = [];
67
+ for (const project of response) {
68
+ const projectObject = new Project(project);
69
+ projects.push(projectObject);
70
+ }
71
+ return projects;
72
+ }));
73
+ }
74
+ deleteProject(project) {
75
+ return this.http.delete('project?id=' + project.id + '&name=' + project.name, { headers: this.userService.getHeaders() });
76
+ }
77
+ getProject(id, name, shareToken) {
78
+ return this.http.get('project?id=' + id + '&name=' + name + '&token=' + shareToken, { headers: this.userService.getHeaders() }).pipe(map((response) => {
79
+ const project = new Project(response);
80
+ project.id = id;
81
+ return project;
82
+ }));
83
+ }
84
+ static { this.ɵfac = function ProjectService_Factory(t) { return new (t || ProjectService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.UserService), i0.ɵɵinject(i3.Router), i0.ɵɵinject(i3.ActivatedRoute), i0.ɵɵinject(i4.TranslateService), i0.ɵɵinject(i5.ToastrService)); }; }
85
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ProjectService, factory: ProjectService.ɵfac, providedIn: 'root' }); }
86
+ }
87
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProjectService, [{
88
+ type: Injectable,
89
+ args: [{
90
+ providedIn: 'root',
91
+ }]
92
+ }], () => [{ type: i1.HttpClient }, { type: i2.UserService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.TranslateService }, { type: i5.ToastrService }], null); })();
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBVSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBSzdDLE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQ1UsSUFBZ0IsRUFDaEIsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxhQUE0QjtRQUw1QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQVR0Qyw2SEFBNkg7UUFDdEgsMEJBQXFCLEdBQUcsQ0FBQyxDQUFDO0lBUzlCLENBQUM7SUFFSSxPQUFPLENBQUMsT0FBZ0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hHLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3BCLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUMzQyxDQUFDO2dCQUNELE1BQU0sV0FBVyxHQUFXO29CQUMxQixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ2QsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVO2lCQUMxQixDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtvQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUMvQixXQUFXO29CQUNYLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxpREFBaUQ7aUJBQ2hGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWdCO1FBQ25CLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDN0IsR0FBRyxFQUFFO1lBQ0gsTUFBTSxHQUFHLEdBQUcsK0JBQStCLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcscUNBQXFDLENBQUM7WUFFcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLENBQUMsRUFDRCxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ1gsTUFBTSxHQUFHLEdBQUcsNkJBQTZCLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsbUNBQW1DLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMvRSxHQUFHLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUNwQixNQUFNLFFBQVEsR0FBYyxFQUFFLENBQUM7WUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWdCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFVLEVBQUUsSUFBWSxFQUFFLFVBQW1CO1FBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRyxRQUFRLEdBQUcsSUFBSSxHQUFHLFNBQVMsR0FBRyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNsSSxHQUFHLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUVoQixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzsrRUExRlUsY0FBYzt1RUFBZCxjQUFjLFdBQWQsY0FBYyxtQkFGYixNQUFNOztpRkFFUCxjQUFjO2NBSDFCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uL21vZGVscy9wcm9qZWN0JztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdFNlcnZpY2Uge1xuICAvLyB0aGUgY3VycmVudCBwcm9qZWN0XG4gIHB1YmxpYyBwcm9qZWN0OiBQcm9qZWN0O1xuXG4gIC8vIHRoZSBwcm9qZWN0LWZpbGUgdmVyc2lvbnMgdXNlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIGRlc2lnbmVyIChvbGRlciBvbmVzIHdpbGwgYmUgbWlncmF0ZWQsIG5ld2VyIG9uZXMgYXJlIG5vdCBzdXBwb3J0ZWQpXG4gIHB1YmxpYyBjdXJyZW50UHJvamVjdFZlcnNpb24gPSAyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgc2F2ZUFwaShwcm9qZWN0OiBQcm9qZWN0KTogT2JzZXJ2YWJsZTxvYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoJ3Byb2plY3QnLCBKU09OLnN0cmluZ2lmeShwcm9qZWN0KSwgeyBoZWFkZXJzOiB0aGlzLnVzZXJTZXJ2aWNlLmdldEhlYWRlcnMoKSB9KS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIHByb2plY3QuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc2hhcmVUb2tlbikge1xuICAgICAgICAgICAgcHJvamVjdC5zaGFyZVRva2VuID0gcmVzcG9uc2Uuc2hhcmVUb2tlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGlkOiBwcm9qZWN0LmlkLFxuICAgICAgICAgICAgdG9rZW46IHByb2plY3Quc2hhcmVUb2tlbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLCAvLyByZW1vdmUgdG8gcmVwbGFjZSBhbGwgcXVlcnkgcGFyYW1zIGJ5IHByb3ZpZGVkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzYXZlKHByb2plY3Q6IFByb2plY3QpIHtcbiAgICAvLyB0cmllcyB0byBzYXZlIHRoZSBwcm9qZWN0IGFuZCByZXR1cm5zLCB3aGV0aGVyIGl0IGhhcyBiZWVuIHNhdmVkIG9yIG5vdFxuICAgIHRoaXMuc2F2ZUFwaShwcm9qZWN0KS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICdkZXNpZ25lci5wcm9qZWN0LnNhdmUtc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gJ2Rlc2lnbmVyLnByb2plY3Quc2F2ZS1zdWNjZXNzLXRpdGxlJztcblxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc3VjY2VzcyhyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2Uuc2V0QXV0b0xvYWRQcm9qZWN0KHByb2plY3QpO1xuICAgICAgfSxcbiAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIucHJvamVjdC5zYXZlLWVycm9yJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIucHJvamVjdC5zYXZlLWVycm9yLXRpdGxlJztcbiAgICAgICAgY29uc3QgZXJyb3IgPSByZXNwb25zZSAmJiByZXNwb25zZS5lcnJvciA/IHJlc3BvbnNlLmVycm9yLmVycm9yIDogJ3Vua25vd24nO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSArICcgKCcgKyBlcnJvciArICcpJywgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRBbGxQcm9qZWN0cygpOiBPYnNlcnZhYmxlPFByb2plY3RbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KCdwcm9qZWN0cycsIHsgaGVhZGVyczogdGhpcy51c2VyU2VydmljZS5nZXRIZWFkZXJzKCkgfSkucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0czogUHJvamVjdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiByZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IHByb2plY3RPYmplY3QgPSBuZXcgUHJvamVjdChwcm9qZWN0KTtcbiAgICAgICAgICBwcm9qZWN0cy5wdXNoKHByb2plY3RPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9qZWN0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZVByb2plY3QocHJvamVjdDogUHJvamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoJ3Byb2plY3Q/aWQ9JyArIHByb2plY3QuaWQgKyAnJm5hbWU9JyArIHByb2plY3QubmFtZSwgeyBoZWFkZXJzOiB0aGlzLnVzZXJTZXJ2aWNlLmdldEhlYWRlcnMoKSB9KTtcbiAgfVxuXG4gIGdldFByb2plY3QoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBzaGFyZVRva2VuPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcm9qZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ3Byb2plY3Q/aWQ9JyArIGlkICsgJyZuYW1lPScgKyBuYW1lICsgJyZ0b2tlbj0nICsgc2hhcmVUb2tlbiwgeyBoZWFkZXJzOiB0aGlzLnVzZXJTZXJ2aWNlLmdldEhlYWRlcnMoKSB9KS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdChyZXNwb25zZSk7XG4gICAgICAgIHByb2plY3QuaWQgPSBpZDtcblxuICAgICAgICByZXR1cm4gcHJvamVjdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,164 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { Scene } from '../models/scene';
4
+ import { EffectService } from './effect.service';
5
+ import { PresetService } from './preset.service';
6
+ import { ProjectService } from './project.service';
7
+ import { UuidService } from './uuid.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./uuid.service";
10
+ import * as i2 from "./effect.service";
11
+ import * as i3 from "./preset.service";
12
+ import * as i4 from "./project.service";
13
+ export class SceneService {
14
+ constructor(uuidService, effectService, presetService, projectService) {
15
+ this.uuidService = uuidService;
16
+ this.effectService = effectService;
17
+ this.presetService = presetService;
18
+ this.projectService = projectService;
19
+ this.selectedScenes = [];
20
+ this.sceneColors = ['#945fda', '#61da5f', '#5fc3da', '#dad65f', '#da5f5f', '#246db7'];
21
+ this.multipleSelection = false;
22
+ this.sceneDeleted = new Subject();
23
+ this.sceneSelected = new Subject();
24
+ }
25
+ sceneIsSelected(scene) {
26
+ for (const selectedScene of this.selectedScenes) {
27
+ if (selectedScene.uuid === scene.uuid) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ presetIsSelected(preset) {
34
+ if (!this.selectedScenes || this.selectedScenes.length !== 1) {
35
+ return false;
36
+ }
37
+ for (const uuid of this.selectedScenes[0].presetUuids) {
38
+ if (preset.uuid === uuid) {
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ }
44
+ switchSceneSelection(scene) {
45
+ // Select a scene if not yet selected or unselect it otherwise
46
+ if (this.sceneIsSelected(scene)) {
47
+ for (let i = 0; i < this.selectedScenes.length; i++) {
48
+ if (this.selectedScenes[i].uuid === scene.uuid) {
49
+ this.selectedScenes.splice(i, 1);
50
+ return;
51
+ }
52
+ }
53
+ }
54
+ else {
55
+ this.selectedScenes.push(scene);
56
+ }
57
+ this.sceneSelected.next();
58
+ }
59
+ selectPresetFromSelectedScene() {
60
+ // select the first preset of the scene, if no preset of the current scene is already
61
+ // selected to make sure, the user does not edit a preset which is not even
62
+ // active in the current scene (and sees no change).
63
+ let firstPresetUuid;
64
+ // check, whether a preset of the current scene is already selected and do nothing
65
+ // in this case
66
+ for (const scene of this.selectedScenes) {
67
+ for (const presetUuid of scene.presetUuids) {
68
+ firstPresetUuid = presetUuid;
69
+ if (presetUuid === this.presetService.selectedPreset.uuid) {
70
+ // a preset of a currently selected scene is already selected -> do nothing
71
+ return;
72
+ }
73
+ }
74
+ }
75
+ if (!firstPresetUuid) {
76
+ return;
77
+ }
78
+ for (let i = 0; i < this.projectService.project.presets.length; i++) {
79
+ if (this.projectService.project.presets[i].uuid === firstPresetUuid) {
80
+ this.presetService.selectPreset(i);
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ selectScene(index) {
86
+ this.effectService.selectedEffect = undefined;
87
+ if (index >= this.projectService.project.scenes.length) {
88
+ this.selectedScenes = [];
89
+ }
90
+ else {
91
+ if (this.multipleSelection) {
92
+ this.switchSceneSelection(this.projectService.project.scenes[index]);
93
+ }
94
+ else {
95
+ this.selectedScenes = [];
96
+ this.selectedScenes.push(this.projectService.project.scenes[index]);
97
+ }
98
+ }
99
+ this.selectPresetFromSelectedScene();
100
+ // preview the complete scene
101
+ this.projectService.project.previewPreset = false;
102
+ this.projectService.project.selectedSceneUuids = [];
103
+ for (const scene of this.selectedScenes) {
104
+ this.projectService.project.selectedSceneUuids.push(scene.uuid);
105
+ }
106
+ this.presetService.previewSelectionChanged.next();
107
+ this.presetService.previewLive();
108
+ this.sceneSelected.next();
109
+ }
110
+ addScene(name) {
111
+ const scene = new Scene();
112
+ scene.uuid = this.uuidService.getUuid();
113
+ scene.name = name || 'New Scene';
114
+ if (this.projectService.project.scenes.length < this.sceneColors.length) {
115
+ scene.color = this.sceneColors[this.projectService.project.scenes.length];
116
+ }
117
+ else {
118
+ scene.color = '#' + Math.random().toString(16).slice(2, 8).toUpperCase();
119
+ }
120
+ // Insert the new scene before the highest currently selected scene
121
+ let highestSelectedSceneIndex = 0;
122
+ for (let i = 0; i < this.projectService.project.scenes.length; i++) {
123
+ if (this.sceneIsSelected(this.projectService.project.scenes[i])) {
124
+ highestSelectedSceneIndex = i;
125
+ break;
126
+ }
127
+ }
128
+ this.projectService.project.scenes.splice(highestSelectedSceneIndex, 0, scene);
129
+ this.selectScene(highestSelectedSceneIndex);
130
+ }
131
+ removeScene(scene) {
132
+ // remove all playback regions
133
+ for (const composition of this.projectService.project.compositions) {
134
+ for (let i = composition.scenePlaybackRegions.length - 1; i >= 0; i--) {
135
+ const compositionPlaybackRegion = composition.scenePlaybackRegions[i];
136
+ if (compositionPlaybackRegion.sceneUuid === scene.uuid) {
137
+ composition.scenePlaybackRegions.splice(i, 1);
138
+ }
139
+ }
140
+ }
141
+ // remove the scene
142
+ this.projectService.project.scenes.splice(this.projectService.project.scenes.indexOf(scene), 1);
143
+ if (this.projectService.project.scenes.length > 0) {
144
+ this.selectScene(0);
145
+ }
146
+ this.sceneDeleted.next();
147
+ }
148
+ getSceneByUuid(uuid) {
149
+ for (const scene of this.projectService.project.scenes) {
150
+ if (scene.uuid === uuid) {
151
+ return scene;
152
+ }
153
+ }
154
+ }
155
+ static { this.ɵfac = function SceneService_Factory(t) { return new (t || SceneService)(i0.ɵɵinject(i1.UuidService), i0.ɵɵinject(i2.EffectService), i0.ɵɵinject(i3.PresetService), i0.ɵɵinject(i4.ProjectService)); }; }
156
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SceneService, factory: SceneService.ɵfac, providedIn: 'root' }); }
157
+ }
158
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SceneService, [{
159
+ type: Injectable,
160
+ args: [{
161
+ providedIn: 'root',
162
+ }]
163
+ }], () => [{ type: i1.UuidService }, { type: i2.EffectService }, { type: i3.PresetService }, { type: i4.ProjectService }], null); })();
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvc2VydmljZXMvc2NlbmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBSzdDLE1BQU0sT0FBTyxZQUFZO0lBU3ZCLFlBQ1UsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsY0FBOEI7UUFIOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBWnhDLG1CQUFjLEdBQVksRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTNGLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUxQixpQkFBWSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xELGtCQUFhLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7SUFPaEQsQ0FBQztJQUVKLGVBQWUsQ0FBQyxLQUFZO1FBQzFCLEtB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LElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7NkVBeEtVLFlBQVk7dUVBQVosWUFBWSxXQUFaLFlBQVksbUJBRlgsTUFBTTs7aUZBRVAsWUFBWTtjQUh4QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcmVzZXQgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0JztcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vbW9kZWxzL3NjZW5lJztcbmltcG9ydCB7IEVmZmVjdFNlcnZpY2UgfSBmcm9tICcuL2VmZmVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNldFNlcnZpY2UgfSBmcm9tICcuL3ByZXNldC5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuL3V1aWQuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY2VuZVNlcnZpY2Uge1xuICBzZWxlY3RlZFNjZW5lczogU2NlbmVbXSA9IFtdO1xuICBzY2VuZUNvbG9yczogc3RyaW5nW10gPSBbJyM5NDVmZGEnLCAnIzYxZGE1ZicsICcjNWZjM2RhJywgJyNkYWQ2NWYnLCAnI2RhNWY1ZicsICcjMjQ2ZGI3J107XG5cbiAgbXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTtcblxuICBzY2VuZURlbGV0ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBzY2VuZVNlbGVjdGVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVdWlkU2VydmljZSxcbiAgICBwcml2YXRlIGVmZmVjdFNlcnZpY2U6IEVmZmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlXG4gICkge31cblxuICBzY2VuZUlzU2VsZWN0ZWQoc2NlbmU6IFNjZW5lKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RlZFNjZW5lIG9mIHRoaXMuc2VsZWN0ZWRTY2VuZXMpIHtcbiAgICAgIGlmIChzZWxlY3RlZFNjZW5lLnV1aWQgPT09IHNjZW5lLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJlc2V0SXNTZWxlY3RlZChwcmVzZXQ6IFByZXNldCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFNjZW5lcyB8fCB0aGlzLnNlbGVjdGVkU2NlbmVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdXVpZCBvZiB0aGlzLnNlbGVjdGVkU2NlbmVzWzBdLnByZXNldFV1aWRzKSB7XG4gICAgICBpZiAocHJlc2V0LnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoU2NlbmVTZWxlY3Rpb24oc2NlbmU6IFNjZW5lKSB7XG4gICAgLy8gU2VsZWN0IGEgc2NlbmUgaWYgbm90IHlldCBzZWxlY3RlZCBvciB1bnNlbGVjdCBpdCBvdGhlcndpc2VcbiAgICBpZiAodGhpcy5zY2VuZUlzU2VsZWN0ZWQoc2NlbmUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRTY2VuZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTY2VuZXNbaV0udXVpZCA9PT0gc2NlbmUudXVpZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTY2VuZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2NlbmVzLnB1c2goc2NlbmUpO1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmVTZWxlY3RlZC5uZXh0KCk7XG4gIH1cblxuICBzZWxlY3RQcmVzZXRGcm9tU2VsZWN0ZWRTY2VuZSgpIHtcbiAgICAvLyBzZWxlY3QgdGhlIGZpcnN0IHByZXNldCBvZiB0aGUgc2NlbmUsIGlmIG5vIHByZXNldCBvZiB0aGUgY3VycmVudCBzY2VuZSBpcyBhbHJlYWR5XG4gICAgLy8gc2VsZWN0ZWQgdG8gbWFrZSBzdXJlLCB0aGUgdXNlciBkb2VzIG5vdCBlZGl0IGEgcHJlc2V0IHdoaWNoIGlzIG5vdCBldmVuXG4gICAgLy8gYWN0aXZlIGluIHRoZSBjdXJyZW50IHNjZW5lIChhbmQgc2VlcyBubyBjaGFuZ2UpLlxuXG4gICAgbGV0IGZpcnN0UHJlc2V0VXVpZDtcblxuICAgIC8vIGNoZWNrLCB3aGV0aGVyIGEgcHJlc2V0IG9mIHRoZSBjdXJyZW50IHNjZW5lIGlzIGFscmVhZHkgc2VsZWN0ZWQgYW5kIGRvIG5vdGhpbmdcbiAgICAvLyBpbiB0aGlzIGNhc2VcbiAgICBmb3IgKGNvbnN0IHNjZW5lIG9mIHRoaXMuc2VsZWN0ZWRTY2VuZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJlc2V0VXVpZCBvZiBzY2VuZS5wcmVzZXRVdWlkcykge1xuICAgICAgICBmaXJzdFByZXNldFV1aWQgPSBwcmVzZXRVdWlkO1xuXG4gICAgICAgIGlmIChwcmVzZXRVdWlkID09PSB0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0ZWRQcmVzZXQudXVpZCkge1xuICAgICAgICAgIC8vIGEgcHJlc2V0IG9mIGEgY3VycmVudGx5IHNlbGVjdGVkIHNjZW5lIGlzIGFscmVhZHkgc2VsZWN0ZWQgLT4gZG8gbm90aGluZ1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZmlyc3RQcmVzZXRVdWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW2ldLnV1aWQgPT09IGZpcnN0UHJlc2V0VXVpZCkge1xuICAgICAgICB0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0UHJlc2V0KGkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RTY2VuZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5lZmZlY3RTZXJ2aWNlLnNlbGVjdGVkRWZmZWN0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2NlbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3dpdGNoU2NlbmVTZWxlY3Rpb24odGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tpbmRleF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNjZW5lcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2NlbmVzLnB1c2godGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0UHJlc2V0RnJvbVNlbGVjdGVkU2NlbmUoKTtcblxuICAgIC8vIHByZXZpZXcgdGhlIGNvbXBsZXRlIHNjZW5lXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXZpZXdQcmVzZXQgPSBmYWxzZTtcblxuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zZWxlY3RlZFNjZW5lVXVpZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNjZW5lIG9mIHRoaXMuc2VsZWN0ZWRTY2VuZXMpIHtcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zZWxlY3RlZFNjZW5lVXVpZHMucHVzaChzY2VuZS51dWlkKTtcbiAgICB9XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcblxuICAgIHRoaXMuc2NlbmVTZWxlY3RlZC5uZXh0KCk7XG4gIH1cblxuICBhZGRTY2VuZShuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2NlbmU6IFNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgc2NlbmUudXVpZCA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuICAgIHNjZW5lLm5hbWUgPSBuYW1lIHx8ICdOZXcgU2NlbmUnO1xuXG4gICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoIDwgdGhpcy5zY2VuZUNvbG9ycy5sZW5ndGgpIHtcbiAgICAgIHNjZW5lLmNvbG9yID0gdGhpcy5zY2VuZUNvbG9yc1t0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjZW5lLmNvbG9yID0gJyMnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgOCkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdGhlIG5ldyBzY2VuZSBiZWZvcmUgdGhlIGhpZ2hlc3QgY3VycmVudGx5IHNlbGVjdGVkIHNjZW5lXG4gICAgbGV0IGhpZ2hlc3RTZWxlY3RlZFNjZW5lSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5zY2VuZUlzU2VsZWN0ZWQodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tpXSkpIHtcbiAgICAgICAgaGlnaGVzdFNlbGVjdGVkU2NlbmVJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMuc3BsaWNlKGhpZ2hlc3RTZWxlY3RlZFNjZW5lSW5kZXgsIDAsIHNjZW5lKTtcbiAgICB0aGlzLnNlbGVjdFNjZW5lKGhpZ2hlc3RTZWxlY3RlZFNjZW5lSW5kZXgpO1xuICB9XG5cbiAgcmVtb3ZlU2NlbmUoc2NlbmU6IFNjZW5lKTogdm9pZCB7XG4gICAgLy8gcmVtb3ZlIGFsbCBwbGF5YmFjayByZWdpb25zXG4gICAgZm9yIChjb25zdCBjb21wb3NpdGlvbiBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuY29tcG9zaXRpb25zKSB7XG4gICAgICBmb3IgKGxldCBpID0gY29tcG9zaXRpb24uc2NlbmVQbGF5YmFja1JlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25QbGF5YmFja1JlZ2lvbiA9IGNvbXBvc2l0aW9uLnNjZW5lUGxheWJhY2tSZWdpb25zW2ldO1xuICAgICAgICBpZiAoY29tcG9zaXRpb25QbGF5YmFja1JlZ2lvbi5zY2VuZVV1aWQgPT09IHNjZW5lLnV1aWQpIHtcbiAgICAgICAgICBjb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGhlIHNjZW5lXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lcy5zcGxpY2UodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lcy5pbmRleE9mKHNjZW5lKSwgMSk7XG4gICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RTY2VuZSgwKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lRGVsZXRlZC5uZXh0KCk7XG4gIH1cblxuICBnZXRTY2VuZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBTY2VuZSB7XG4gICAgZm9yIChjb25zdCBzY2VuZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzKSB7XG4gICAgICBpZiAoc2NlbmUudXVpZCA9PT0gdXVpZCkge1xuICAgICAgICByZXR1cm4gc2NlbmU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=