@ray-js/robot-map-sdk 0.0.3-beta-23 → 0.0.3-beta-24

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 (119) hide show
  1. package/dist/index.d.ts +1 -311
  2. package/dist/index.js +1 -1
  3. package/dist/utils/index.js +1 -1
  4. package/dist-docs/404.html +2 -2
  5. package/dist-docs/assets/{app.DKcv5ocC.js → app.DKtY-QgA.js} +1 -1
  6. package/dist-docs/assets/chunks/@localSearchIndexroot.Ck3G2TnR.js +1 -0
  7. package/dist-docs/assets/chunks/{VPLocalSearchBox.Ry2KicD5.js → VPLocalSearchBox.Is_bIGtF.js} +1 -1
  8. package/dist-docs/assets/chunks/{theme.D-vPQmyU.js → theme.CoICOtg5.js} +2 -2
  9. package/dist-docs/assets/{guide_advanced-usage.md.BquC67D7.js → guide_advanced-usage.md.BrZgx45A.js} +3 -1
  10. package/dist-docs/assets/{guide_advanced-usage.md.BquC67D7.lean.js → guide_advanced-usage.md.BrZgx45A.lean.js} +1 -1
  11. package/dist-docs/assets/{guide_getting-started.md.zACqR2O5.js → guide_getting-started.md.Cip1vgx6.js} +1 -1
  12. package/dist-docs/assets/reference_config.md.CfEp0H9c.js +61 -0
  13. package/dist-docs/assets/reference_config.md.CfEp0H9c.lean.js +1 -0
  14. package/dist-docs/guide/advanced-usage.html +7 -5
  15. package/dist-docs/guide/concepts.html +3 -3
  16. package/dist-docs/guide/getting-started.html +5 -5
  17. package/dist-docs/hashmap.json +1 -1
  18. package/dist-docs/index.html +3 -3
  19. package/dist-docs/reference/callbacks.html +3 -3
  20. package/dist-docs/reference/config.html +14 -8
  21. package/dist-docs/reference/data.html +3 -3
  22. package/dist-docs/reference/methods.html +3 -3
  23. package/dist-docs/reference/runtime.html +3 -3
  24. package/dist-docs/reference/types.html +3 -3
  25. package/dist-docs/reference/utils.html +3 -3
  26. package/package.json +1 -1
  27. package/dist/application/AppContainer.js +0 -1
  28. package/dist/application/AppService.js +0 -1
  29. package/dist/application/Interaction.js +0 -1
  30. package/dist/application/MapApplication.js +0 -1
  31. package/dist/application/ViewportContainer.js +0 -1
  32. package/dist/assets/carpet.png.js +0 -1
  33. package/dist/assets/chargingStation.png.js +0 -1
  34. package/dist/assets/checkmark.png.js +0 -1
  35. package/dist/assets/cleanMode0.png.js +0 -1
  36. package/dist/assets/cleanMode1.png.js +0 -1
  37. package/dist/assets/cleanMode2.png.js +0 -1
  38. package/dist/assets/cleanMode3.png.js +0 -1
  39. package/dist/assets/cleanTimes1.png.js +0 -1
  40. package/dist/assets/cleanTimes2.png.js +0 -1
  41. package/dist/assets/controlDelete.png.js +0 -1
  42. package/dist/assets/controlMove.png.js +0 -1
  43. package/dist/assets/controlRotate.png.js +0 -1
  44. package/dist/assets/controlScale.png.js +0 -1
  45. package/dist/assets/fan0.png.js +0 -1
  46. package/dist/assets/fan1.png.js +0 -1
  47. package/dist/assets/fan2.png.js +0 -1
  48. package/dist/assets/fan3.png.js +0 -1
  49. package/dist/assets/fan4.png.js +0 -1
  50. package/dist/assets/floorType1.png.js +0 -1
  51. package/dist/assets/floorType2.png.js +0 -1
  52. package/dist/assets/floorType3.png.js +0 -1
  53. package/dist/assets/robot.png.js +0 -1
  54. package/dist/assets/sleep.json.js +0 -1
  55. package/dist/assets/spot.png.js +0 -1
  56. package/dist/assets/water0.png.js +0 -1
  57. package/dist/assets/water1.png.js +0 -1
  58. package/dist/assets/water2.png.js +0 -1
  59. package/dist/assets/water3.png.js +0 -1
  60. package/dist/components/Base/BaseControlButton.js +0 -1
  61. package/dist/components/Base/Border.js +0 -1
  62. package/dist/components/Base/ControlFill.js +0 -1
  63. package/dist/components/Base/DashLine.js +0 -1
  64. package/dist/components/Base/EndPoint.js +0 -1
  65. package/dist/components/Base/EnhancedAnimatedSprite.js +0 -1
  66. package/dist/components/Base/EnhancedGifSprite.js +0 -1
  67. package/dist/components/Base/EnhancedSprite.js +0 -1
  68. package/dist/components/Base/FixedSizeContainer.js +0 -1
  69. package/dist/components/Base/FixedSizeDOMContainer.js +0 -1
  70. package/dist/components/Base/FixedSizeText.js +0 -1
  71. package/dist/components/Base/MoveControlButton.js +0 -1
  72. package/dist/components/Base/RemoveControlButton.js +0 -1
  73. package/dist/components/Base/Ring.js +0 -1
  74. package/dist/components/Base/RotateControlButton.js +0 -1
  75. package/dist/components/Base/ScaleControlButton.js +0 -1
  76. package/dist/components/Base/Zone.js +0 -1
  77. package/dist/components/ChargingStation/ChargingStationIcon.js +0 -1
  78. package/dist/components/ChargingStation/index.js +0 -1
  79. package/dist/components/Controls/CleanZone.js +0 -1
  80. package/dist/components/Controls/Divider.js +0 -1
  81. package/dist/components/Controls/ForbiddenMopZone.js +0 -1
  82. package/dist/components/Controls/ForbiddenSweepZone.js +0 -1
  83. package/dist/components/Controls/Spot.js +0 -1
  84. package/dist/components/Controls/VirtualWall.js +0 -1
  85. package/dist/components/CustomElements/CustomGif.js +0 -1
  86. package/dist/components/CustomElements/CustomHTML.js +0 -1
  87. package/dist/components/CustomElements/CustomImage.js +0 -1
  88. package/dist/components/DetectedObject/index.js +0 -1
  89. package/dist/components/Heatmap/index.js +0 -1
  90. package/dist/components/Map/Carpet.js +0 -1
  91. package/dist/components/Map/Free.js +0 -1
  92. package/dist/components/Map/Obstacle.js +0 -1
  93. package/dist/components/Map/RoomFill.js +0 -1
  94. package/dist/components/Path/index.js +0 -1
  95. package/dist/components/Robot/RobotIcon.js +0 -1
  96. package/dist/components/Robot/SleepAnimation.js +0 -1
  97. package/dist/components/Robot/index.js +0 -1
  98. package/dist/components/RoomFloorType/index.js +0 -1
  99. package/dist/components/RoomInfo/RoomName.js +0 -1
  100. package/dist/components/RoomInfo/RoomProperty.js +0 -1
  101. package/dist/components/RoomInfo/RoomSelectionIndicator.js +0 -1
  102. package/dist/components/RoomInfo/index.js +0 -1
  103. package/dist/constant/config.js +0 -1
  104. package/dist/constant/index.js +0 -1
  105. package/dist/managers/ControlsManager.js +0 -1
  106. package/dist/managers/CustomElementsManager.js +0 -1
  107. package/dist/managers/DetectedObjectManager.js +0 -1
  108. package/dist/managers/HeatmapManager.js +0 -1
  109. package/dist/managers/MapManager.js +0 -1
  110. package/dist/managers/PathManager.js +0 -1
  111. package/dist/managers/RoomManager.js +0 -1
  112. package/dist/mixins/ClickHandler.js +0 -1
  113. package/dist/utils/algorithm.js +0 -1
  114. package/dist/utils/browser.js +0 -1
  115. package/dist/utils/logger.js +0 -1
  116. package/dist-docs/assets/chunks/@localSearchIndexroot.C-cF3iZs.js +0 -1
  117. package/dist-docs/assets/reference_config.md.CRlb96P2.js +0 -55
  118. package/dist-docs/assets/reference_config.md.CRlb96P2.lean.js +0 -1
  119. /package/dist-docs/assets/{guide_getting-started.md.zACqR2O5.lean.js → guide_getting-started.md.Cip1vgx6.lean.js} +0 -0
@@ -1 +0,0 @@
1
- const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAMAAAC8EZcfAAAAqFBMVEUAAAD////////////////////////////////////////////////09P////+vt//Kzv/f4f/z9P/y8//o6P/HzP/////z9P/i5P/////v8f/t7//k5P/m6P/w8v/q6//o6f/S1f/X2v9gbP/b3/+vs/+Vmv9daP7///+us/+aof7r7P9xe/719f+Fjv7W2f9ncv7Cxv+4vf+kqv57hP7h4/+Ql/7M0P8zzBhqAAAAJ3RSTlMAn4Ag3xC/70Bgz3Aw748gMJ/iv3BeUM+/r5+PYHCvgN+FQBWPQDAOL4ZsAAAGb0lEQVR42s2b2XbaMBCGbWzMvmUpJXuatpJteQXM+79ZOTZkKAeiGdlW9F9zlM+zSTNSrEY0vx9NV97SnUScRxP3zVtNn58cywjNn+xhxC8qunl4nlvfKWfwMuESTeznrvUtcu48jpQ30s84uOUURd5AJ6OzcM/+fpL7QRxvhGBMiE1cBOtsdxaZvY4uRMfmp0r8OGUXlRZ+8t9nLP5aJNXHC7MC4K5A5iEH/Wy79swWJ3T+hqEk/BNvP7bq6DuIvV3BCIoTiMU7qy05N+BawYhKwYxe32pFnU+8gIGUEH9bzct54wf5DKSKuGw8WZ6Oexo4VwkxO0bifTvuDQWrqfhYdaZNFpclr5SnrLbS/Jgr3cbCz8UkB92IN06TfBB99ZXueCm3kdPieALJ25j8w2Fx3ABfj5cKWKMKoiqZaxPOK75wwxrW5kA4r8k3gerSsERYedmplx/A1zzhtsqUGoTdAx9UvzZs6M6UAT2K/dQJPVW+3+3yAWFHje++aiTo+UvP5XulDbhK4Ji1qlg9UTz6/qG+p9zS+UZVT8laV6IWhk6PkiD1EyWiOvkWArBtFVXHrJLBOdOi6gT7RN9CopS1LnCyS29BAqZJATVPuj3IYC3aQZ4QDCiYNonyDy5oBvSZRmVlUfugGJCeIfVN+E4xYMa0KiMk8kh3BIIJB/hTwk6t4d3ExUaom/AGw/dLbZMT6ySE8WGQqpkQ0+M9qtTAYMvPlKxThVPNAwKwTJE16eP9kF9QtKZ9IzJN+uXiKWXlkF9RGJN9LJ8OT6kezjmoN/RWQ5eDcup+Z+M8XFC674OG0/6nF6afkFvRsI//0HYRcXSv7ZzNnGzOqVOdssP7JQF8JXlYRIB3rr53yBVBymPZLcpPSg6nB/uNrtyI9mid/xrT3/UoVTqRNLXjKhR3lB55Ihm3lU4h5a/rSKdjPiUIvx5pPhNCMK4qi4OY3wmCR0byKugjl8NU1nE1fydMGabydjggGHCEax9wUV3Ih3HlwGiDMyBy7yydvMXNuqRHrg/8RhwfHCzVAG/CtPzphyyJQ1wKgzswJsybSeMf+CSO4IiOMeEWHzY/ZGtleA93MYAOvtJksq9+RwOuwcO4JidAx82r7Ljvo791hGwT0UHoy2Y0CzTg7jxaZJG9QwHKJiA22hlbyDdcF5GgA8duBLA8aDk4QAddvILmAMvMtJAqf6wZMIIqo82CkCT0GKwPCDH4ULfMQM3va8/iTht1EPan+nXwmbbUCgdo0z77TvatO/Re3CMMRONG9uI++uCRcnQQ9vGN2FbWus9gLdwkBe3hDH+Gm1lfqPyFwF++ONjTVoEecEXWV1riO5wQaUIPP+0p5GPgFX7y4eNM2OewJMorL/ImMaNcATqYlzchYVTxKC/6W8Kshw8lDqZcS4byQ+aMMqkI5S8pp5SHBSmmzxlCymGnl/bVJbtT0vwtwFyVPFCuwTaH4a9zLf5oL29yzEXEEwQhOgy5O7i4b5Z8hCuNEF4G1A5CqDWVhv2LeKRrXQEhKA3CnPKSspLXOWEcd454UcGw8nGt9h3ULXSmHNSzp53BoDNdlXSQHxQPvyK3zpihlSb8qjJBfcU1s6Rakq+z4yuICeA1OS4bgI9rISYxoyiN4DQtyeNI5c2M8P9j3AVC5e1Mr4s+YIYq1+3B2s8yf13EjK4QTjIyzfU9O6JPlOE6LGRalVBe297rNiEYEKk3zSYEA5pqwjUYECcXtikdSiOKASGRM6ZJOcmAUAv5hmlRrPCI1Znoy5N0W24iM4ukd32vbHO4NqXI1ZHJMENZWlQ5ETzZaFMiUv3fpleuIwzTLTiYqhcdYZhBBpM1gycbrcmv9U9DDm+TEPiisaWoEbHzpm/BqgEI07g2i03A4Ym8qh6BsC2+hVVLD0DYDp9t1dQtELbBd2vVVXcIhM3zDbuWmYQnfEYSnvAZSSjjoxPaB0JD+fY6EppUXy4TmsoHhKbyAaGpfEBoKt8noV/zfAV8xhH653yGEV7gM4rwIp9BhFf4jCG8ymcI4Rd8RhB+yWcAoYTv2wl18wGhqXxAaCofEJrKB4Sm8gGhqXxAaCqfZXWkhD5tftUaoal8QGgqHxCaygeEpvIBoal8QGgqHxCaygeEpvIBoal8QGgqHxCaygeEpvIBoal8n4TG8u0JDefbExrOtyc0nG9PaDjfntBwvj1h03z/ABD9FUIpArU6AAAAAElFTkSuQmCC";export{A as default};
@@ -1 +0,0 @@
1
- const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEHRSTlMA3yBgv58Q74BwQK+PzzBQHgQBUQAAAqhJREFUaN7t2etu8yAMBmBO4ZgQ7v9qv2na+kpVEgKOqfQN/1vK+hRjE9KKGTNmzJgxYwY9VCrOKDE8lCxfIR+SYwjx3ki7le+Qz03iXvrW8hOe7tov9276QnlFJMO+lLuycoDpyyxvvBdyg1iocLk3CyzwU8u83ZKxwAhispdyS8YCYzC1m27JyMy6INn8MhbYCPxD5Jfj78tO4Q+MZZPRSTt6Hz3FJ6fXAr81v2aV0Umb/RmPoYwyOsm9rgfUGqNsfi+Ho2t8MmZ3NNwpLjmXQ0JjA+ORcXk/2Ws9s7yejlassrQY15BsuhwvbmyBUV6vBjvFJ9ujwRqNxiPXTxF6rIyxUg2WNW6Qg2Uke7CMZNvBssYZYayMZKvBsnLYOcfKHvU1WEYzD5YVmnmwjPoaK2OcEYNl/VR9GdUoy2dayhfZKOdHDiPWlWZ5wQDKhEurjJbypAl3yJ56l8Ijy9ZU21aSC9sgaS2yxuftCayWs439LInbl8eEW2QUdiBmOopGORP3TYc9qEVGrl2fm3GEapOR69wFa3RFq7zjQZpQW1k0y5mweSFfVjTLlnQQWVAhbTLqMlG6SYpWGWVt6HBdHgBXZCKM70tFh0wqrhVV3SLTq9pjq26QyX2M7Sf0fweoSXv1IrplRbw79cpOCFJZx145dcL6MtdaVeVAOHOdLlUosipb8imz7xkDbm+unTp6qSKTQp6usikccv1p15fCKWPKbn93eWVMuSR0c4TBJ0u8l1l1jDEsuMQp53IQQ+TwMdl/TE6fku32B+XlD1ZYdJ+SbRosI2K1xozgukte0lJXToCUiOaMTfvV2VPQw4bk3lGXtLo+9UbxSGS9Jim/p7KZVef6eTuIAQGZDNPlKMYF/TcZuiyVGB3Wy7ItSsyYMWPG/xD/AIrSnldXeREbAAAAAElFTkSuQmCC";export{A as default};
@@ -1 +0,0 @@
1
- const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEXRSTlMA5cgdcw7XjzlWrIFkup0rSDjdhakAAAKOSURBVGje7ZnbkqQgDEAj95va//+1W7u1NVGpHiEJPHEep0ZPJyYBERaLxWKxWPDRaXPphOnE7S8uwmTM9p9JZvT+YGAG6J1rRu9cM3rnmtE714zeuWb0zjWjl2vme5XaLhQYSLx5tUbz2Bl23r0Ad/MJg9Du4X2YnYYRoAS99R8HYGtFbbYgz1F7a/MB4pjKi2ZCO5MayZ2PYndDmqq+d4AHn2GlbdXvMZW6wOQLy7xVgAcxyvtt84aUERNr/5ZINeAx71Ujvcw1Jd/BoW0FMdJLUmn9gVo20eml9kWTXdo7VCvBAWbd6wNGAmmFfO3P3PXfHliEvlFolVR9paZEIx+hkEP3fbxMyBiws93j1TMCJswiIxFyrgN+R/FDto4yfCM/5HILmBByZJeWoe0LE5DQtIBBc3Nd6mHZ28uRmekAXQRmrt1PpgHpLC/eziMDUHMdWI/4A53gUlFYY8tCJ5aQLORg7J8UVhfj4oPREDunqD1047Eh+sF5yXkHWOIGOC2ROc9YSRSX4rwzJdYM4PTi3BkAmV4glrXfK/QlJlSLBPFq1m9m5CvR9y4WCOzUy60jFTV/zxar2UPdR6Qpu0TE0fbHodqP03PtaZcd/LdUTboqABGFR5ikl3mgEgknskXkYFF1n8hqxygtxPSemFnFChhRt5Pqd+8u9Ykgbk1m9CIBWPir+SXb+uo9RD8ofo9C/mNf2K5k2/gtPUh/nFfxSzFguNj2ImZUlypqjdqqk/gFhrgU9dV6bA88gLQZ5bvPxmSfcFJJejHbHRgQpLhmbwFRTtWmVRqEsbkpzRbkCelNmzDcmeoUYBwhf6syH2AsNvrKrXy0MAMd87Grf8r9yJ8TFovFYrFYcPgDfFESW2IpAiAAAAAASUVORK5CYII=";export{A as default};
@@ -1 +0,0 @@
1
- const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEHRSTlMAgN8g7xBgcECfj6+/zzBQ4swJLwAAAaxJREFUaN7t2lluwzAMBFBq9SLbnfuftigQYD5SZLGpaQPoXWBgiqQdKDYMwzAMw3Wp5dySyVX8yNXEAm5kycy9CabAXG0yc7XJzNUmM1ebzFxtMnPVyczVJzP33mQdVRD132EHHjqsk5TxUE7WRYp4InZJLhFPxWL+Gl7QjPoMkmycK0DCoToySNjabCxxgzW8YTE3E94yeW8s+THveFNUTrD/NB84IWkLTdG9o2ULrGSc4PCGXAESrpEZJO2vDact4gempH1gWsS7g5K2pWkRzzAV7dKiqm0t2k5WGpclbaWpOlRaWOuMy7J4e9ChPWKatGuL1vO/HvTdFeFg9whWfW3CxQj+z2f8Z8G7Y7B+gbRPWpkTHFTtrwiatZ9cVOyEXfuOoFXbW/QlPmLKuCgXO2XRVppmcaUpahc1VfG3LUWX1lLv62AXRO0JU3VoafEsN9cLReVdzCEuNAWcMH3ynQRfzPorr1X8vBTEuTRlvChP5ojzrP+bQAl4QSjmL214oiXrY34Yvc3Wz7xm/Couyfoq8xLvU6tJpBqWPUYgx72Fr2TDMAzDMFzxDf7xFoVjSQNhAAAAAElFTkSuQmCC";export{A as default};
@@ -1 +0,0 @@
1
- const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEHRSTlMAgN8g72AQn0Bwv4+vMM9QQt7wKQAAArJJREFUaN7tmtHOpCAMhbUgoqL2/Z92s5t/0/wtkRE4c8V3eTKZMy2lRZlpMBgMBoNBLS55n5zSdvb7OUFZ+C9+yWpAZv5hedRwvszzfy1mNKCvuNhfA/XFO1tf63IoDeVrXZLSwL7iEkhpYF9xccoZ5mudvdJAvsL285Hbau0snEH3q1lr7Zz8yCmbSmmNOM+PeCelrbQmHHEBcvaT1OwciItQkFpQWj2JPyBlljmBNlJ+O5PSABspv6mc0mo5PStKpT0rDVVYtphIaajCElZJttJes/ErNkm2aP06VnmZqXWZL34JZXYCYXZwfjfvSmseSWWc1JdosETbxK5KA1W0bVZOaS8InqsgJyFXTciDK1kl5Jo2ErkaCbmmvnbmtpCj0tABS3iX0sABS3iL0kC9w4bnlIYqaRteUhpuDwvB5podqGnZVhWUhistYZevUdojgZtxmcQ5cKYlr1Fp6ExLXrVWwnMzPhcBsHsIpx0UHMFLLKfaTWm4tiUc8lZEtPLTQ6fqiu+qi7gDV2ZOXN8wpkwn8gVj7kLuq4YxZo2tsf+asdPaMxfQGN9AUqaBpK+1zMWcAfFDYqkYEpE7ECvGYmCh7YC7aw1f1lfmKEPg5wipLae1EnenJV60hj/t+SC1xaIVWbtkeqLXT22xS6ad0cpQj9E0m9FUZulwtp12rnixSO2lFa2GfEKW4GatwUMmeaugrgjAqxwlZ7akgXs5ZVKWel0olu9iFqWB35NLUklpyJuB8kUM/k4i+MI47DuYZRAkpWGdpUtE6wvINuiPGdvnt6lb5nXVhvuDgL3wOJRWS5g/SnOw82WeGnE7F0jOnhR30eqJj9Z7tDfs+zL1IR6es9DqJu3r1zj1I8SVrOvvwG7/TwtTb9wyrxcRs6crzbdexXs/7nMaDAaDwWDwnj/NQlzrb+J5OQAAAABJRU5ErkJggg==";export{A as default};
@@ -1 +0,0 @@
1
- import{Graphics as i,Rectangle as o}from"pixi.js";import{FixedSizeContainer as t}from"./FixedSizeContainer.js";import{Logger as r}from"../../utils/logger.js";import{EnhancedSprite as e}from"./EnhancedSprite.js";import{useAppService as n}from"../../application/AppService.js";class s extends t{background;icon;options;constructor(o){super(),this.options=o,this.background=new i,this.addChild(this.background),this.icon=new e,this.addChild(this.icon),this.eventMode="static",this.render(),this.setupHitArea(),this.setupEvents()}setupHitArea(){const i=n().controlsConfig,t=i.iconWrapperWidth+16,r=i.iconWrapperHeight+16;this.hitArea=new o(-t/2,-r/2,t,r)}async render(){this.renderBackground(),this.renderIcon()}renderBackground(){const i=n().controlsConfig;this.background.clear(),this.background.roundRect(-i.iconWrapperWidth/2,-i.iconWrapperHeight/2,i.iconWrapperWidth,i.iconWrapperHeight,i.iconWrapperBorderRadius).fill(this.options.backgroundColor)}async renderIcon(){try{const i=n().controlsConfig;await this.icon.loadTextureAndSetSize(this.options.iconAlias,{width:i.iconWidth,height:i.iconHeight,sizeFixed:!1}),this.icon.visible=!0}catch(i){r.error(`Failed to load icon: ${this.options.iconAlias}`,i)}}destroy(){super.destroy()}}export{s as BaseControlButton};
@@ -1 +0,0 @@
1
- import{Container as t,Graphics as i}from"pixi.js";import{Logger as s}from"../../utils/logger.js";import{useAppService as e}from"../../application/AppService.js";class r extends t{borderOptions;solidLine=null;dashGraphics=null;fillGraphics=null;constructor(t){super(),this.borderOptions={...t},this.drawBorder(),this.setupAntiScaleListener(),this.eventMode="none"}setupAntiScaleListener(){e().emitter.on("antiScale",this.handleAntiScale)}handleAntiScale=()=>{this.drawBorder()};drawBorder(){const{points:t=[],closePath:i=!1,style:s}=this.borderOptions;t.length<2||(this.clearBorder(),void 0!==s.fillColor&&i&&this.drawFill(t,s),s.isDashed?this.drawContinuousDashedBorder(t,i,s):this.drawSolidBorder(t,i,s))}drawFill(t,s){if(s.fillColor&&!(t.length<3)){this.fillGraphics&&(this.removeChild(this.fillGraphics),this.fillGraphics.destroy()),this.fillGraphics=new i,this.fillGraphics.setFillStyle({color:s.fillColor}),this.fillGraphics.moveTo(t[0].x,t[0].y);for(let i=1;i<t.length;i++)this.fillGraphics.lineTo(t[i].x,t[i].y);this.fillGraphics.closePath(),this.fillGraphics.fill(),this.addChild(this.fillGraphics)}}drawSolidBorder(t,s,r){const h=e();this.solidLine&&(this.removeChild(this.solidLine),this.solidLine.destroy()),this.solidLine=new i;const o=h.getApp().toFixedSize(r.width);this.solidLine.setStrokeStyle({color:r.color,width:o}),this.solidLine.moveTo(t[0].x,t[0].y);for(let i=1;i<t.length;i++)this.solidLine.lineTo(t[i].x,t[i].y);s&&this.solidLine.lineTo(t[0].x,t[0].y),this.solidLine.stroke(),this.addChild(this.solidLine)}drawContinuousDashedBorder(t,r,h){if(t.length<2)return;if(!h.dashArray||2!==h.dashArray.length||h.dashArray[0]<=0||h.dashArray[1]<=0)return void s.warn("Invalid dashArray:",h.dashArray);const o=e();this.dashGraphics=new i;const l=o.getApp().toFixedSize(h.width);this.dashGraphics.setStrokeStyle({color:h.color,width:l});const a=Math.max(o.getApp().toFixedSize(h.dashArray[0]),1),n=Math.max(o.getApp().toFixedSize(h.dashArray[1]),1),d=r?[...t,t[0]]:t;this.drawContinuousPathDashes(this.dashGraphics,d,a,n),this.dashGraphics.stroke(),this.addChild(this.dashGraphics)}drawContinuousPathDashes(t,i,e,r){if(i.length<2)return;if(e<=0||r<=0)return void s.warn("Invalid dash parameters:",{dashLength:e,gapLength:r});const h=this.calculatePathSegments(i),o=h.reduce((t,i)=>t+i.length,0);if(0===o)return;const l=e+r;let a=0;for(;a<o;){const i=a+e;i<=o?this.drawContinuousDashSegment(t,h,a,i):this.drawContinuousDashSegment(t,h,a,o),a+=l}}calculatePathSegments(t){const i=[];for(let s=0;s<t.length-1;s++){const e=t[s],r=t[s+1],h=r.x-e.x,o=r.y-e.y,l=Math.sqrt(h*h+o*o);i.push({start:e,end:r,length:l})}return i}drawContinuousDashSegment(t,i,s,e){if(s>=e)return;let r=0,h=!1,o=null;for(const l of i){const i=r,a=r+l.length;if(a>s&&i<e){const r=Math.max(s,i),n=Math.min(e,a),d=(r-i)/l.length,c=(n-i)/l.length,p={x:l.start.x+(l.end.x-l.start.x)*d,y:l.start.y+(l.end.y-l.start.y)*d},y={x:l.start.x+(l.end.x-l.start.x)*c,y:l.start.y+(l.end.y-l.start.y)*c};h?o&&Math.sqrt(Math.pow(p.x-o.x,2)+Math.pow(p.y-o.y,2))>.1&&t.lineTo(p.x,p.y):(t.moveTo(p.x,p.y),h=!0),t.lineTo(y.x,y.y),o=y}if(r+=l.length,r>=e)break}}clearBorder(){this.fillGraphics&&(this.removeChild(this.fillGraphics),this.fillGraphics.destroy(),this.fillGraphics=null),this.solidLine&&(this.removeChild(this.solidLine),this.solidLine.destroy(),this.solidLine=null),this.dashGraphics&&(this.removeChild(this.dashGraphics),this.dashGraphics.destroy(),this.dashGraphics=null)}updateStyle(t){this.borderOptions.style={...this.borderOptions.style,...t},this.drawBorder()}updatePoints(t){this.borderOptions.points=t,this.drawBorder()}setClosePath(t){this.borderOptions.closePath=t,this.drawBorder()}getOptions(){return{...this.borderOptions}}destroy(){e().emitter.off("antiScale",this.handleAntiScale),this.clearBorder(),super.destroy()}}export{r as Border};
@@ -1 +0,0 @@
1
- import{Graphics as t}from"pixi.js";import{useAppService as i}from"../../application/AppService.js";class n extends t{fillOptions;isDragging=!1;dragStartPosition=null;constructor(t){super(),this.fillOptions=t,this.setupInteraction(),this.setupDragEventListeners(),this.draw()}setupInteraction(){this.fillOptions.enableInteraction&&(this.eventMode="static",this.on("pointerdown",this.handlePointerDown))}setupDragEventListeners(){const{emitter:t}=i();t.on("gestureHijackPointerMove",this.handleDragPointerMove),t.on("gestureHijackPointerUp",this.handleDragPointerUp),t.on("gestureHijackCancel",this.handleDragCancel)}cleanupDragEventListeners(){const{emitter:t}=i();t.off("gestureHijackPointerMove",this.handleDragPointerMove),t.off("gestureHijackPointerUp",this.handleDragPointerUp),t.off("gestureHijackCancel",this.handleDragCancel)}handlePointerDown=t=>{t.stopPropagation(),this.startDragging(t)};startDragging(t){this.isDragging=!0;const n=this.parent.toLocal(t.global);this.dragStartPosition={x:n.x,y:n.y},this.fillOptions.onDragStart?.(t),i().emitter.emit("gestureHijackStart",t)}handleDragPointerMove=t=>{this.isDragging&&this.dragStartPosition&&this.fillOptions.onDragMove?.(t)};handleDragPointerUp=()=>{this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,this.fillOptions.onDragEnd?.())};handleDragCancel=()=>{this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,this.fillOptions.onDragEnd?.())};draw(){const{points:t,fillColor:i}=this.fillOptions;if(t.length<3)return;this.clear();const n=t.flatMap(t=>[t.x,t.y]);this.setFillStyle({color:i}).poly(n).fill()}getDragStartPosition(){return this.dragStartPosition}updateOptions(t){this.fillOptions={...this.fillOptions,...t},void 0!==t.enableInteraction&&(this.off("pointerdown",this.handlePointerDown),this.setupInteraction()),this.draw()}updatePoints(t){this.fillOptions.points=t,this.draw()}updateFillColor(t){this.fillOptions.fillColor=t,this.draw()}stopDragging(){this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null)}isCurrentlyDragging(){return this.isDragging}setInteractionEnabled(t){this.fillOptions.enableInteraction=t,t?(this.eventMode="static",this.on("pointerdown",this.handlePointerDown)):(this.eventMode="auto",this.off("pointerdown",this.handlePointerDown),this.isDragging&&this.stopDragging())}destroy(){this.stopDragging(),this.cleanupDragEventListeners(),this.off("pointerdown",this.handlePointerDown),super.destroy()}}export{n as ControlFill};
@@ -1 +0,0 @@
1
- import{Graphics as t,GraphicsContext as e}from"pixi.js";import{useAppService as s}from"../../application/AppService.js";class i extends t{lineOptions;strokeContext=null;constructor(t){super(),this.lineOptions={...t},this.eventMode="static",this.drawDashLine(),this.setupAntiScaleListener()}setupAntiScaleListener(){s().emitter.on("antiScale",this.drawDashLine)}drawDashLine=()=>{const{start:t,end:i,style:o}=this.lineOptions;this.clear(),this.strokeContext&&this.strokeContext.destroy();const n=s();this.strokeContext=new e;const r=n.getApp().toFixedSize(o.width);this.strokeContext.setStrokeStyle({color:o.color,width:r}),this.drawDashedLineToContext(this.strokeContext,t.x,t.y,i.x,i.y,o.dashArray[0],o.dashArray[1]),this.strokeContext.stroke(),this.context=this.strokeContext};drawDashedLineToContext(t,e,i,o,n,r,h){const a=o-e,d=n-i,p=Math.sqrt(a*a+d*d);if(0===p)return;const l=s(),c=l.getApp().toFixedSize(r),x=c+l.getApp().toFixedSize(h),k=p/x,y=Math.round(k);if(0===y)return t.moveTo(e,i),void t.lineTo(o,n);const u=p/y,C=u*(c/x),w=a/p,S=d/p;for(let s=0;s<y;s++){const o=s*u,n=o+C;if(o>=p)break;const r=Math.min(n,p),h=e+o*w,a=i+o*S,d=e+r*w,l=i+r*S;t.moveTo(h,a),t.lineTo(d,l)}}updatePoints(t,e){this.lineOptions.start=t,this.lineOptions.end=e,this.drawDashLine()}updateStyle(t){this.lineOptions.style={...this.lineOptions.style,...t},this.drawDashLine()}getOptions(){return{...this.lineOptions}}destroy(){s().emitter.off("antiScale",this.drawDashLine),this.strokeContext&&this.strokeContext.destroy(),super.destroy()}}export{i as DashLine};
@@ -1 +0,0 @@
1
- import{Graphics as t,Circle as i}from"pixi.js";import{useAppService as n}from"../../application/AppService.js";class o extends t{constructor(t){super(),this.options=t,this.initialPosition={...t.position},this.position.set(t.position.x,t.position.y),this.eventMode="static",this.cursor="pointer",this.setupEvents(),this.draw(),this.setupDragEventListeners()}isDragging=!1;dragStartPosition=null;initialPosition;draw(){const t=n(),{config:i}=this.options,o=t.getApp().toFixedSize(i.endPointSize),s=t.getApp().toFixedSize(i.endPointStrokeWidth);this.clear(),this.circle(0,0,o/2),this.fill({color:i.endPointColor}),this.stroke({color:i.endPointStrokeColor,width:s}),this.setupHitArea()}setupHitArea(){const t=n(),{config:o}=this.options,s=Math.max(o.endPointSize/2+10,20),e=t.getApp().toFixedSize(s);this.hitArea=new i(0,0,e)}setupEvents(){this.on("pointerdown",this.handlePointerDown.bind(this))}setupDragEventListeners(){const{emitter:t}=n();t.on("gestureHijackPointerMove",this.handleDragPointerMove),t.on("gestureHijackPointerUp",this.handleDragPointerUp),t.on("gestureHijackCancel",this.handleDragCancel)}cleanupDragEventListeners(){const{emitter:t}=n();t.off("gestureHijackPointerMove",this.handleDragPointerMove),t.off("gestureHijackPointerUp",this.handleDragPointerUp),t.off("gestureHijackCancel",this.handleDragCancel)}handlePointerDown(t){t.stopPropagation(),this.startDragging(t)}startDragging(t){const i=n();this.isDragging=!0,this.dragStartPosition=this.parent.toLocal(t.global),this.initialPosition={x:this.x,y:this.y},this.options.onDragStart?.(),i.getApp().requestRender("endpoint-drag",!0),n().emitter.emit("gestureHijackStart",t)}handleDragPointerMove=t=>{if(!this.isDragging||!this.dragStartPosition)return;const i=this.parent.toLocal(t.global),n=i.x-this.dragStartPosition.x,o=i.y-this.dragStartPosition.y,s={x:this.initialPosition.x+n,y:this.initialPosition.y+o};this.position.set(s.x,s.y),this.options.onDragMove?.(s)};handleDragPointerUp=()=>{if(!this.isDragging)return;const t=n();this.isDragging=!1,this.dragStartPosition=null,t.getApp().stopRender("endpoint-drag"),this.options.onDragEnd?.()};handleDragCancel=()=>{if(!this.isDragging)return;const t=n();this.isDragging=!1,this.dragStartPosition=null,t.getApp().stopRender("endpoint-drag"),this.options.onDragEnd?.()};updatePosition(t){this.position.set(t.x,t.y),this.initialPosition={...t}}getPosition(){return{x:this.x,y:this.y}}redraw(){this.draw()}destroy(){this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null),this.cleanupDragEventListeners(),this.off("pointerdown",this.handlePointerDown),super.destroy()}}export{o as EndPoint};
@@ -1 +0,0 @@
1
- import{AnimatedSprite as i,Assets as t,Texture as e,Ticker as s}from"pixi.js";import{throttle as a}from"lodash-es";import{Logger as r}from"../../utils/logger.js";import{useAppService as n}from"../../application/AppService.js";class h extends i{throttledUpdateScale;fixedWidth=0;fixedHeight=0;isFixedSizeSet=!1;sizeFixed=!0;baselineScale=1;static animationTicker=null;static animatedSprites=new Set;constructor(i){super(i||[]),this.anchor.set(.5),this.visible=!1,this.throttledUpdateScale=a(this.updateScale.bind(this),30,{leading:!0,trailing:!0}),this.registerScaleListener()}setFixedSize(i,t){this.fixedWidth=i,this.fixedHeight=t,this.isFixedSizeSet=!0,this.applySize()}setSizeFixed(i){this.sizeFixed=i,this.baselineScale=1,(i&&this.isFixedSizeSet||!i&&this.isFixedSizeSet)&&this.applySize()}set width(i){this.isFixedSizeSet||this.setFixedSize(i,this.fixedHeight||i)}set height(i){this.isFixedSizeSet||this.setFixedSize(this.fixedWidth||i,i)}get width(){return this.fixedWidth||super.width}get height(){return this.fixedHeight||super.height}registerScaleListener(){n().emitter.on("antiScale",this.throttledUpdateScale)}applySize(){if(!this.isFixedSizeSet||!this.textures||0===this.textures.length||!this.textures[0]||0===this.textures[0].width||0===this.textures[0].height)return;const i=n(),t=this.textures[0],e=this.fixedWidth/t.width,s=this.fixedHeight/t.height;if(this.sizeFixed){const t=i.currentScale;if(0===t||!isFinite(t)){const i=e,t=s;return void super.scale.set(i,t)}const a=e/t,r=s/t;super.scale.set(a,r)}else super.scale.set(e/this.baselineScale,s/this.baselineScale)}updateScale(i){this.sizeFixed&&(this.isFixedSizeSet?this.applySize():0!==i&&super.scale.set(1/i))}static async loadAnimationTextures(i,s="sleep_",a=96){try{await t.load(i);const r=[];for(let i=0;i<a;i++){const t=`${s}${i.toString().padStart(3,"0")}.png`,a=e.from(t);a&&r.push(a)}return r}catch(i){return[]}}setupAnimation(i){void 0!==i.sizeFixed&&this.setSizeFixed(i.sizeFixed),this.setFixedSize(i.width,i.height),this.animationSpeed=.5,this.loop=!0,r.log(`Animation setup complete, visible=${this.visible}, scale=(${this.scale.x.toFixed(3)}, ${this.scale.y.toFixed(3)})`)}draw(i,t){const{x:e,y:s,rotation:a=0}=i;t&&!this.visible?this.visible=t():t||this.visible||(this.visible=!0),this.rotation=a,this.position.set(e,s)}play(){this.textures&&this.textures.length>0&&(super.play(),h.animatedSprites.add(this),h.startAnimationTicker())}stop(){super.stop(),h.animatedSprites.delete(this),h.updateAnimationTicker()}set textures(i){super.textures=i,this.isFixedSizeSet&&i&&i.length>0&&i[0]&&i[0].width>0&&i[0].height>0&&this.applySize()}get textures(){return super.textures}static startAnimationTicker(){h.animationTicker?.started||(h.animationTicker||(h.animationTicker=new s,h.animationTicker.maxFPS=24,h.animationTicker.add(()=>{h.updateAnimations()})),h.animationTicker.start(),r.log("🎬 [AnimationTicker] Started animation ticker"))}static updateAnimationTicker(){h.animatedSprites.size>0?h.startAnimationTicker():h.stopAnimationTicker()}static stopAnimationTicker(){h.animationTicker?.started&&(r.log("⏸️ [AnimationTicker] Stopped animation ticker"),h.animationTicker.stop())}static updateAnimations(){if(0===h.animatedSprites.size)return;const i=n().getApp();i.renderer.render(i.stage)}destroy(i){h.animatedSprites.delete(this),h.updateAnimationTicker(),n().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(i)}}export{h as EnhancedAnimatedSprite};
@@ -1 +0,0 @@
1
- import{Assets as e}from"pixi.js";import{GifSprite as i}from"pixi.js/gif";import{throttle as t}from"lodash-es";import{Logger as s}from"../../utils/logger.js";import{useAppService as h}from"../../application/AppService.js";class r extends i{throttledUpdateScale;fixedWidth=0;fixedHeight=0;isFixedSizeSet=!1;sizeFixed=!0;baselineScale=1;constructor(e){super(e),this.anchor.set(.5),this.visible=!1,this.throttledUpdateScale=t(this.updateScale.bind(this),30,{leading:!0,trailing:!0}),this.registerScaleListener()}setFixedSize(e,i){this.fixedWidth=e,this.fixedHeight=i,this.isFixedSizeSet=!0,this.applySize()}setSizeFixed(e){this.sizeFixed=e,this.baselineScale=1,(e&&this.isFixedSizeSet||!e&&this.isFixedSizeSet)&&this.applySize()}set width(e){this.isFixedSizeSet?s.warn("EnhancedGifSprite: 使用 setFixedSize() 方法来设置宽度"):this.setFixedSize(e,this.fixedHeight||e)}set height(e){this.isFixedSizeSet?s.warn("EnhancedGifSprite: 使用 setFixedSize() 方法来设置高度"):this.setFixedSize(this.fixedWidth||e,e)}get width(){return this.fixedWidth||super.width}get height(){return this.fixedHeight||super.height}registerScaleListener(){h().emitter.on("antiScale",this.throttledUpdateScale)}applySize(){if(!this.isFixedSizeSet||!this.texture||0===this.texture.width||0===this.texture.height)return;const e=h(),i=this.fixedWidth/this.texture.width,t=this.fixedHeight/this.texture.height;if(this.sizeFixed){const s=e.currentScale;if(0===s)return;const h=i/s,r=t/s;super.scale.set(h,r)}else super.scale.set(i/this.baselineScale,t/this.baselineScale)}updateScale(e){this.sizeFixed&&(this.isFixedSizeSet?this.applySize():0!==e&&super.scale.set(1/e))}static async createFromSrc(i,t){try{const s=await e.load(i),h=new r({source:s});return void 0!==t.sizeFixed&&h.setSizeFixed(t.sizeFixed),h.setFixedSize(t.width,t.height),h}catch(e){throw s.error(`Failed to load GIF "${i}":`,e),e}}draw(e,i){const{x:t,y:s,rotation:h=0}=e;i&&!this.visible?this.visible=i():i||this.visible||(this.visible=!0),this.rotation=h,this.position.set(t,s)}destroy(e){h().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(e)}}export{r as EnhancedGifSprite};
@@ -1 +0,0 @@
1
- import{Sprite as e,Assets as i}from"pixi.js";import{throttle as t}from"lodash-es";import{Logger as s}from"../../utils/logger.js";import{useAppService as h}from"../../application/AppService.js";class r extends e{throttledUpdateScale;fixedWidth=0;fixedHeight=0;isFixedSizeSet=!1;sizeFixed=!0;baselineScale=1;constructor(e){super(e),this.anchor.set(.5),this.visible=!1,this.throttledUpdateScale=t(this.updateScale.bind(this),30,{leading:!0,trailing:!0}),this.registerScaleListener()}setFixedSize(e,i){this.fixedWidth=e,this.fixedHeight=i,this.isFixedSizeSet=!0,this.applySize()}setSizeFixed(e){this.sizeFixed=e,this.baselineScale=1,(e&&this.isFixedSizeSet||!e&&this.isFixedSizeSet)&&this.applySize()}set width(e){this.isFixedSizeSet?s.warn("EnhancedSprite: 使用 setFixedSize() 方法来设置宽度"):this.setFixedSize(e,this.fixedHeight||e)}set height(e){this.isFixedSizeSet?s.warn("EnhancedSprite: 使用 setFixedSize() 方法来设置高度"):this.setFixedSize(this.fixedWidth||e,e)}get width(){return this.fixedWidth||super.width}get height(){return this.fixedHeight||super.height}registerScaleListener(){h().emitter.on("antiScale",this.throttledUpdateScale)}applySize(){if(!this.isFixedSizeSet||!this.texture||0===this.texture.width||0===this.texture.height)return;const e=h(),i=this.fixedWidth/this.texture.width,t=this.fixedHeight/this.texture.height;if(this.sizeFixed){const s=e.currentScale;if(0===s)return;const h=i/s,r=t/s;super.scale.set(h,r)}else super.scale.set(i/this.baselineScale,t/this.baselineScale)}updateScale(e){this.sizeFixed&&(this.isFixedSizeSet?this.applySize():0!==e&&super.scale.set(1/e))}async loadTextureAndSetSize(e,t){try{const s=h(),r=await i.load(e);this.texture=r,void 0!==t.sizeFixed&&this.setSizeFixed(t.sizeFixed),this.setFixedSize(t.width,t.height),s.getApp().renderOnceNextFrame()}catch(i){s.error(`Failed to load texture "${e}":`,i)}}draw(e,i){const{x:t,y:s,rotation:h=0}=e;i&&!this.visible?this.visible=i():i||this.visible||(this.visible=!0),this.rotation=h,this.position.set(t,s)}set texture(e){super.texture=e,this.isFixedSizeSet&&e&&e.width>0&&e.height>0&&this.applySize()}get texture(){return super.texture}destroy(e){h().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(e)}}export{r as EnhancedSprite};
@@ -1 +0,0 @@
1
- import{Container as t}from"pixi.js";import{throttle as e}from"lodash-es";import{useAppService as r}from"../../application/AppService.js";class a extends t{throttledUpdateScale;constructor(){super(),this.throttledUpdateScale=e(this.updateScale.bind(this),30,{leading:!0,trailing:!0});const t=r();this.updateScale(t.currentScale),this.registerScaleListener()}registerScaleListener(){r().emitter.on("antiScale",this.throttledUpdateScale)}updateScale(t){0!==t&&this.scale.set(1/t)}destroy(t){r().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(t)}}export{a as FixedSizeContainer};
@@ -1 +0,0 @@
1
- import{DOMContainer as e}from"pixi.js";import{throttle as t}from"lodash-es";import{useAppService as i}from"../../application/AppService.js";class s extends e{throttledUpdateScale;fixedWidth=0;fixedHeight=0;isFixedSizeSet=!1;userCenterX=0;userCenterY=0;sizeFixed=!0;constructor(e){super(e),this.anchor.set(0,0),this.throttledUpdateScale=t(this.updateScale.bind(this),30,{leading:!0,trailing:!0}),this.registerScaleListener()}setFixedSize(e,t){this.fixedWidth=e,this.fixedHeight=t,this.isFixedSizeSet=!0,this.applyFixedSize(),this.updatePositionFromCenter()}setCenterPosition(e,t){this.userCenterX=e,this.userCenterY=t,this.updatePositionFromCenter()}setSizeFixed(e){this.sizeFixed=e,this.isFixedSizeSet&&(this.applyFixedSize(),this.updatePositionFromCenter())}updatePositionFromCenter(){if(!this.isFixedSizeSet)return void this.position.set(this.userCenterX,this.userCenterY);const e=i().currentScale;let t,s;this.sizeFixed?(t=this.fixedWidth/2/e,s=this.fixedHeight/2/e):(t=this.fixedWidth/2,s=this.fixedHeight/2),this.position.set(this.userCenterX-t,this.userCenterY-s)}registerScaleListener(){i().emitter.on("antiScale",this.throttledUpdateScale)}applyFixedSize(){if(!this.isFixedSizeSet)return;const e=i().currentScale;if(0!==e){if(this.sizeFixed){const t=1/e;this.scale.set(t)}else this.scale.set(1);this.element&&(this.element.style.width=`${this.fixedWidth}px`,this.element.style.height=`${this.fixedHeight}px`)}}updateScale(e){this.isFixedSizeSet&&0!==e&&(this.applyFixedSize(),this.updatePositionFromCenter())}updateTransform(e){return super.updateTransform(e)}destroy(e){i().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(e)}}export{s as FixedSizeDOMContainer};
@@ -1 +0,0 @@
1
- import{Text as t}from"pixi.js";import{throttle as e}from"lodash-es";import{useAppService as s}from"../../application/AppService.js";class i extends t{throttledUpdateScale;constructor({text:t,style:i}){super({text:t,style:i}),this.throttledUpdateScale=e(this.updateScale.bind(this),20,{leading:!0,trailing:!0}),this.registerScaleListener(),this.updateScale(s().currentScale)}registerScaleListener(){s().emitter.on("antiScale",this.throttledUpdateScale)}updateScale(t){t<=0||this.scale.set(1/t)}setBaseFontSize(t){this.style.fontSize=t}updateText(t){this.text=t}destroy(t){s().emitter.off("antiScale",this.throttledUpdateScale),super.destroy(t)}}export{i as FixedSizeText};
@@ -1 +0,0 @@
1
- import{BaseControlButton as t}from"./BaseControlButton.js";import{useAppService as i}from"../../application/AppService.js";class o extends t{isMoving=!1;dragStartPosition=null;constructor(t){super(t),this.setupMoveEventListeners()}setupMoveEventListeners(){const{emitter:t}=i();t.on("gestureHijackPointerMove",this.handleMovePointerMove),t.on("gestureHijackPointerUp",this.handleMovePointerUp),t.on("gestureHijackCancel",this.handleMoveCancel)}cleanupMoveEventListeners(){const{emitter:t}=i();t.off("gestureHijackPointerMove",this.handleMovePointerMove),t.off("gestureHijackPointerUp",this.handleMovePointerUp),t.off("gestureHijackCancel",this.handleMoveCancel)}setupEvents(){this.on("pointerdown",this.handlePointerDown.bind(this))}handlePointerDown(t){t.stopPropagation(),this.startMoving(t)}startMoving(t){this.isMoving=!0,this.dragStartPosition=this.parent.toLocal(t.global),this.options.onMoveStart?.(),i().emitter.emit("gestureHijackStart",t)}handleMovePointerMove=t=>{this.isMoving&&this.dragStartPosition&&this.options.onMoveMove?.(t)};handleMovePointerUp=()=>{this.isMoving&&(this.isMoving=!1,this.dragStartPosition=null,this.options.onMoveEnd?.())};handleMoveCancel=()=>{this.isMoving&&(this.isMoving=!1,this.dragStartPosition=null,this.options.onMoveEnd?.())};isCurrentlyMoving(){return this.isMoving}getDragStartPosition(){return this.dragStartPosition?{...this.dragStartPosition}:null}stopMoving(){this.isMoving&&(this.isMoving=!1,this.dragStartPosition=null,this.options.onMoveEnd?.())}destroy(){this.stopMoving(),this.cleanupMoveEventListeners(),this.off("pointerdown",this.handlePointerDown),super.destroy()}}export{o as MoveControlButton};
@@ -1 +0,0 @@
1
- import{BaseControlButton as s}from"./BaseControlButton.js";import{ClickHandler as t}from"../../mixins/ClickHandler.js";class o extends s{clickHandler=null;constructor(s){super(s)}setupEvents(){this.clickHandler=new t(this,{onClick:this.options.onClick,stopPropagation:!0})}destroy(){this.clickHandler?.destroy(),super.destroy()}}export{o as RemoveControlButton};
@@ -1 +0,0 @@
1
- import{Graphics as t}from"pixi.js";import{useAppService as i}from"../../application/AppService.js";class e extends t{currentPosition=null;config;constructor(t){super(),this.setupAntiScaleListener(),this.config=t.config}setupAntiScaleListener(){i().emitter.on("antiScale",this.handleScaleChange)}handleScaleChange=()=>{this.redraw()};draw(t){const e=i();this.currentPosition=t;const{ringSize:o,ringColor:r,ringStrokeWidth:s,ringStrokeColor:n,ringStrokeDashed:c,ringStrokeDashArray:a}=this.config;this.clear();const h=e.metersToPixels(o),l=e.getApp().toFixedSize(s);this.setFillStyle({color:r}),c&&a.length>=2?this.drawDashedCircle(t,h,n,l,a):this.circle(t.x,t.y,h).fill().stroke({color:n,width:l,cap:"round",join:"round"})}drawDashedCircle(t,e,o,r,s){const n=i();this.circle(t.x,t.y,e).fill();const c=n.getApp().toFixedSize(s[0]),a=n.getApp().toFixedSize(s[1]),h=2*Math.PI*e,l=c+a,d=Math.floor(h/l);if(0===d)return void this.circle(t.x,t.y,e).stroke({color:o,width:r,cap:"round",join:"round"});const p=h/d,g=p*(c/l);for(let i=0;i<d;i++){const o=i*p/e,r=(i*p+g)/e,s=Math.max(4,Math.ceil(Math.abs(r-o)*e/2)),n=(r-o)/s;for(let i=0;i<=s;i++){const r=o+n*i,s=t.x+e*Math.cos(r),c=t.y+e*Math.sin(r);0===i?this.moveTo(s,c):this.lineTo(s,c)}}this.stroke({color:o,width:r,cap:"round",join:"round"})}redraw(){this.currentPosition&&this.draw(this.currentPosition)}destroy(){i().emitter.off("antiScale",this.handleScaleChange),super.destroy()}}export{e as Ring};
@@ -1 +0,0 @@
1
- import{BaseControlButton as t}from"./BaseControlButton.js";import{calculateCenter as o}from"../../utils/algorithm.js";import{useAppService as i}from"../../application/AppService.js";class n extends t{isRotating=!1;rotationCenter={x:0,y:0};lastAngle=0;constructor(t){super(t),this.setupRotationEventListeners()}setupRotationEventListeners(){const{emitter:t}=i();i().emitter.on("gestureHijackPointerMove",this.handleRotationPointerMove),t.on("gestureHijackPointerUp",this.handleRotationPointerUp),t.on("gestureHijackCancel",this.handleRotationCancel)}cleanupRotationEventListeners(){const{emitter:t}=i();t.off("gestureHijackPointerMove",this.handleRotationPointerMove),t.off("gestureHijackPointerUp",this.handleRotationPointerUp),t.off("gestureHijackCancel",this.handleRotationCancel)}setupEvents(){this.on("pointerdown",this.handlePointerDown.bind(this))}handlePointerDown(t){t.stopPropagation(),this.startRotation(t)}startRotation(t){this.isRotating=!0;const n=this.options.getTargetPoints();this.rotationCenter=o(n);const e=this.parent.toLocal(t.global);this.lastAngle=Math.atan2(e.y-this.rotationCenter.y,e.x-this.rotationCenter.x),this.options.onRotationStart?.(this.rotationCenter),i().emitter.emit("gestureHijackStart",t)}handleRotationPointerMove=t=>{if(!this.isRotating)return;const o=this.parent.toLocal(t.global),i=Math.atan2(o.y-this.rotationCenter.y,o.x-this.rotationCenter.x),n=i-this.lastAngle;this.options.onRotationMove?.(n),this.lastAngle=i};handleRotationPointerUp=()=>{this.isRotating&&(this.isRotating=!1,this.options.onRotationEnd?.())};handleRotationCancel=()=>{this.isRotating&&(this.isRotating=!1,this.options.onRotationEnd?.())};isCurrentlyRotating(){return this.isRotating}stopRotation(){this.isRotating&&(this.isRotating=!1,this.options.onRotationEnd?.())}destroy(){this.stopRotation(),this.cleanupRotationEventListeners(),this.off("pointerdown",this.handlePointerDown),super.destroy()}}export{n as RotateControlButton};
@@ -1 +0,0 @@
1
- import{BaseControlButton as t}from"./BaseControlButton.js";import{useAppService as i}from"../../application/AppService.js";class n extends t{isScaling=!1;initialButtonPosition=null;dragStartPosition=null;constructor(t){super(t),this.setupScaleEventListeners()}setupScaleEventListeners(){const{emitter:t}=i();t.on("gestureHijackPointerMove",this.handleScalePointerMove),t.on("gestureHijackPointerUp",this.handleScalePointerUp),t.on("gestureHijackCancel",this.handleScaleCancel)}cleanupScaleEventListeners(){const{emitter:t}=i();t.off("gestureHijackPointerMove",this.handleScalePointerMove),t.off("gestureHijackPointerUp",this.handleScalePointerUp),t.off("gestureHijackCancel",this.handleScaleCancel)}setupEvents(){this.on("pointerdown",this.handlePointerDown.bind(this))}handlePointerDown(t){t.stopPropagation(),this.startScaling(t)}startScaling(t){this.isScaling=!0,this.dragStartPosition=this.parent.toLocal(t.global);const n=this.options.getTargetPoints(),o=this.options.getButtonIndex();o>=0&&o<n.length&&(this.initialButtonPosition={...n[o]}),this.options.onScaleStart?.(o),i().emitter.emit("gestureHijackStart",t)}handleScalePointerMove=t=>{if(!this.isScaling||!this.initialButtonPosition||!this.dragStartPosition)return;const i=this.parent.toLocal(t.global),n=i.x-this.dragStartPosition.x,o=i.y-this.dragStartPosition.y,s={x:this.initialButtonPosition.x+n,y:this.initialButtonPosition.y+o};this.options.onScaleMove?.(s)};handleScalePointerUp=()=>{this.isScaling&&(this.isScaling=!1,this.initialButtonPosition=null,this.dragStartPosition=null,this.options.onScaleEnd?.())};handleScaleCancel=()=>{this.isScaling&&(this.isScaling=!1,this.initialButtonPosition=null,this.dragStartPosition=null,this.options.onScaleEnd?.())};isCurrentlyScaling(){return this.isScaling}stopScaling(){this.isScaling&&(this.isScaling=!1,this.initialButtonPosition=null,this.dragStartPosition=null,this.options.onScaleEnd?.())}destroy(){this.stopScaling(),this.cleanupScaleEventListeners(),this.off("pointerdown",this.handlePointerDown),super.destroy()}}export{n as ScaleControlButton};
@@ -1 +0,0 @@
1
- import{Container as t}from"pixi.js";import{RotateControlButton as o}from"./RotateControlButton.js";import{RemoveControlButton as e}from"./RemoveControlButton.js";import{ScaleControlButton as i}from"./ScaleControlButton.js";import{MoveControlButton as n}from"./MoveControlButton.js";import{ControlFill as s}from"./ControlFill.js";import{normalizeToRectangle as a,getDistance as r,calculateCenter as l,normalizeVector as h,createVector as d,calculatePolygonOutline as u,calculateUprightLineAngle as c,calculateCornerExtension as p,rotatePointsAroundCenter as g,getVectorLength as C,calculateScaleRatio as y}from"../../utils/algorithm.js";import{ClickHandler as x}from"../../mixins/ClickHandler.js";import{throttle as z}from"lodash-es";import{Border as B}from"./Border.js";import{FixedSizeText as S}from"./FixedSizeText.js";import{useAppService as f}from"../../application/AppService.js";class v extends t{static BUTTON_INDICES={REMOVE:0,ROTATE:1,SCALE:2,MOVE:3,FIXED:0};zoneData;zoneType;zoneConfig;controlsConfig;zoneEvents;controlFill;zoneBorder;outlineBorder;moveLine;sizeText;controlButtons;deleteButton=null;rotateButton=null;scaleButton=null;moveButton=null;totalRotationAngle=0;rotationCenter=null;initialZonePoints=[];clickHandler=null;throttledUpdateOutline;constructor(t){super();const{zoneData:o,zoneType:e,events:i={}}=t;this.zoneType=e,this.zoneEvents=i,this.zoneConfig=this.getZoneConfig(),this.controlsConfig=this.getControlsConfig();const n=this.validateAndCorrectZoneSize(o.points),s=a(n);this.zoneData={...o,points:s},this.throttledUpdateOutline=z(this.updateOutlineForScale.bind(this),30,{leading:!0,trailing:!0}),this.initializeComponents(),this.createControlButtons(),this.updateEditState(),this.setupClickHandler(),this.registerScaleListener()}registerScaleListener(){f().emitter.on("antiScale",this.throttledUpdateOutline)}updateOutlineForScale(){this.isEditingEnabled()&&(this.updateOutlineBorder(),this.updateMoveLine(),this.updateControlButtonsPosition(),this.updateSizeTextPosition())}getZoneConfig(){const t=f(),{controls:o}=t.getConfig();return o[this.zoneType]}getControlsConfig(){const t=f(),{controls:o}=t.getConfig();return o}validateAndCorrectZoneSize(t){const o=f();if(t.length<4)return t;const e=o.metersToPixels(this.zoneConfig.minSize),[i,n,,s]=t,a=r(i,n),u=r(i,s);if(a>=e&&u>=e)return t;const c=l(t),p=h(d(i,n)),g=h(d(i,s)),C=Math.max(a,e)/2,y=Math.max(u,e)/2;return[{x:c.x-p.x*C-g.x*y,y:c.y-p.y*C-g.y*y},{x:c.x+p.x*C-g.x*y,y:c.y+p.y*C-g.y*y},{x:c.x+p.x*C+g.x*y,y:c.y+p.y*C+g.y*y},{x:c.x-p.x*C+g.x*y,y:c.y-p.y*C+g.y*y}]}getEditingIdsKey(){switch(this.zoneType){case"forbiddenSweepZone":default:return"editingForbiddenSweepZoneIds";case"forbiddenMopZone":return"editingForbiddenMopZoneIds";case"cleanZone":return"editingCleanZoneIds"}}isEditingEnabled(){const t=this.getEditingIdsKey();return f().runtimeSnapshot[t].includes(this.zoneData.id)}initializeComponents(){this.outlineBorder=this.createOutlineBorder(),this.addChild(this.outlineBorder),this.controlFill=this.createControlFill(),this.addChild(this.controlFill),this.zoneBorder=this.createBorder(),this.addChild(this.zoneBorder),this.moveLine=this.createMoveLine(),this.addChild(this.moveLine),this.sizeText=this.createSizeText(),this.addChild(this.sizeText),this.controlButtons=new t,this.controlButtons.visible=this.isEditingEnabled(),this.addChild(this.controlButtons),this.drawZone()}createControlButtons(){const t=this.calculateOutlinePoints();if(t.length<4)return;this.deleteButton=new e({iconAlias:"deleteIcon",backgroundColor:this.zoneConfig.iconWrapperFillColor,onClick:this.handleDelete}),this.deleteButton.position.set(t[v.BUTTON_INDICES.REMOVE].x,t[v.BUTTON_INDICES.REMOVE].y),this.zoneConfig.showRotateButton&&(this.rotateButton=new o({iconAlias:"rotateIcon",backgroundColor:this.zoneConfig.iconWrapperFillColor,getTargetPoints:()=>this.zoneData.points,onRotationStart:this.handleRotationStart,onRotationMove:this.handleRotationMove,onRotationEnd:this.handleRotationEnd}),this.rotateButton.position.set(t[v.BUTTON_INDICES.ROTATE].x,t[v.BUTTON_INDICES.ROTATE].y)),this.scaleButton=new i({iconAlias:"scaleIcon",backgroundColor:this.zoneConfig.iconWrapperFillColor,getTargetPoints:()=>this.zoneData.points,getButtonIndex:()=>v.BUTTON_INDICES.SCALE,onScaleStart:this.handleScaleStart,onScaleMove:this.handleScaleMove,onScaleEnd:this.handleScaleEnd}),this.scaleButton.position.set(t[v.BUTTON_INDICES.SCALE].x,t[v.BUTTON_INDICES.SCALE].y);const s=this.calculateMoveButtonPosition();this.moveButton=new n({iconAlias:"moveIcon",backgroundColor:this.zoneConfig.iconWrapperFillColor,onMoveStart:this.handleMoveStart,onMoveMove:this.handleMove,onMoveEnd:this.handleMoveEnd}),this.moveButton.position.set(s.x,s.y),this.controlButtons.addChild(this.deleteButton),this.rotateButton&&this.controlButtons.addChild(this.rotateButton),this.controlButtons.addChild(this.scaleButton),this.controlButtons.addChild(this.moveButton)}createControlFill(){const t=this.isEditingEnabled();return new s({points:this.zoneData.points,fillColor:this.zoneConfig.fillColor,enableInteraction:t,onDragStart:this.handleDragStart,onDragMove:this.handleDragMove,onDragEnd:this.handleDragEnd})}createBorder(){const t=this.isEditingEnabled()?this.zoneConfig.editing:this.zoneConfig.normal;return new B({points:this.zoneData.points,closePath:!0,style:{color:this.zoneConfig.strokeColor,width:this.zoneConfig.strokeWidth,isDashed:t.isDashed,dashArray:t.dashArray}})}createOutlineBorder(){const t=this.calculateOutlinePoints();return new B({points:t,closePath:!0,style:{color:this.zoneConfig.outlineStrokeColor,width:this.zoneConfig.outlineStrokeWidth,isDashed:this.zoneConfig.outlineDashed,dashArray:this.zoneConfig.outlineDashArray,fillColor:this.zoneConfig.outlineFillColor}})}createMoveLine(){const t=this.calculateOutlinePoints(),o=this.calculateMoveLinePoints(t);return new B({points:o,closePath:!1,style:{color:this.zoneConfig.outlineStrokeColor,width:this.zoneConfig.outlineStrokeWidth,isDashed:this.zoneConfig.outlineDashed,dashArray:this.zoneConfig.outlineDashArray}})}calculateOutlinePoints(){const{points:t}=this.zoneData;if(t.length<4)return t;const o=f().getApp().toFixedSize(this.zoneConfig.outlineOffset);return u(t,o)}calculateMoveLinePoints(t){return t.length<4?[]:[t[v.BUTTON_INDICES.MOVE],this.calculateMoveButtonPosition()]}createSizeText(){const t=this.calculateZoneSizeText(),o=new S({text:t,style:{fontSize:this.controlsConfig.textFontSize,fontFamily:this.controlsConfig.textFontFamily,fontWeight:this.controlsConfig.textFontWeight,fill:this.zoneConfig.textColor,align:"center"}});o.anchor.set(.5);const e=this.calculateSizeTextPosition();o.position.set(e.x,e.y);const i=this.calculateSizeTextRotation();return o.rotation=i,o.eventMode="none",o}calculateZoneSizeText(){const{points:t}=this.zoneData;if(t.length<4)return"0m*0m";const[o,e,,i]=t,n=r(o,e),s=r(o,i),a=f(),l=a.pixelsToMeters(n),h=a.pixelsToMeters(s);return`${l.toFixed(1)}${this.controlsConfig.unitLabel}*${h.toFixed(1)}${this.controlsConfig.unitLabel}`}calculateSizeTextPosition(){const{points:t}=this.zoneData;if(t.length<4)return{x:0,y:0};const[o,e,i,n]=t,{textPosition:s,textOffset:a}=this.zoneConfig,r=f().getApp().toFixedSize(a);let l,u;switch(s){case"top":{l={x:(o.x+e.x)/2,y:(o.y+e.y)/2};const t=h(d(e,o)),i={x:t.y,y:-t.x};u={x:i.x*r,y:i.y*r};break}case"right":{l={x:(e.x+i.x)/2,y:(e.y+i.y)/2};const t=h(d(e,i)),o={x:t.y,y:-t.x};u={x:o.x*r,y:o.y*r};break}case"bottom":{l={x:(n.x+i.x)/2,y:(n.y+i.y)/2};const t=h(d(n,i)),o={x:-t.y,y:t.x};u={x:o.x*r,y:o.y*r};break}case"left":{l={x:(o.x+n.x)/2,y:(o.y+n.y)/2};const t=h(d(n,o)),e={x:t.y,y:-t.x};u={x:e.x*r,y:e.y*r};break}default:l={x:(o.x+e.x)/2,y:(o.y+e.y)/2},u={x:0,y:r}}return{x:l.x+u.x,y:l.y+u.y}}calculateSizeTextRotation(){const{points:t}=this.zoneData;if(t.length<4)return 0;const[o,e,i,n]=t,{textPosition:s}=this.zoneConfig;let a,r;switch(s){case"top":default:a=o,r=e;break;case"right":a=e,r=i;break;case"bottom":a=i,r=n;break;case"left":a=n,r=o}return c(a,r)}calculateMoveButtonPosition(){const t=this.calculateOutlinePoints();if(t.length<4)return{x:0,y:0};const o=f(),{controls:e}=o.getConfig(),i=t[v.BUTTON_INDICES.MOVE],n=t[2],s=t[0],a=o.getApp().toFixedSize(e.moveButtonOffset);return p(i,n,s,a)}handleDragStart=()=>{if(!this.isEditingEnabled())return;const t=f();this.initialZonePoints=this.zoneData.points.map(t=>({...t})),t.getApp().requestRender("zone-drag",!0)};handleDragMove=t=>{if(!this.isEditingEnabled()||0===this.initialZonePoints.length)return;const o=this.parent.toLocal(t.global),e=this.controlFill.getDragStartPosition();if(!e)return;const i=o.x-e.x,n=o.y-e.y;this.applyTranslation(i,n)};handleDragEnd=()=>{const t=f();this.initialZonePoints=[],t.getApp().stopRender("zone-drag"),this.zoneEvents.onUpdate?.(this.getZoneData())};applyTranslation(t,o){this.zoneData.points=this.initialZonePoints.map(e=>({x:e.x+t,y:e.y+o})),this.drawZone(),this.updateControlButtonsPosition()}handleRotationStart=t=>{const o=f();this.totalRotationAngle=0,this.rotationCenter=t,this.initialZonePoints=this.zoneData.points.map(t=>({...t})),o.getApp().requestRender("zone-rotate",!0)};handleRotationMove=t=>{this.totalRotationAngle+=t,this.applyRotation(t)};handleRotationEnd=()=>{const t=f();this.rotationCenter=null,this.totalRotationAngle=0,this.initialZonePoints=[],t.getApp().stopRender("zone-rotate"),this.zoneEvents.onUpdate?.(this.getZoneData())};applyRotation(t){this.rotationCenter&&(this.zoneData.points=g(this.zoneData.points,this.rotationCenter,t),this.drawZone(),this.updateControlButtonsPosition())}handleScaleStart=()=>{const t=f();this.initialZonePoints=this.zoneData.points.map(t=>({...t})),t.getApp().requestRender("zone-scale",!0)};handleScaleMove=t=>{0!==this.initialZonePoints.length&&this.applyEdgeBasedScale(t)};handleScaleEnd=()=>{const t=f();this.initialZonePoints=[],t.getApp().stopRender("zone-scale"),this.zoneEvents.onUpdate?.(this.getZoneData())};applyEdgeBasedScale(t){if(this.initialZonePoints.length<4)return;const o=f(),{FIXED:e}=v.BUTTON_INDICES,{x:i,y:n}=this.initialZonePoints[e],[,s,,a]=this.initialZonePoints,r={x:i,y:n},l=d(r,s),h=d(r,a),u=d(r,t),c=C(l),p=C(h);if(0===c||0===p)return;const g=o.metersToPixels(this.zoneConfig.minSize),[x,z]=[y(u,l,c,g),y(u,h,p,g)];this.zoneData.points=[r,{x:i+l.x*x,y:n+l.y*x},{x:i+l.x*x+h.x*z,y:n+l.y*x+h.y*z},{x:i+h.x*z,y:n+h.y*z}],this.drawZone(),this.updateControlButtonsPosition()}handleMoveStart=()=>{const t=f();this.initialZonePoints=this.zoneData.points.map(t=>({...t})),t.getApp().requestRender("zone-move",!0)};handleMove=t=>{if(!this.isEditingEnabled()||0===this.initialZonePoints.length)return;const o=this.parent.toLocal(t.global),e=this.moveButton?.getDragStartPosition();if(!e)return;const i=o.x-e.x,n=o.y-e.y;this.applyTranslation(i,n)};handleMoveEnd=()=>{const t=f();this.initialZonePoints=[],t.getApp().stopRender("zone-move"),this.zoneEvents.onUpdate?.(this.getZoneData())};handleDelete=()=>{this.zoneEvents.onRemove?.(this.zoneData.id)};setupClickHandler(){this.clickHandler=new x(this,{onClick:()=>{this.isEditingEnabled()||this.zoneEvents?.onClick?.(this.getZoneData())},stopPropagation:!1})}drawZone(){const{points:t}=this.zoneData;t.length<4||(this.controlFill.updatePoints(t),this.zoneBorder.updatePoints(t),this.updateOutlineBorder(),this.updateMoveLine(),this.updateSizeText())}updateOutlineBorder(){const t=this.calculateOutlinePoints();this.outlineBorder.updatePoints(t)}updateMoveLine(){const t=this.calculateOutlinePoints(),o=this.calculateMoveLinePoints(t);this.moveLine.updatePoints(o)}updateSizeText(){if(!this.sizeText)return;const t=this.calculateZoneSizeText();this.sizeText.updateText(t),this.updateSizeTextPosition()}updateSizeTextPosition(){if(!this.sizeText)return;const t=this.calculateSizeTextPosition();this.sizeText.position.set(t.x,t.y);const o=this.calculateSizeTextRotation();this.sizeText.rotation=o}updateControlButtonsPosition(){if(!this.deleteButton||!this.scaleButton||!this.moveButton)return;const t=this.calculateOutlinePoints();if(t.length<4)return;const{REMOVE:o,ROTATE:e,SCALE:i}=v.BUTTON_INDICES,n=this.calculateMoveButtonPosition(),s=[{button:this.deleteButton,point:t[o]},{button:this.scaleButton,point:t[i]},{button:this.moveButton,point:n}];this.rotateButton&&s.push({button:this.rotateButton,point:t[e]}),s.forEach(({button:t,point:o})=>t.position.set(o.x,o.y))}updateEditState(){const t=this.isEditingEnabled();this.controlButtons.visible=t,!t&&this.getCurrentOperationState().hasAnyOperation&&this.stopAllOperations(),this.outlineBorder.visible=t,this.moveLine.visible=t,this.sizeText&&(this.sizeText.visible=t),t&&(this.updateOutlineBorder(),this.updateMoveLine(),this.updateControlButtonsPosition(),this.updateSizeTextPosition()),this.controlFill.setInteractionEnabled(t),this.updateBorderStyle(t?this.zoneConfig.editing:this.zoneConfig.normal),this.zIndex=t?1e3:0}updateBorderStyle(t){this.zoneBorder.updateStyle({isDashed:t.isDashed,dashArray:t.dashArray})}getCurrentOperationState(){const t=this.controlFill.isCurrentlyDragging(),o=this.scaleButton?.isCurrentlyScaling()||!1,e=this.rotateButton?.isCurrentlyRotating()||!1,i=this.moveButton?.isCurrentlyMoving()||!1;return{isDragging:t,isScaling:o,isRotating:e,isMoving:i,hasAnyOperation:t||o||e||i}}stopAllOperations(){this.controlFill.stopDragging(),this.scaleButton?.stopScaling(),this.rotateButton?.stopRotation(),this.moveButton?.stopMoving()}stopDragging(){this.controlFill.stopDragging()}stopScaling(){this.scaleButton?.stopScaling()}stopRotating(){this.rotateButton?.stopRotation()}stopMoving(){this.moveButton?.stopMoving()}isCurrentlyDragging(){return this.controlFill.isCurrentlyDragging()}isCurrentlyScaling(){return this.scaleButton?.isCurrentlyScaling()||!1}isCurrentlyRotating(){return this.rotateButton?.isCurrentlyRotating()||!1}isCurrentlyMoving(){return this.moveButton?.isCurrentlyMoving()||!1}updateZoneData(t){const o=this.validateAndCorrectZoneSize(t.points),e=a(o);this.zoneData={...t,points:e},this.drawZone(),this.updateControlButtonsPosition(),this.updateEditState()}getZoneData(){return{...this.zoneData}}destroy(){f().emitter.off("antiScale",this.throttledUpdateOutline),this.clickHandler?.destroy(),this.clickHandler=null,this.deleteButton?.destroy(),this.rotateButton?.destroy(),this.scaleButton?.destroy(),this.moveButton?.destroy(),this.deleteButton=null,this.rotateButton=null,this.scaleButton=null,this.moveButton=null,this.zoneBorder?.destroy(),this.outlineBorder?.destroy(),this.moveLine?.destroy(),this.sizeText?.destroy(),this.controlFill?.destroy(),this.controlButtons?.destroy(),super.destroy()}}export{v as Zone};
@@ -1 +0,0 @@
1
- import{EnhancedSprite as i}from"../Base/EnhancedSprite.js";import{useAppService as t}from"../../application/AppService.js";class n extends i{constructor(){super(),this.initializeSprite()}async initializeSprite(){const i=t();await this.loadTextureAndSetSize("chargingStation",i.chargingStationConfig.icon)}async draw({x:i,y:n,rotation:a}){const o=t();super.draw({x:i,y:n,rotation:a},()=>o.runtimeSnapshot.showChargingStation)}}export{n as ChargingStationIcon};
@@ -1 +0,0 @@
1
- import{Container as i}from"pixi.js";import{ChargingStationIcon as t}from"./ChargingStationIcon.js";import{LAYER_CHARGING_STATION as n}from"../../application/AppContainer.js";import{subscribeKey as r}from"valtio/vanilla/utils";import{Ring as s}from"../Base/Ring.js";import{Logger as o}from"../../utils/logger.js";import{useAppService as a}from"../../application/AppService.js";class g extends i{chargingStation;ring;unsubscribeFns=[];constructor(){super();const i=a();i.appContainer.addToLayer(n,this),this.ring=new s({config:i.chargingStationConfig}),this.ring.visible=i.runtimeSnapshot.showChargingStationRing,this.addChild(this.ring),this.chargingStation=new t,this.addChild(this.chargingStation);const g=r(i.runtime,"showChargingStationRing",i=>{o.log(`[runtime] showChargingStationRing: ${i}`),this.ring.visible=i});this.unsubscribeFns.push(g)}async draw({x:i,y:t,rotation:n}){0===i&&0===t||(this.ring.draw({x:i,y:t}),await this.chargingStation.draw({x:i,y:t,rotation:n}))}destroy(){this.unsubscribeFns.forEach(i=>i()),this.unsubscribeFns=[],this.ring.destroy(),super.destroy()}}export{g as ChargingStation};
@@ -1 +0,0 @@
1
- import{Zone as e}from"../Base/Zone.js";import{useAppService as n}from"../../application/AppService.js";class o extends e{constructor(e){const o=n();super({zoneData:e.zoneData,zoneType:"cleanZone",events:{onRemove:e=>{o.events?.onRemoveCleanZone?.(e)},onUpdate:e=>{o.events?.onUpdateCleanZone?.(e)},onClick:e=>{o.events?.onClickCleanZone?.(e)}}})}static create(e){return new o({zoneData:e})}}export{o as CleanZone};
@@ -1 +0,0 @@
1
- import{Container as i,Polygon as t,Graphics as e}from"pixi.js";import{DashLine as n}from"../Base/DashLine.js";import{EndPoint as s}from"../Base/EndPoint.js";import{calculateLineEndpoints as o,calculateLineSegmentHitArea as r,sampleLinePoints as d,getDistance as a,extendLineSegment as h,isPointInPolygon as l,lineIntersectsBox as g}from"../../utils/algorithm.js";import{throttle as c}from"lodash-es";import{Logger as u}from"../../utils/logger.js";import{useAppService as p}from"../../application/AppService.js";class P extends i{endPoints;dividerConfig;dividerEvents;roomId;roomGeometry=null;dashLine;solidLine=null;startEndPoint;endEndPoint;solidLinePoints=null;initialDividerPoints=[];isDragging=!1;dragStartPosition=null;throttledHandleScaleChange;constructor(i){super();const{endPoints:t,roomId:e,events:n={}}=i;this.dividerEvents=n,this.roomId=e;const s=p();this.dividerConfig=s.dividerConfig,this.roomGeometry=s.mapManager.getRoomById(this.roomId)||null,this.endPoints=t?this.validateDividerPoints(t):this.createDefaultdividerPoints(),this.throttledHandleScaleChange=c(this.handleScaleChange.bind(this),30,{leading:!0,trailing:!0}),this.initializeComponents(),this.calculateAndCreateSolidLine(),this.registerScaleListener(),this.setupDragEventListeners()}validateDividerPoints(i){if(i.length>=2)return i.slice(0,2);const t=i[0]||{x:0,y:0};return[t,{x:t.x+50,y:t.y}]}createDefaultdividerPoints(){if(!this.roomGeometry)return u.warn("Room geometry not available, creating fallback divider"),[{x:0,y:0},{x:100,y:0}];const i=p(),t=i.getApp().mapState;if(!t)return u.warn("Map state not available, creating fallback divider"),[{x:0,y:0},{x:100,y:0}];const{boundingBox:e}=this.roomGeometry,n=i.getApp().toFixedSize(this.dividerConfig.defaultExtension),s=this.dividerConfig.defaultDirection,r=e.x+e.width/2,d=e.y+e.height/2,a="horizontal"===s?e.width+2*n:e.height+2*n;return o(r,d,a,s).map(i=>({x:i.x-t.origin.x,y:i.y-t.origin.y}))}initializeComponents(){this.createDashLine(),this.addChild(this.dashLine),this.createEndPoints(),this.addChild(this.startEndPoint),this.addChild(this.endEndPoint),this.setupDashLineInteraction()}createDashLine(){const i=this.endPoints;if(i.length<2)return;const{dashLineWidth:t,dashLineDashArray:e,lineColor:s}=this.dividerConfig;this.dashLine=new n({start:i[0],end:i[1],style:{color:s.toString(),width:t,dashArray:e}})}createEndPoints(){const i=this.endPoints;this.startEndPoint=new s({position:i[0],config:this.dividerConfig,onDragStart:this.handleEndPointDragStart,onDragMove:i=>this.handleEndPointDragMove(0,i),onDragEnd:this.handleEndPointDragEnd}),this.endEndPoint=new s({position:i[1],config:this.dividerConfig,onDragStart:this.handleEndPointDragStart,onDragMove:i=>this.handleEndPointDragMove(1,i),onDragEnd:this.handleEndPointDragEnd})}setupDashLineInteraction(){this.dashLine&&(this.setupDashLineHitArea(),this.dashLine.off("pointerdown",this.handleDashLinePointerDown),this.dashLine.on("pointerdown",this.handleDashLinePointerDown))}setupDashLineHitArea(){const i=p();if(!this.dashLine)return;const e=this.endPoints;if(e.length<2)return;const{hitAreaThickness:n}=this.dividerConfig,s=i.getApp().toFixedSize(n),o=r(e[0],e[1],s);if(0===o.length)return;const d=new t(o);this.dashLine.hitArea=d}handleEndPointDragStart=()=>{const i=p();this.initialDividerPoints=this.endPoints.map(i=>({...i})),this.clearSolidLine(),i.getApp().requestRender("divider-endpoint-drag",!0)};handleEndPointDragMove=(i,t)=>{0!==this.initialDividerPoints.length&&(this.endPoints[i]=t,this.updateDashLine(),this.updateSolidLine(),this.setupDashLineHitArea())};handleEndPointDragEnd=()=>{const i=p();this.initialDividerPoints=[],i.getApp().stopRender("divider-endpoint-drag"),this.calculateAndCreateSolidLine(),this.checkAndResetIfOutOfRoom(),this.dividerEvents.onUpdate?.(this.getDividerEndPoints())};handleDashLinePointerDown=i=>{i.stopPropagation(),this.startDragging(i)};startDragging(i){const t=p();this.isDragging=!0;const e=this.parent.toLocal(i.global);this.dragStartPosition={x:e.x,y:e.y},this.initialDividerPoints=this.endPoints.map(i=>({...i})),this.clearSolidLine(),t.getApp().requestRender("divider-drag",!0),p().emitter.emit("gestureHijackStart",i)}setupDragEventListeners(){const{emitter:i}=p();i.on("gestureHijackPointerMove",this.handleDragPointerMove),i.on("gestureHijackPointerUp",this.handleDragPointerUp),i.on("gestureHijackCancel",this.handleDragCancel)}cleanupDragEventListeners(){const{emitter:i}=p();i.off("gestureHijackPointerMove",this.handleDragPointerMove),i.off("gestureHijackPointerUp",this.handleDragPointerUp),i.off("gestureHijackCancel",this.handleDragCancel)}handleDragPointerMove=i=>{if(!this.isDragging||!this.dragStartPosition||0===this.initialDividerPoints.length)return;const t=this.parent.toLocal(i.global),e=t.x-this.dragStartPosition.x,n=t.y-this.dragStartPosition.y;this.endPoints=this.initialDividerPoints.map(i=>({x:i.x+e,y:i.y+n})),this.updateAllComponents()};handleDragPointerUp=()=>{const i=p();this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,this.initialDividerPoints=[],i.getApp().stopRender("divider-drag"),this.calculateAndCreateSolidLine(),this.checkAndResetIfOutOfRoom(),this.dividerEvents.onUpdate?.(this.getDividerEndPoints()))};handleDragCancel=()=>{const i=p();this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,this.initialDividerPoints=[],i.getApp().stopRender("divider-drag"),this.calculateAndCreateSolidLine(),this.checkAndResetIfOutOfRoom(),this.dividerEvents.onUpdate?.(this.getDividerEndPoints()))};updateAllComponents(){this.updateDashLine(),this.updateSolidLine(),this.updateEndPoints(),this.setupDashLineHitArea()}updateDashLine(){const i=this.endPoints;i.length<2||!this.dashLine||this.dashLine.updatePoints(i[0],i[1])}updateSolidLine(){if(!this.solidLine||!this.solidLinePoints)return;const{solidLineWidth:i,lineColor:t}=this.dividerConfig,e=p().getApp().toFixedSize(i);this.solidLine.clear(),this.solidLine.setStrokeStyle({color:t.toString(),width:e}).moveTo(this.solidLinePoints[0].x,this.solidLinePoints[0].y).lineTo(this.solidLinePoints[1].x,this.solidLinePoints[1].y).stroke()}updateEndPoints(){const i=this.endPoints;this.startEndPoint&&this.startEndPoint.updatePosition(i[0]),this.endEndPoint&&this.endEndPoint.updatePosition(i[1])}registerScaleListener(){const{emitter:i}=p();i.on("antiScale",this.throttledHandleScaleChange)}handleScaleChange=()=>{this.startEndPoint?.redraw(),this.endEndPoint?.redraw(),this.updateSolidLine(),this.setupDashLineHitArea()};getDividerEndPoints(){return[...this.endPoints]}getEffectiveDividerPoints(){return this.solidLinePoints?[...this.solidLinePoints]:null}calculateAndCreateSolidLine(){if(this.clearSolidLine(),!this.roomId)return;if(!this.getRoomGraphics())return;const i=this.calculateLineRoomIntersection();i&&i.length>=2&&(this.solidLinePoints=[i[0],i[i.length-1]],this.createSolidLine())}getRoomGraphics(){const i=p().mapManager.roomFill;return i&&this.roomId&&i.getRoomGraphicsMap().get(this.roomId)||null}calculateLineRoomIntersection(){const i=this.endPoints;if(i.length<2)return null;if(!this.roomId)return null;const[t,e]=i,n=this.isPointInRoomFill(t),s=this.isPointInRoomFill(e);if(n||s)return null;const o=d(t,e),r=[];for(const i of o)this.isPointInRoomFill(i)&&r.push(i);if(0===r.length)return null;const l=r[0],g=r[r.length-1];return a(l,g)<3?null:h(l,g,.5)}isPointInRoomFill(i){if(!this.roomId)return!1;const t=p().getApp().mapState;if(!t)return!1;const e={x:i.x+t.origin.x,y:i.y+t.origin.y};return"raster"===t.mapType?this.isPointInRasterRoomFill(e):this.isPointInStructuredRoomFill(e)}isPointInRasterRoomFill(i){i.x-=.5,i.y-=.5;const t=p(),e=t.getApp().mapState,n=t.mapManager.roomFill;if(!e||!n)return!1;const s=n.getRasterRoomData(this.roomId);if(!s)return!1;const o=n.getMapWidth();if(0===o)return!1;const r=Math.round(i.y)*o+Math.round(i.x);for(let i=0;i<s.pixelIndices.length;i++)if(s.pixelIndices[i]===r)return!0;return!1}isPointInStructuredRoomFill(i){const t={x:Math.round(i.x),y:Math.round(i.y)},e=p(),n=e.getApp().mapState,s=e.mapManager.getRoomById(this.roomId);return!!(n&&s&&s.outlinePoints)&&l(t,s.outlinePoints,!0)}isDividerCompletelyOutOfRoom(){if(!this.roomGeometry)return!1;const{boundingBox:i}=this.roomGeometry,t=this.endPoints;if(t.length<2)return!1;const e=p().getApp().mapState;if(!e)return!1;const n={x:t[0].x+e.origin.x,y:t[0].y+e.origin.y},s={x:t[1].x+e.origin.x,y:t[1].y+e.origin.y};return!g(n,s,i.x,i.y,i.width,i.height)}checkAndResetIfOutOfRoom(){const i=p(),{resetDividerWhenOutOfRoom:t}=i.dividerConfig;t&&this.isDividerCompletelyOutOfRoom()&&this.resetToDefaultState()}resetToDefaultState(){this.endPoints=this.createDefaultdividerPoints(),this.calculateAndCreateSolidLine(),this.updateComponents(),this.dividerEvents.onUpdate?.(this.endPoints)}updateComponents(){const i=this.endPoints;i.length>=2&&(this.dashLine.updatePoints(i[0],i[1]),this.startEndPoint.position.set(i[0].x,i[0].y),this.endEndPoint.position.set(i[1].x,i[1].y),this.setupDashLineInteraction())}createSolidLine(){if(!this.solidLinePoints)return;const{solidLineWidth:i,lineColor:t}=this.dividerConfig,n=p();this.solidLine=new e,this.solidLine.eventMode="none";const s=n.getApp().toFixedSize(i);this.solidLine.setStrokeStyle({color:t.toString(),width:s}).moveTo(this.solidLinePoints[0].x,this.solidLinePoints[0].y).lineTo(this.solidLinePoints[1].x,this.solidLinePoints[1].y).stroke(),this.addChildAt(this.solidLine,0)}clearSolidLine(){this.solidLine&&(this.removeChild(this.solidLine),this.solidLine.destroy(),this.solidLine=null),this.solidLinePoints=null}updatedividerPoints(i){this.endPoints=this.validateDividerPoints(i),this.updateAllComponents(),this.calculateAndCreateSolidLine()}destroy(){p().emitter.off("antiScale",this.throttledHandleScaleChange),this.cleanupDragEventListeners(),this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,this.initialDividerPoints=[]),this.dashLine&&this.dashLine.off("pointerdown",this.handleDashLinePointerDown),this.clearSolidLine(),this.dashLine?.destroy(),this.startEndPoint?.destroy(),this.endEndPoint?.destroy(),super.destroy()}}export{P as Divider};
@@ -1 +0,0 @@
1
- import{Zone as e}from"../Base/Zone.js";import{useAppService as o}from"../../application/AppService.js";class n extends e{constructor(e){const n=o();super({zoneData:e.zoneData,zoneType:"forbiddenMopZone",events:{onRemove:e=>{n.events?.onRemoveForbiddenMopZone?.(e)},onUpdate:e=>{n.events?.onUpdateForbiddenMopZone?.(e)},onClick:e=>{n.events?.onClickForbiddenMopZone?.(e)}}})}static create(e){return new n({zoneData:e})}}export{n as ForbiddenMopZone};
@@ -1 +0,0 @@
1
- import{Zone as e}from"../Base/Zone.js";import{useAppService as o}from"../../application/AppService.js";class n extends e{constructor(e){const n=o();super({zoneData:e.zoneData,zoneType:"forbiddenSweepZone",events:{onRemove:e=>{n.events?.onRemoveForbiddenSweepZone?.(e)},onUpdate:e=>{n.events?.onUpdateForbiddenSweepZone?.(e)},onClick:e=>{n.events?.onClickForbiddenSweepZone?.(e)}}})}static create(e){return new n({zoneData:e})}}export{n as ForbiddenSweepZone};
@@ -1 +0,0 @@
1
- import{Container as t}from"pixi.js";import{ControlFill as i}from"../Base/ControlFill.js";import{Border as e}from"../Base/Border.js";import{FixedSizeText as s}from"../Base/FixedSizeText.js";import{ClickHandler as o}from"../../mixins/ClickHandler.js";import{throttle as n}from"lodash-es";import{EnhancedSprite as a}from"../Base/EnhancedSprite.js";import{useAppService as r}from"../../application/AppService.js";class l extends t{spotData;spotConfig;controlsConfig;spotEvents;controlFill;spotBorder;centerIcon;sizeText;clickHandler=null;initialSpotPoint=null;throttledUpdateScale;constructor(t){super();const{spotData:i,events:e={}}=t,s=r();this.spotData=i,this.spotEvents=e,this.controlsConfig=s.controlsConfig,this.spotConfig=s.controlsConfig.spot,this.throttledUpdateScale=n(this.updateScale.bind(this),30,{leading:!0,trailing:!0}),this.initializeComponents(),this.updateEditState(),this.setupClickHandler(),this.registerScaleListener()}registerScaleListener(){r().emitter.on("antiScale",this.throttledUpdateScale)}updateScale(){this.isEditingEnabled()&&this.updateSizeTextPosition()}isEditingEnabled(){return r().runtimeSnapshot.editingSpotIds.includes(this.spotData.id)}calculateRectanglePoints(){const t=r(),{point:i}=this.spotData,{size:e}=this.spotConfig,s=t.metersToPixels(e)/2;return[{x:i.x-s,y:i.y-s},{x:i.x+s,y:i.y-s},{x:i.x+s,y:i.y+s},{x:i.x-s,y:i.y+s}]}initializeComponents(){const t=this.calculateRectanglePoints();this.controlFill=this.createControlFill(t),this.addChild(this.controlFill),this.spotBorder=this.createBorder(t),this.addChild(this.spotBorder),this.centerIcon=this.createCenterIcon(),this.addChild(this.centerIcon),this.sizeText=this.createSizeText(),this.addChild(this.sizeText),this.drawSpot()}createControlFill(t){const e=this.isEditingEnabled();return new i({points:t,fillColor:this.spotConfig.fillColor,enableInteraction:e,onDragStart:this.handleDragStart,onDragMove:this.handleDragMove,onDragEnd:this.handleDragEnd})}createBorder(t){const i=this.isEditingEnabled()?this.spotConfig.editing:this.spotConfig.normal;return new e({points:t,closePath:!0,style:{color:this.spotConfig.strokeColor,width:this.spotConfig.strokeWidth,isDashed:i.isDashed,dashArray:i.dashArray}})}createCenterIcon(){const t=new a;return this.loadIconTexture(t),t.position.set(this.spotData.point.x,this.spotData.point.y),t.eventMode="none",t.visible=!1,t}async loadIconTexture(t){const{iconSize:i}=this.spotConfig;await t.loadTextureAndSetSize("spotIcon",{width:i,height:i,sizeFixed:!1}),t.visible=this.isEditingEnabled()}createSizeText(){const t=this.calculateSpotSizeText(),i=new s({text:t,style:{fontSize:this.controlsConfig.textFontSize,fontFamily:this.controlsConfig.textFontFamily,fontWeight:this.controlsConfig.textFontWeight,fill:this.spotConfig.textColor,align:"center"}});i.anchor.set(.5);const e=this.calculateSizeTextPosition();return i.position.set(e.x,e.y),i.eventMode="none",i}calculateSpotSizeText(){const{size:t}=this.spotConfig;return`${t.toFixed(1)}${this.controlsConfig.unitLabel}*${t.toFixed(1)}${this.controlsConfig.unitLabel}`}calculateSizeTextPosition(){const t=r(),i=this.calculateRectanglePoints();if(i.length<4)return{x:0,y:0};const[e,s,o,n]=i,{textPosition:a,textOffset:l}=this.spotConfig,h=t.getApp().toFixedSize(l);let c,d;switch(a){case"top":default:c={x:(e.x+s.x)/2,y:(e.y+s.y)/2},d={x:c.x,y:c.y+h};break;case"right":c={x:(s.x+o.x)/2,y:(s.y+o.y)/2},d={x:c.x+h,y:c.y};break;case"bottom":c={x:(n.x+o.x)/2,y:(n.y+o.y)/2},d={x:c.x,y:c.y+h};break;case"left":c={x:(e.x+n.x)/2,y:(e.y+n.y)/2},d={x:c.x-h,y:c.y}}return d}handleDragStart=()=>{const t=r();this.isEditingEnabled()&&(this.initialSpotPoint={...this.spotData.point},t.getApp().requestRender("spot-drag",!0))};handleDragMove=t=>{if(!this.isEditingEnabled()||!this.initialSpotPoint)return;const i=this.parent.toLocal(t.global),e=this.controlFill.getDragStartPosition();if(!e)return;const s=i.x-e.x,o=i.y-e.y;this.applyTranslation(s,o)};handleDragEnd=()=>{const t=r();this.initialSpotPoint=null,t.getApp().stopRender("spot-drag"),this.spotEvents.onUpdate?.(this.getSpotData())};applyTranslation(t,i){this.initialSpotPoint&&(this.spotData.point={x:this.initialSpotPoint.x+t,y:this.initialSpotPoint.y+i},this.drawSpot())}setupClickHandler(){this.clickHandler=new o(this,{onClick:()=>{this.isEditingEnabled()||this.spotEvents?.onClick?.(this.getSpotData())},stopPropagation:!1})}drawSpot(){const t=this.calculateRectanglePoints();this.controlFill.updatePoints(t),this.spotBorder.updatePoints(t),this.centerIcon.position.set(this.spotData.point.x,this.spotData.point.y),this.updateSizeText()}updateSizeText(){if(!this.sizeText)return;const t=this.calculateSpotSizeText();this.sizeText.updateText(t),this.updateSizeTextPosition()}updateSizeTextPosition(){if(!this.sizeText)return;const t=this.calculateSizeTextPosition();this.sizeText.position.set(t.x,t.y)}updateEditState(){const t=this.isEditingEnabled();if(this.sizeText&&(this.sizeText.visible=t),this.centerIcon&&(this.centerIcon.visible=t),this.controlFill&&this.controlFill.setInteractionEnabled(t),this.spotBorder){const i=t?this.spotConfig.editing:this.spotConfig.normal;this.spotBorder.updateStyle({isDashed:i.isDashed,dashArray:i.dashArray})}this.zIndex=t?1e3:0}updateSpotData(t){this.spotData={...t},this.drawSpot(),this.updateEditState()}getSpotData(){return{...this.spotData}}destroy(){r().emitter.off("antiScale",this.throttledUpdateScale),this.clickHandler?.destroy(),this.clickHandler=null,this.controlFill?.destroy(),this.spotBorder?.destroy(),this.centerIcon?.destroy(),this.sizeText?.destroy(),super.destroy()}static create(t){const i=r();return new l({spotData:t,events:{onUpdate:t=>{i.events?.onUpdateSpot?.(t)},onClick:t=>{i.events?.onClickSpot?.(t)}}})}}export{l as Spot};
@@ -1 +0,0 @@
1
- import{Container as t,Graphics as i,Polygon as e}from"pixi.js";import{getDistance as n,normalizeVector as l,createVector as o,calculateLineMidpointOffset as s,calculateUprightLineAngle as a,calculateLineSegmentOutline as r,calculateCornerExtension as h,calculateLineSegmentHitArea as d}from"../../utils/algorithm.js";import{throttle as c}from"lodash-es";import{ClickHandler as u}from"../../mixins/ClickHandler.js";import{Border as g}from"../Base/Border.js";import{DashLine as p}from"../Base/DashLine.js";import{FixedSizeText as w}from"../Base/FixedSizeText.js";import{MoveControlButton as C}from"../Base/MoveControlButton.js";import{RemoveControlButton as f}from"../Base/RemoveControlButton.js";import{ScaleControlButton as L}from"../Base/ScaleControlButton.js";import{useAppService as v}from"../../application/AppService.js";class m extends t{static BUTTON_INDICES={REMOVE:0,SCALE:2,MOVE:3};wallData;wallConfig;controlsConfig;wallEvents;wallLine;outlineBorder;moveLine;lengthText;controlButtons;removeButton=null;scaleButton=null;moveButton=null;initialWallPoints=[];isDragging=!1;dragStartPosition=null;throttledUpdateOutline;throttledHandleScaleChange;wallLineClickHandler=null;constructor(t){super();const{wallData:i,events:e={}}=t;this.wallEvents=e;const n=v();this.wallConfig=n.controlsConfig.virtualWall,this.controlsConfig=n.controlsConfig,this.wallData={...i,points:this.validateAndCorrectWallLength(i.points)},this.throttledHandleScaleChange=c(this.handleScaleChange.bind(this),30,{leading:!0,trailing:!0}),this.throttledUpdateOutline=c(this.updateOutlineForScale.bind(this),30,{leading:!0,trailing:!0}),this.initializeComponents(),this.updateEditState(),this.registerScaleListener(),this.setupDragEventListeners()}validateAndCorrectWallLength(t){const i=v();if(t.length<2)return t;const[e,s]=t,a=i.metersToPixels(this.wallConfig.minWidth),r=n(e,s);if(r>=a)return t;if(0===r)return[e,{x:e.x+a,y:e.y}];const h=l(o(e,s));return[e,{x:e.x+h.x*a,y:e.y+h.y*a}]}isEditingEnabled(){return v().runtimeSnapshot.editingVirtualWallIds.includes(this.wallData.id)}updateOutlineForScale(){this.isEditingEnabled()&&(this.updateOutlineComponents(),this.updateControlButtonsPosition(),this.updateLengthTextPosition())}initializeComponents(){this.outlineBorder=this.createOutlineBorder(),this.addChild(this.outlineBorder),this.createWallLine(!1),this.addChild(this.wallLine),this.lengthText=this.createLengthText(),this.addChild(this.lengthText),this.moveLine=this.createMoveLine(),this.addChild(this.moveLine),this.controlButtons=new t,this.controlButtons.visible=this.isEditingEnabled(),this.addChild(this.controlButtons),this.createControlButtons()}createWallLine(t=!0){const{points:i}=this.wallData;if(i.length<2)return;const{lineWidth:e,lineColor:n,editing:l,normal:o}=this.wallConfig,s=this.isEditingEnabled()?l:o;s.isDashed?this.wallLine=new p({start:i[0],end:i[1],style:{color:n.toString(),width:e,dashArray:s.dashArray}}):this.wallLine=this.createSolidLine(i[0],i[1],e,n.toString()),t&&this.setupWallLineInteraction()}createLengthText(){const t=this.calculateWallLengthInMeters(),i=this.formatLengthText(t),e=new w({text:i,style:{fontSize:this.controlsConfig.textFontSize,fontFamily:this.controlsConfig.textFontFamily,fontWeight:this.controlsConfig.textFontWeight,fill:this.wallConfig.textColor,align:"center"}});e.anchor.set(.5);const n=this.calculateTextPosition();e.position.set(n.x,n.y);const l=this.calculateTextRotation();return e.rotation=l,e.eventMode="none",e}calculateWallLengthInMeters(){const t=v(),{points:i}=this.wallData;if(i.length<2)return 0;const e=n(i[0],i[1]);return t.pixelsToMeters(e)}formatLengthText(t){return`${t.toFixed(1)}${this.controlsConfig.unitLabel}`}calculateTextPosition(){const t=v(),{points:i}=this.wallData;if(i.length<2)return{x:0,y:0};const[e,n]=i,l=t.getApp().toFixedSize(this.wallConfig.textOffset);return s(e,n,l)}calculateTextRotation(){const{points:t}=this.wallData;if(t.length<2)return 0;const[i,e]=t;return a(i,e)}getOutlineStyle(){return{color:this.wallConfig.outlineStrokeColor,width:this.wallConfig.outlineStrokeWidth,isDashed:this.wallConfig.outlineDashed,dashArray:this.wallConfig.outlineDashArray,fillColor:this.wallConfig.outlineFillColor}}createOutlineBorder(){const t=this.calculateOutlinePoints();return new g({points:t,closePath:!0,style:this.getOutlineStyle()})}createMoveLine(){const t=this.calculateOutlinePoints(),i=this.calculateMoveLinePoints(t);return new g({points:i,closePath:!1,style:this.getOutlineStyle()})}calculateOutlinePoints(t){const i=v(),e=t||this.wallData.points;if(e.length<2)return e;const n=i.getApp().toFixedSize(this.wallConfig.outlineOffset),l=r(e[0],e[1],n);return[l[3],l[2],l[1],l[0]]}calculateMoveLinePoints(t){if(t.length<4)return[];const{MOVE:i}=m.BUTTON_INDICES;return[t[i],this.calculateMoveButtonPosition()]}calculateMoveButtonPosition(){const t=v(),{moveButtonOffset:i}=this.controlsConfig,e=this.calculateOutlinePoints();if(e.length<4)return{x:0,y:0};const{MOVE:n}=m.BUTTON_INDICES,l=e[n],o=e[(n+3)%4],s=e[(n+1)%4],a=t.getApp().toFixedSize(i);return h(l,s,o,a)}createControlButtons(){const t=this.calculateOutlinePoints();if(t.length<4)return;const{REMOVE:i,SCALE:e}=m.BUTTON_INDICES;this.removeButton=new f({iconAlias:"deleteIcon",backgroundColor:this.wallConfig.iconWrapperFillColor,onClick:this.handleRemove}),this.removeButton.position.set(t[i].x,t[i].y),this.scaleButton=new L({iconAlias:"scaleIcon",backgroundColor:this.wallConfig.iconWrapperFillColor,getTargetPoints:()=>this.calculateOutlinePoints(),getButtonIndex:()=>e,onScaleStart:this.handleScaleStart,onScaleMove:this.handleScaleMove,onScaleEnd:this.handleScaleEnd}),this.scaleButton.position.set(t[e].x,t[e].y);const n=this.calculateMoveButtonPosition();this.moveButton=new C({iconAlias:"moveIcon",backgroundColor:this.wallConfig.iconWrapperFillColor,onMoveStart:this.handleMoveStart,onMoveMove:this.handleMove,onMoveEnd:this.handleMoveEnd}),this.moveButton.position.set(n.x,n.y),this.controlButtons.addChild(this.removeButton),this.controlButtons.addChild(this.scaleButton),this.controlButtons.addChild(this.moveButton)}handleRemove=()=>{this.wallEvents.onRemove?.(this.wallData.id)};initializeOperation=()=>{this.initialWallPoints=this.wallData.points.map(t=>({...t}))};finalizeOperation=()=>{this.initialWallPoints=[],this.wallEvents.onUpdate?.(this.getWallData())};handleScaleStart=()=>{const t=v();this.initializeOperation(),t.getApp().requestRender("virtualwall-scale",!0)};handleScaleMove=t=>{0!==this.initialWallPoints.length&&this.applyScaleAndRotation(t)};handleScaleEnd=()=>{const t=v();this.finalizeOperation(),t.getApp().stopRender("virtualwall-scale")};handleMoveStart=()=>{const t=v();this.initializeOperation(),t.getApp().requestRender("virtualwall-move",!0)};handleMove=t=>{if(0===this.initialWallPoints.length)return;const i=this.parent.toLocal(t.global),e=this.getDragStartPosition()||this.moveButton?.getDragStartPosition();if(!e)return;const n=i.x-e.x,l=i.y-e.y;this.applyTranslation(n,l)};handleMoveEnd=()=>{const t=v();this.finalizeOperation(),t.getApp().stopRender("virtualwall-move")};applyScaleAndRotation(t){const i=v();if(this.initialWallPoints.length<2)return;const[e,s]=this.initialWallPoints,a=e,r=this.calculateOutlinePoints(this.initialWallPoints);if(r.length<4)return;const h=r[m.BUTTON_INDICES.SCALE],d=o(s,h),c={x:t.x-d.x,y:t.y-d.y},u=o(a,c),g=n(a,c),p=i.metersToPixels(this.wallConfig.minWidth);let w;if(g<p)if(0===g)w={x:a.x+p,y:a.y};else{const t=l(u);w={x:a.x+t.x*p,y:a.y+t.y*p}}else w=c;this.wallData.points=[a,w],this.updateAllComponents(),this.updateControlButtonsPosition()}applyTranslation(t,i){this.wallData.points=this.initialWallPoints.map(e=>({x:e.x+t,y:e.y+i})),this.updateAllComponents(),this.updateControlButtonsPosition()}updateAllComponents(){this.updateWallLine(),this.updateLengthText(),this.updateOutlineComponents()}updateWallLine(){const{points:t}=this.wallData;t.length<2||(this.wallLine instanceof p?this.wallLine.updatePoints(t[0],t[1]):this.redrawSolidLine(),this.setupWallLineHitArea())}updateLengthText(){if(!this.lengthText)return;const t=this.calculateWallLengthInMeters(),i=this.formatLengthText(t);this.lengthText.updateText(i),this.updateLengthTextPosition()}updateLengthTextPosition(){if(!this.lengthText)return;const t=this.calculateTextPosition();this.lengthText.position.set(t.x,t.y);const i=this.calculateTextRotation();this.lengthText.rotation=i}updateOutlineComponents(){const t=this.calculateOutlinePoints();this.outlineBorder.updatePoints(t);const i=this.calculateMoveLinePoints(t);this.moveLine.updatePoints(i)}updateControlButtonsPosition(){if(!this.removeButton||!this.scaleButton||!this.moveButton)return;const t=this.calculateOutlinePoints();if(t.length<4)return;const{REMOVE:i,SCALE:e}=m.BUTTON_INDICES,n=this.calculateMoveButtonPosition();this.removeButton.position.set(t[i].x,t[i].y),this.scaleButton.position.set(t[e].x,t[e].y),this.moveButton.position.set(n.x,n.y)}updateEditState(){const t=this.isEditingEnabled();this.controlButtons.visible=t,this.outlineBorder.visible=t,this.moveLine.visible=t,this.lengthText&&(this.lengthText.visible=t),t&&(this.updateOutlineComponents(),this.updateControlButtonsPosition(),this.updateLengthTextPosition()),this.updateWallLineStyle(),this.setupWallLineInteraction(),this.zIndex=t?1e3:0}createSolidLine(t,e,n,l){const o=v(),s=new i;s.eventMode="static";const a=o.getApp().toFixedSize(n);return s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke({color:l,width:a}),s}updateWallLineStyle(){const t=this.isEditingEnabled(),{editing:i,normal:e,lineWidth:n,lineColor:l}=this.wallConfig,o=t?i:e;this.wallLine instanceof p!==o.isDashed?(this.removeChild(this.wallLine),this.wallLine.destroy(),this.createWallLine(!1),this.addChild(this.wallLine)):this.wallLine instanceof p?this.wallLine.updateStyle({color:l.toString(),width:n,dashArray:o.dashArray}):this.redrawSolidLine()}registerScaleListener(){const{emitter:t}=v();t.on("antiScale",this.throttledUpdateOutline),t.on("antiScale",this.throttledHandleScaleChange)}redrawSolidLine(){const t=v();if(!this.wallLine||this.wallLine instanceof p)return;const{points:i}=this.wallData;if(i.length<2)return;const{lineWidth:e,lineColor:n}=this.wallConfig,l=t.getApp().toFixedSize(e);this.wallLine.clear(),this.wallLine.setStrokeStyle({color:n.toString(),width:l}).moveTo(i[0].x,i[0].y).lineTo(i[1].x,i[1].y).stroke()}handleScaleChange=()=>{this.redrawSolidLine(),this.setupWallLineHitArea()};setupWallLineInteraction(){if(!this.wallLine)return;this.setupWallLineHitArea();const t=this.isEditingEnabled();this.wallLineClickHandler?.destroy(),this.wallLineClickHandler=null,this.wallLine.off("pointerdown",this.handleWallLinePointerDown),t?this.wallLine.on("pointerdown",this.handleWallLinePointerDown):this.wallLineClickHandler=new u(this.wallLine,{onClick:()=>{this.wallEvents?.onClick?.(this.getWallData())},stopPropagation:!1})}setupDragEventListeners(){const{emitter:t}=v();t.on("gestureHijackPointerMove",this.handleDragPointerMove),t.on("gestureHijackPointerUp",this.handleDragPointerUp),t.on("gestureHijackCancel",this.handleDragCancel)}cleanupDragEventListeners(){const{emitter:t}=v();t.off("gestureHijackPointerMove",this.handleDragPointerMove),t.off("gestureHijackPointerUp",this.handleDragPointerUp),t.off("gestureHijackCancel",this.handleDragCancel)}handleWallLinePointerDown=t=>{this.isEditingEnabled()&&(t.stopPropagation(),this.startDragging(t))};startDragging(t){const i=v();this.isDragging=!0;const e=this.parent.toLocal(t.global);this.dragStartPosition={x:e.x,y:e.y},this.initializeOperation(),i.getApp().requestRender("virtualwall-drag",!0),v().emitter.emit("gestureHijackStart",t)}handleDragPointerMove=t=>{this.isDragging&&this.dragStartPosition&&this.handleMove(t)};handleDragPointerUp=()=>{const t=v();this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,t.getApp().stopRender("virtualwall-drag"),this.finalizeOperation())};handleDragCancel=()=>{const t=v();this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null,t.getApp().stopRender("virtualwall-drag"),this.handleMoveEnd())};getDragStartPosition(){return this.dragStartPosition}setupWallLineHitArea(){const t=v();if(!this.wallLine)return;const{points:i}=this.wallData;if(i.length<2)return;const{hitAreaThickness:n}=this.wallConfig,l=t.getApp().toFixedSize(n),o=d(i[0],i[1],l);if(0===o.length)return;const s=new e(o);this.wallLine.hitArea=s}getWallData(){return{...this.wallData}}updateWallData(t){this.wallData={...t,points:this.validateAndCorrectWallLength(t.points)},this.updateAllComponents(),this.updateControlButtonsPosition()}updateEditingState(){this.updateEditState()}destroy(){v().emitter.off("antiScale",this.throttledUpdateOutline),v().emitter.off("antiScale",this.throttledHandleScaleChange),this.cleanupDragEventListeners(),this.isDragging&&(this.isDragging=!1,this.dragStartPosition=null),this.wallLine&&this.wallLine.off("pointerdown",this.handleWallLinePointerDown),this.wallLineClickHandler?.destroy(),this.wallLineClickHandler=null,this.wallLine?.destroy(),this.lengthText?.destroy(),this.outlineBorder?.destroy(),this.moveLine?.destroy(),this.controlButtons?.destroy(),this.removeButton?.destroy(),this.scaleButton?.destroy(),this.moveButton?.destroy(),this.removeButton=null,this.scaleButton=null,this.moveButton=null,super.destroy()}}export{m as VirtualWall};
@@ -1 +0,0 @@
1
- import{ClickHandler as t}from"../../mixins/ClickHandler.js";import{EnhancedGifSprite as e}from"../Base/EnhancedGifSprite.js";import{useAppService as i}from"../../application/AppService.js";class a extends e{elementData;clickHandler=null;constructor(t,e){super({source:t}),this.elementData=e}async initialize(){void 0!==this.elementData.sizeFixed&&this.setSizeFixed(this.elementData.sizeFixed),this.setFixedSize(this.elementData.width,this.elementData.height),this.position.set(this.elementData.x,this.elementData.y),void 0!==this.elementData.rotation&&(this.rotation=this.elementData.rotation),void 0!==this.elementData.opacity&&(this.alpha=this.elementData.opacity),this.visible=!0,this.elementData.interactive?this.setupClickHandler():this.eventMode="none"}setupClickHandler(){this.clickHandler&&this.clickHandler.destroy(),this.clickHandler=new t(this,{onClick:()=>this.handleClick(),stopPropagation:!1})}handleClick(){const t=i();t.events?.onClickCustomElement?.(this.getElementData())}getElementData(){return{...this.elementData}}async updateElementData(t){const e=this.elementData;if(this.elementData=t,e.src!==t.src)throw new Error("GIF source change requires recreation of instance");e.sizeFixed!==t.sizeFixed&&void 0!==t.sizeFixed&&this.setSizeFixed(t.sizeFixed),e.width===t.width&&e.height===t.height||this.setFixedSize(t.width,t.height),this.position.set(t.x,t.y),void 0!==t.rotation&&(this.rotation=t.rotation),void 0!==t.opacity&&(this.alpha=t.opacity),t.interactive?this.clickHandler||this.setupClickHandler():(this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null),this.eventMode="none")}isSameData(t){return this.elementData.id===t.id&&this.elementData.type===t.type&&this.elementData.src===t.src&&this.elementData.x===t.x&&this.elementData.y===t.y&&this.elementData.width===t.width&&this.elementData.height===t.height&&this.elementData.rotation===t.rotation&&this.elementData.opacity===t.opacity&&this.elementData.interactive===t.interactive&&this.elementData.sizeFixed===t.sizeFixed}destroy(){this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null),super.destroy()}}export{a as CustomGif};
@@ -1 +0,0 @@
1
- import{FixedSizeDOMContainer as e}from"../Base/FixedSizeDOMContainer.js";import{useAppService as t}from"../../application/AppService.js";class i extends e{elementData;domClickHandler=null;resizeObserver=null;debugMarker=null;constructor(e){const t=document.createElement("div");i.setupDefaultStyles(t,e),t.innerHTML=e.htmlContent,super({element:t}),this.elementData=e}async initialize(){this.alpha=0,this.elementData.width&&this.elementData.height?(this.setFixedSize(this.elementData.width,this.elementData.height),this.setCenterPosition(this.elementData.x,this.elementData.y),this.setSizeFixed(this.elementData.sizeFixed??!0),this.waitForElementInsertion()):(this.position.set(this.elementData.x,this.elementData.y),this.setupAutoSize()),void 0!==this.elementData.rotation&&(this.rotation=this.elementData.rotation),this.elementData.interactive?this.setupClickHandler():this.eventMode="none"}setupAutoSize(){this.element&&(this.element.style.width="auto",this.element.style.height="auto",this.waitForElementDimensions())}waitForElementInsertion(){if(!this.element)return;const e=()=>{this.element&&(this.element.isConnected?this.showElement():requestAnimationFrame(e))};requestAnimationFrame(e)}waitForElementDimensions(){this.element&&("undefined"!=typeof ResizeObserver?(this.resizeObserver=new ResizeObserver(e=>{const t=e[0];t&&t.contentRect.width>0&&t.contentRect.height>0&&(this.setFixedSize(t.contentRect.width,t.contentRect.height),this.setCenterPosition(this.elementData.x,this.elementData.y),this.setSizeFixed(this.elementData.sizeFixed??!0),0===this.alpha&&this.showElement(),this.resizeObserver?.disconnect(),this.resizeObserver=null)}),this.resizeObserver.observe(this.element)):this.pollForElementDimensions())}pollForElementDimensions(){if(!this.element)return;const e=()=>{if(!this.element)return;if(!this.element.isConnected)return void requestAnimationFrame(e);const t=this.element.getBoundingClientRect();t.width>0&&t.height>0?(this.setFixedSize(t.width,t.height),this.setCenterPosition(this.elementData.x,this.elementData.y),this.setSizeFixed(this.elementData.sizeFixed??!0),0===this.alpha&&this.showElement()):requestAnimationFrame(e)};requestAnimationFrame(e)}showElement(){this.alpha=this.elementData.opacity??1,this.element.style.pointerEvents=this.elementData.interactive?"auto":"none",this.interactive=this.elementData.interactive??!1,this.elementData.interactive&&this.element&&(this.element.style.setProperty("-webkit-tap-highlight-color","transparent"),this.element.style.setProperty("-webkit-touch-callout","none")),t().getApp().renderOnceNextFrame()}setupClickHandler(){this.element&&(this.domClickHandler=e=>{e.preventDefault(),e.stopPropagation(),this.handleClick()},this.element.addEventListener("click",this.domClickHandler))}handleClick(){const e=t();e.events?.onClickCustomElement?.(this.getElementData())}getElementData(){return{...this.elementData}}async updateElementData(e){const t=this.elementData;this.elementData=e,t.htmlContent!==e.htmlContent&&this.element&&(this.element.innerHTML=e.htmlContent,e.width&&e.height||this.waitForElementDimensions()),t.width===e.width&&t.height===e.height||(e.width&&e.height?(this.setFixedSize(e.width,e.height),this.element&&(this.element.style.width=`${e.width}px`,this.element.style.height=`${e.height}px`)):this.setupAutoSize()),e.width&&e.height?this.setCenterPosition(e.x,e.y):this.position.set(e.x,e.y),t.sizeFixed!==e.sizeFixed&&void 0!==e.sizeFixed&&this.setSizeFixed(e.sizeFixed),this.rotation=e.rotation??0,this.alpha=e.opacity??1,e.interactive?this.domClickHandler||this.setupClickHandler():(this.eventMode="none",this.domClickHandler&&this.element&&(this.element.removeEventListener("click",this.domClickHandler),this.domClickHandler=null))}isSameData(e){return this.elementData.id===e.id&&this.elementData.type===e.type&&this.elementData.htmlContent===e.htmlContent&&this.elementData.x===e.x&&this.elementData.y===e.y&&this.elementData.width===e.width&&this.elementData.height===e.height&&this.elementData.rotation===e.rotation&&this.elementData.opacity===e.opacity&&this.elementData.interactive===e.interactive&&this.elementData.sizeFixed===e.sizeFixed}static setupDefaultStyles(e,t){const i={position:"relative",boxSizing:"border-box",webkitFontSmoothing:"antialiased",textRendering:"optimizeLegibility",background:"transparent",userSelect:"auto",webkitUserSelect:"auto"};t.width&&t.height?(i.width=`${t.width}px`,i.height=`${t.height}px`,i.overflow="hidden"):(i.width=t.width?`${t.width}px`:"auto",i.height=t.height?`${t.height}px`:"auto",i.overflow="visible"),Object.assign(e.style,i),e.style.setProperty("-webkit-tap-highlight-color","transparent"),e.style.setProperty("-webkit-touch-callout","none")}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.domClickHandler&&this.element&&(this.element.removeEventListener("click",this.domClickHandler),this.domClickHandler=null),this.debugMarker&&(this.debugMarker.destroy(),this.debugMarker=null),super.destroy()}}export{i as CustomHTML};
@@ -1 +0,0 @@
1
- import{ClickHandler as t}from"../../mixins/ClickHandler.js";import{EnhancedSprite as e}from"../Base/EnhancedSprite.js";import{useAppService as i}from"../../application/AppService.js";class a extends e{elementData;clickHandler=null;constructor(t){super(),this.elementData=t}async initialize(){await this.loadTextureAndSetSize(this.elementData.src,{width:this.elementData.width,height:this.elementData.height,sizeFixed:this.elementData.sizeFixed}),this.position.set(this.elementData.x,this.elementData.y),void 0!==this.elementData.rotation&&(this.rotation=this.elementData.rotation),void 0!==this.elementData.opacity&&(this.alpha=this.elementData.opacity),this.visible=!0,this.elementData.interactive?this.setupClickHandler():this.eventMode="none"}setupClickHandler(){this.clickHandler&&this.clickHandler.destroy(),this.clickHandler=new t(this,{onClick:()=>this.handleClick(),stopPropagation:!1})}handleClick(){const t=i();t.events?.onClickCustomElement?.(this.getElementData())}getElementData(){return{...this.elementData}}async updateElementData(t){const e=this.elementData;this.elementData=t,e.src!==t.src?await this.loadTextureAndSetSize(t.src,{width:t.width,height:t.height,sizeFixed:t.sizeFixed}):(e.sizeFixed!==t.sizeFixed&&void 0!==t.sizeFixed&&this.setSizeFixed(t.sizeFixed),e.width===t.width&&e.height===t.height||this.setFixedSize(t.width,t.height)),this.position.set(t.x,t.y),void 0!==t.rotation&&(this.rotation=t.rotation),void 0!==t.opacity&&(this.alpha=t.opacity),t.interactive?this.clickHandler||this.setupClickHandler():(this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null),this.eventMode="none")}isSameData(t){return this.elementData.id===t.id&&this.elementData.type===t.type&&this.elementData.src===t.src&&this.elementData.x===t.x&&this.elementData.y===t.y&&this.elementData.width===t.width&&this.elementData.height===t.height&&this.elementData.rotation===t.rotation&&this.elementData.opacity===t.opacity&&this.elementData.interactive===t.interactive&&this.elementData.sizeFixed===t.sizeFixed}destroy(){this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null),super.destroy()}}export{a as CustomImage};
@@ -1 +0,0 @@
1
- import{ClickHandler as t}from"../../mixins/ClickHandler.js";import{EnhancedSprite as i}from"../Base/EnhancedSprite.js";import{useAppService as e}from"../../application/AppService.js";class s extends i{objectData;clickHandler=null;constructor(t){super(),this.objectData=t}async initializeSprite(){const t=e().detectedObjectConfig,i=this.objectData.width||t.width,s=this.objectData.height||t.height;await this.loadTextureAndSetSize(this.objectData.src,{width:i,height:s}),this.position.set(this.objectData.x,this.objectData.y),this.visible=!0,t.interactive?this.setupClickHandler():this.eventMode="none"}setupClickHandler(){this.clickHandler&&this.clickHandler.destroy(),this.clickHandler=new t(this,{onClick:()=>this.handleClick(),stopPropagation:!1})}handleClick(){const t=e();t.events?.onClickDetectedObject?.(this.getObjectData())}getObjectData(){return{...this.objectData}}async updateObjectData(t){const i=e(),s=this.objectData;this.objectData=t;const a=i.detectedObjectConfig;if(s.src!==t.src){const i=t.width||a.width,e=t.height||a.height;await this.loadTextureAndSetSize(t.src,{width:i,height:e})}if(s.width!==t.width||s.height!==t.height){const i=t.width||a.width,e=t.height||a.height;this.setFixedSize(i,e)}this.position.set(t.x,t.y),a.interactive?this.clickHandler||this.setupClickHandler():this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null)}isSameData(t){return this.objectData.id===t.id&&this.objectData.src===t.src&&this.objectData.x===t.x&&this.objectData.y===t.y&&this.objectData.width===t.width&&this.objectData.height===t.height}destroy(){this.clickHandler&&(this.clickHandler.destroy(),this.clickHandler=null),super.destroy()}}export{s as DetectedObject};
@@ -1 +0,0 @@
1
- import{Container as n,Color as o,Graphics as i,Geometry as r,Shader as l,GlProgram as t,Mesh as a}from"pixi.js";import{LAYER_HEATMAP as e}from"../../application/AppContainer.js";import{useAppService as s}from"../../application/AppService.js";class c extends n{colorGradients=[];cellSize=2;constructor(){super();const n=s();n.appContainer.addToLayer(e,this);const i=n.heatMapConfig;this.colorGradients=i.colorGradients.map(n=>new o(n).toArray().slice(0,3).join(",")),this.cellSize=i.cellSize}draw(n,o=!0,i=.8){this.removeChildren();const r=o?this.gradientDrawing(n):this.gridDrawing(n);this.croppingHeatmap(r),r.alpha=i,this.addChild(r)}croppingHeatmap(n){const o=s().mapManager.roomFill.children.filter(n=>n instanceof i),r=new i;for(const n of o)r.context.instructions.push(...n.context.instructions);r.context.dirty=!0,n.setMask({mask:r}),this.addChild(r)}gridDrawing(n){const o=[],i=[],e=n.length,s=n[0].length;for(let r=0;r<e;r++)for(let l=0;l<s;l++){const t=n[r][l],a=this.cellSize/2,e=t.x-a,s=t.y-a,c=t.x+a,g=t.y+a;o.push(e,s),i.push(t.signal),o.push(c,s),i.push(t.signal),o.push(c,g),i.push(t.signal),o.push(e,s),i.push(t.signal),o.push(c,g),i.push(t.signal),o.push(e,g),i.push(t.signal)}const c=new r({attributes:{aPosition:new Float32Array(o),aSignal:new Float32Array(i)}}),g=new l({glProgram:new t({vertex:"\n in vec2 aPosition;\n in float aSignal;\n uniform mat3 uProjectionMatrix;\n uniform mat3 uWorldTransformMatrix;\n uniform mat3 uTransformMatrix;\n \n out float vSignal;\n \n void main() {\n mat3 mvp = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix;\n gl_Position = vec4((mvp * vec3(aPosition, 1.0)).xy, 0.0, 1.0);\n vSignal = aSignal;\n }\n ",fragment:`\n precision mediump float;\n \n in float vSignal;\n \n void main() {\n vec3 color;\n \n if (vSignal > 0.875) {\n color = vec3(${this.colorGradients[0]});\n } else if (vSignal > 0.75) {\n color = vec3(${this.colorGradients[1]});\n } else if (vSignal > 0.625) {\n color = vec3(${this.colorGradients[2]});\n } else if (vSignal > 0.5) {\n color = vec3(${this.colorGradients[3]});\n } else if (vSignal > 0.375) {\n color = vec3(${this.colorGradients[4]});\n } else if (vSignal > 0.25) {\n color = vec3(${this.colorGradients[5]});\n } else if (vSignal > 0.125) {\n color = vec3(${this.colorGradients[6]});\n } else {\n color = vec3(${this.colorGradients[7]});\n }\n gl_FragColor = vec4(color, 1.0);\n }\n `})}),v=new a({geometry:c,shader:g});return v.alpha=.8,v}gradientDrawing(n){const o=[],i=[],e=n.length,s=n[0].length;for(let r=0;r<e;r++)for(let l=0;l<s;l++){const t=n[r][l],a=this.cellSize/2,c=(o,i)=>o<0||o>=e||i<0||i>=s?t.signal:n[o][i].signal,g=(c(r-1,l-1)+c(r-1,l)+c(r,l-1)+t.signal)/4,v=(c(r-1,l)+c(r-1,l+1)+t.signal+c(r,l+1))/4,p=(t.signal+c(r,l+1)+c(r+1,l)+c(r+1,l+1))/4,f=(c(r,l-1)+t.signal+c(r+1,l-1)+c(r+1,l))/4,h=t.x-a,m=t.y-a,d=t.x+a,u=t.y+a;o.push(h,m,d,m,d,u),i.push(g,v,p),o.push(h,m,d,u,h,u),i.push(g,p,f)}const c=new r({attributes:{aPosition:new Float32Array(o),aSignal:new Float32Array(i)}}),g=new l({glProgram:new t({vertex:"\n in vec2 aPosition;\n in float aSignal;\n uniform mat3 uProjectionMatrix;\n uniform mat3 uWorldTransformMatrix;\n uniform mat3 uTransformMatrix;\n \n out float vSignal;\n \n void main() {\n mat3 mvp = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix;\n gl_Position = vec4((mvp * vec3(aPosition, 1.0)).xy, 0.0, 1.0);\n vSignal = aSignal;\n }\n ",fragment:`\n precision mediump float;\n \n in float vSignal;\n \n // 颜色插值函数\n vec3 interpolateColor(vec3 color1, vec3 color2, float t) {\n return mix(color1, color2, t);\n }\n \n void main() {\n vec3 color;\n float signal = clamp(vSignal, 0.0, 1.0);\n \n vec3 color1 = vec3(${this.colorGradients[7]});\n vec3 color2 = vec3(${this.colorGradients[6]});\n vec3 color3 = vec3(${this.colorGradients[5]});\n vec3 color4 = vec3(${this.colorGradients[4]});\n vec3 color5 = vec3(${this.colorGradients[3]});\n vec3 color6 = vec3(${this.colorGradients[2]});\n vec3 color7 = vec3(${this.colorGradients[1]});\n vec3 color8 = vec3(${this.colorGradients[0]});\n \n if (signal <= 0.125) {\n float t = signal / 0.125;\n color = interpolateColor(color1, color2, t);\n } else if (signal <= 0.25) {\n float t = (signal - 0.125) / 0.125;\n color = interpolateColor(color2, color3, t);\n } else if (signal <= 0.375) {\n float t = (signal - 0.25) / 0.125;\n color = interpolateColor(color3, color4, t);\n } else if (signal <= 0.5) {\n float t = (signal - 0.375) / 0.125;\n color = interpolateColor(color4, color5, t);\n } else if (signal <= 0.625) {\n float t = (signal - 0.5) / 0.125;\n color = interpolateColor(color5, color6, t);\n } else if (signal <= 0.75) {\n float t = (signal - 0.625) / 0.125;\n color = interpolateColor(color6, color7, t);\n } else if (signal <= 0.875) {\n float t = (signal - 0.75) / 0.125;\n color = interpolateColor(color7, color8, t);\n } else {\n color = color8;\n }\n \n gl_FragColor = vec4(color, 1.0);\n }\n `})}),v=new a({geometry:c,shader:g});return v.alpha=.8,v}}export{c as Heatmap};
@@ -1 +0,0 @@
1
- import{Container as t,Assets as r,TilingSprite as e,Graphics as a}from"pixi.js";import{LAYER_CARPET as i}from"../../application/AppContainer.js";import{Logger as s}from"../../utils/logger.js";import{useAppService as c}from"../../application/AppService.js";class o extends t{carpetSprite=null;carpetMask=null;constructor(){super({isRenderGroup:!0}),c().appContainer.addToLayer(i,this)}async createCarpetFromRasterData(a,i){const o=c();if(!o.runtimeSnapshot.showCarpet)return;if(this.clearCarpet(),0===a.length)return;const{src:n,opacity:p,scale:h}=o.carpetConfig,l=await r.load(n);if(!l)return void s.warn(`Carpet texture not found: ${n}`);const d=this.createCarpetGraphics(a,i),u=d.getLocalBounds();if(0===u.width||0===u.height)return;const f=new e({texture:l,width:u.width,height:u.height});f.x=u.x,f.y=u.y,f.alpha=p,f.tileScale.set(h);const C=new t;C.addChild(d),f.mask=C,this.addChild(f),this.carpetSprite=f,this.carpetMask=C,o.getApp().renderOnceNextFrame()}createCarpetGraphics(t,r){const e=new a;for(let a=0;a<t.length;a++){const i=t[a],s=i%r,c=Math.floor(i/r);e.rect(s,c,1,1)}return e.fill(16777215),e}clearCarpet(){if(this.carpetSprite){try{this.removeChild(this.carpetSprite),this.carpetSprite.destroy()}catch(t){s.warn("Error destroying carpet sprite:",t)}this.carpetSprite=null}if(this.carpetMask){try{this.carpetMask.destroy()}catch(t){s.warn("Error destroying carpet mask:",t)}this.carpetMask=null}}async createCarpetFromStructuredData(a){const i=c();if(!i.runtimeSnapshot.showCarpet)return;if(this.clearCarpet(),0===a.length)return;const{src:o,opacity:n,scale:p}=i.carpetConfig,h=await r.load(o);if(!h)return void s.warn(`Carpet texture not found: ${o}`);const l=this.createCarpetGraphicsFromStructuredData(a),d=l.getLocalBounds();if(0===d.width||0===d.height)return;const u=new e({texture:h,width:d.width,height:d.height});u.x=d.x,u.y=d.y,u.alpha=n,u.tileScale.set(p);const f=new t;f.addChild(l),u.mask=f,this.addChild(u),this.carpetSprite=u,this.carpetMask=f,i.getApp().renderOnceNextFrame()}createCarpetGraphicsFromStructuredData(t){const r=new a;for(const e of t){const t=e.coordinates;for(let e=0;e<t.length;e+=2){const a=t[e],i=t[e+1];r.rect(a,i,1,1)}}return r.fill(16777215),r}destroy(){this.clearCarpet(),super.destroy()}}export{o as Carpet};
@@ -1 +0,0 @@
1
- import{Graphics as o}from"pixi.js";import{LAYER_FREE as t}from"../../application/AppContainer.js";import{useAppService as r}from"../../application/AppService.js";class s extends o{constructor(){super(),r().appContainer.addToLayer(t,this)}draw(o){const t=r();this.clear(),this.setFillStyle({color:t.mapConfig.freeColor});for(const t of o){const o=t.coordinates;for(let t=0;t<o.length;t+=2){const r=o[t],s=o[t+1];this.rect(r,s,1,1)}}this.fill()}destroy(o){super.destroy(o)}}export{s as Free};
@@ -1 +0,0 @@
1
- import{Graphics as t}from"pixi.js";import{LAYER_OBSTACLE as o}from"../../application/AppContainer.js";import{RASTER_CHUNK_SIZE as r}from"../../constant/index.js";import{useAppService as s}from"../../application/AppService.js";class e extends t{constructor(){super(),s().appContainer.addToLayer(o,this)}draw(t){const o=s();this.clear(),this.setFillStyle({color:o.mapConfig.obstacleColor});for(const o of t){const t=o.coordinates;for(let o=0;o<t.length;o+=2){const r=t[o],s=t[o+1];this.rect(r,s,1,1)}}this.fill()}drawRaster(t,o){const e=s();if(this.clear(),0!==t.length){this.setFillStyle({color:e.mapConfig.obstacleColor});for(let s=0;s<t.length;s+=r){const l=Math.min(s+r,t.length);for(let r=s;r<l;r++){const s=t[r],e=s%o,l=Math.floor(s/o);this.rect(e,l,1,1)}this.fill(),l<t.length&&this.setFillStyle({color:e.mapConfig.obstacleColor})}}}destroy(t){super.destroy(t)}}export{e as Obstacle};
@@ -1 +0,0 @@
1
- import{Container as o,Graphics as t,GraphicsContext as e}from"pixi.js";import{RASTER_CHUNK_SIZE as i}from"../../constant/index.js";import{LAYER_ROOM_FILL as s}from"../../application/AppContainer.js";import{ClickHandler as r}from"../../mixins/ClickHandler.js";import{Logger as a}from"../../utils/logger.js";import{useAppService as n}from"../../application/AppService.js";class l extends o{roomGraphicsMap=new Map;roomContextMap=new Map;roomClickHandlerMap=new Map;unsubscribeFns=[];mapWidth=0;rasterRoomDataMap=new Map;constructor(){super({isRenderGroup:!0}),n().appContainer.addToLayer(s,this)}draw(o){const i=n();this.clearRooms();const s=i.roomConfig,{selectRoomIds:a,enableRoomSelection:l}=i.runtimeSnapshot;o.forEach(o=>{const i=o.id>=255,n=new t,c=new e,h=new e;if(i)c.setFillStyle({color:o.color}),h.setFillStyle({color:o.color});else{const t=o.colorIndex??0,e=s.colors.active[t%s.colors.active.length],i=s.colors.inactive[t%s.colors.inactive.length];c.setFillStyle({color:e}),h.setFillStyle({color:i})}if(c.poly(o.polyPoints).fill(),h.poly(o.polyPoints).fill(),o.outlinePoints.forEach(o=>{c.rect(o.x,o.y,1,1).fill(),h.rect(o.x,o.y,1,1).fill()}),n.context=i?c:l&&!a.includes(o.id)?h:c,!i){const t=new r(n,{clickThreshold:10,onClick:()=>{this.handleRoomClick(o.id)}});this.roomClickHandlerMap.set(o.id,t)}this.roomGraphicsMap.set(o.id,n),this.roomContextMap.set(o.id,{activeContext:c,inactiveContext:h}),this.addChild(n)})}drawRaster(o){const t=n();if(this.clearRooms(),this.mapWidth=o.width,0===o.sortedRooms.length)return;const{selectRoomIds:e,enableRoomSelection:i}=t.runtimeSnapshot;o.sortedRooms.forEach(o=>{this.drawRasterRoom(o,i,e)})}drawRasterRoom(o,s,a){const{roomId:n,pixelIndices:l,activeColor:c,inactiveColor:h}=o,p=new t,m=new e,d=new e;m.setFillStyle({color:c}),d.setFillStyle({color:h}),this.drawPixelPointsInBatches(m,l,i,this.mapWidth),this.drawPixelPointsInBatches(d,l,i,this.mapWidth);const f="number"==typeof n,C=!s||f&&a.includes(n);if(p.context=s&&f&&!C?d:m,f){const o=new r(p,{clickThreshold:10,onClick:()=>{this.handleRoomClick(n)}});this.roomClickHandlerMap.set(n,o)}this.roomGraphicsMap.set(n,p),this.roomContextMap.set(n,{activeContext:m,inactiveContext:d}),this.rasterRoomDataMap.set(n,o),this.addChild(p)}drawPixelPointsInBatches(o,t,e,i){for(let s=0;s<t.length;s+=e){const r=Math.min(s+e,t.length);for(let e=s;e<r;e++){const s=t[e],r=s%i,a=Math.floor(s/i);o.rect(r,a,1,1)}o.fill()}}handleRoomClick(o){const t=n();t.events?.onClickRoom?.(t.getRoomData(o)??{id:o})}setRoomStateBySelectIds(o){const t=n(),{enableRoomSelection:e}=t.runtimeSnapshot;this.roomGraphicsMap.forEach((t,i)=>{if("number"==typeof i){const s=!e||o.includes(i),r=this.roomContextMap.get(i);r&&(t.context=s?r.activeContext:r.inactiveContext)}})}setRoomState(o,t){const e=this.roomGraphicsMap.get(o),i=this.roomContextMap.get(o);e&&i?"number"==typeof o&&(e.context=t?i.activeContext:i.inactiveContext):a.warn(`Room ${o} not found`)}setAllRoomsState(o){this.roomGraphicsMap.forEach((t,e)=>{"number"==typeof e&&this.setRoomState(e,o)})}getRoomGraphicsMap(){const o=new Map;return this.roomGraphicsMap.forEach((t,e)=>{"number"==typeof e&&o.set(e,t)}),o}getRasterRoomData(o){return this.rasterRoomDataMap.get(o)||null}getMapWidth(){return this.mapWidth}clearRooms(){0===this.children.length&&0===this.roomGraphicsMap.size||(this.removeChildren(),this.roomClickHandlerMap.forEach(o=>{try{o.destroy()}catch(o){a.warn("Error destroying click handler:",o)}}),this.roomClickHandlerMap.clear(),this.roomGraphicsMap.clear(),this.roomContextMap.clear(),this.rasterRoomDataMap.clear())}destroy(){this.unsubscribeFns.forEach(o=>o()),this.unsubscribeFns=[],this.clearRooms(),super.destroy()}}export{l as RoomFill};
@@ -1 +0,0 @@
1
- import{Container as t,Graphics as i}from"pixi.js";import{throttle as o}from"lodash-es";import{LAYER_PATH as a}from"../../application/AppContainer.js";import{Logger as s}from"../../utils/logger.js";import{useAppService as e}from"../../application/AppService.js";class h extends t{commonPath;chargePath;transitionsPath;mopPath;pathData=null;lastPointCount=0;lastDrawnPosition=null;isRealTimeDrawing=!1;throttledUpdateLineWidth;throttledHandleRobotPosition;constructor(){super({isRenderGroup:!0});const t=e();t.appContainer.addToLayer(a,this),this.eventMode="none",this.commonPath=new i,this.chargePath=new i,this.transitionsPath=new i,this.mopPath=new i,this.addChild(this.commonPath),this.addChild(this.chargePath),this.addChild(this.transitionsPath),this.addChild(this.mopPath),this.visible=t.runtimeSnapshot.showPath,this.commonPath.visible=t.pathConfig.commonPath.visible,this.chargePath.visible=t.pathConfig.chargePath.visible,this.transitionsPath.visible=t.pathConfig.transitionPath.visible,this.mopPath.visible=!1,this.throttledUpdateLineWidth=o(()=>{this.updateLineWidth()},50,{leading:!0,trailing:!0}),this.throttledHandleRobotPosition=o(this.handleRobotPositionUpdate.bind(this),0),this.registerEventListeners()}registerEventListeners(){const{emitter:t}=e();t.on("antiScale",this.throttledUpdateLineWidth),t.on("robotPositionUpdate",this.throttledHandleRobotPosition),t.on("robotAnimationComplete",this.handleRobotAnimationComplete)}handleRobotAnimationComplete=()=>{this.isRealTimeDrawing&&this.stopRealTimeDrawing()};handleRobotPositionUpdate(t){if(!this.isRealTimeDrawing||!this.lastDrawnPosition)return;let i;switch(t.pathType||"common"){case"common":default:i=this.commonPath;break;case"charge":i=this.chargePath;break;case"transitions":i=this.transitionsPath;break;case"mop":i=this.mopPath}i.moveTo(this.lastDrawnPosition.x,this.lastDrawnPosition.y),i.lineTo(t.x,t.y),i.stroke(),this.lastDrawnPosition={x:t.x,y:t.y}}updateLineWidth(){const t=e();this.pathData&&t.pathConfig.lineWidthFixed&&this.redrawPaths(this.pathData)}redrawPaths(t){const{pathPoints:i}=t;i&&0!==i.length&&(this.commonPath.clear(),this.chargePath.clear(),this.transitionsPath.clear(),this.mopPath.clear(),this.setupPathStyles(),this.drawPathSegments(i),this.commonPath.stroke(),this.chargePath.stroke(),this.transitionsPath.stroke(),this.mopPath.stroke())}setupPathStyles(){const t=e(),i=t.pathConfig,o=o=>i.lineWidthFixed?t.getApp().toFixedSize(o):o;this.commonPath.setStrokeStyle({width:o(i.commonPath.width),color:i.commonPath.color,join:"round",cap:"round"}),this.chargePath.setStrokeStyle({width:o(i.chargePath.width),color:i.chargePath.color,join:"round",cap:"round"}),this.transitionsPath.setStrokeStyle({width:o(i.transitionPath.width),color:i.transitionPath.color,join:"round",cap:"round"}),this.mopPath.setStrokeStyle({width:0,color:0,alpha:0,join:"round",cap:"round"})}drawPathSegments(t){let i=null,o=null;for(let a=0;a<t.length;a++){const s=t[a],e=s.type||"common";let h;switch(e){case"common":default:h=this.commonPath;break;case"charge":h=this.chargePath;break;case"transitions":h=this.transitionsPath;break;case"mop":h=this.mopPath}0===a||e!==i?h.moveTo(s.x,s.y):h===o&&h.lineTo(s.x,s.y),i=e,o=h}}updatePositionByOrigin(t,i){this.position.set(t,i)}drawFull(t){s.debug("[Path] Draw Full Path",t),this.pathData=t,this.redrawPaths(t),this.lastPointCount=t.pathPoints?.length||0}drawIncremental(t){const i=e(),o=this.lastPointCount,a=t.pathPoints?.slice(o)||[];if(a.length>0)if(this.setupPathStyles(),s.debug("[Path] Draw Incremental Path",a),i.robotConfig.speed>0){if(this.isRealTimeDrawing=!0,o>0&&this.pathData?.pathPoints){const t=this.pathData.pathPoints[o-1];this.lastDrawnPosition={x:t.x,y:t.y}}}else this.drawNewPathSegments(a,o,t.pathPoints,this.pathData?.pathPoints);this.pathData=t,this.lastPointCount=t.pathPoints?.length||0}drawNewPathSegments(t,i,o,a){if(!o||0===t.length)return;let s=null;i>0&&(a&&a[i-1]?s=a[i-1]:o[i-1]&&(s=o[i-1]));let e=null,h=null,n=!1;for(let i=0;i<t.length;i++){const o=t[i],a=o.type||"common";let r;switch(a){case"common":default:r=this.commonPath;break;case"charge":r=this.chargePath;break;case"transitions":r=this.transitionsPath;break;case"mop":r=this.mopPath}a!==e||0===i?(h&&n&&h.stroke(),e=a,h=r,n=!0,s&&0===i&&s.type===a?(r.moveTo(s.x,s.y),r.lineTo(o.x,o.y)):r.moveTo(o.x,o.y)):r.lineTo(o.x,o.y)}h&&n&&h.stroke()}stopRealTimeDrawing(){this.isRealTimeDrawing=!1,this.lastDrawnPosition=null}destroy(t){const{emitter:i}=e();i.off("antiScale",this.throttledUpdateLineWidth),i.off("robotPositionUpdate",this.throttledHandleRobotPosition),i.off("robotAnimationComplete",this.handleRobotAnimationComplete),this.stopRealTimeDrawing(),super.destroy(t)}}export{h as Path};
@@ -1 +0,0 @@
1
- import{EnhancedSprite as i}from"../Base/EnhancedSprite.js";import{useAppService as t}from"../../application/AppService.js";class o extends i{constructor(){super(),this.initializeSprite()}async initializeSprite(){const i=t();await this.loadTextureAndSetSize("robot",i.robotConfig.icon)}async draw({x:i,y:t,rotation:o}){super.draw({x:i,y:t,rotation:o})}}export{o as RobotIcon};
@@ -1 +0,0 @@
1
- import{EnhancedAnimatedSprite as t}from"../Base/EnhancedAnimatedSprite.js";import{subscribeKey as i}from"valtio/vanilla/utils";import{Logger as e}from"../../utils/logger.js";import{Texture as s}from"pixi.js";import{throttle as o}from"lodash-es";import{useAppService as n}from"../../application/AppService.js";class r extends t{unsubscribeFns=[];throttledUpdateOffset;fixedOffsetX=0;fixedOffsetY=0;constructor(t){super(t),this.throttledUpdateOffset=o(this.updateOffset.bind(this),30,{leading:!0,trailing:!0}),this.initializeAnimation()}static async create(){const i=n().robotConfig,o=await t.loadAnimationTextures(i.sleepAnimation.jsonSrc,i.sleepAnimation.framePrefix,i.sleepAnimation.frameCount);0===o.length&&(e.warn("No textures loaded for sleep animation"),o.push(s.EMPTY));const a=new r(o);return a.setupAnimation({width:i.sleepAnimation.width,height:i.sleepAnimation.height,sizeFixed:i.sleepAnimation.sizeFixed}),a}initializeAnimation(){const t=n();this.visible=!1,this.fixedOffsetX=t.robotConfig.sleepAnimation.offsetX,this.fixedOffsetY=t.robotConfig.sleepAnimation.offsetY,t.emitter.on("antiScale",this.throttledUpdateOffset);const s=i(t.runtime,"showRobotSleepAnimation",t=>{e.log(`[runtime] showRobotSleepAnimation: ${t}`),this.updateVisibility()});this.unsubscribeFns.push(s)}shouldShow(){const t=n().runtimeSnapshot.showRobotSleepAnimation,i=this.parent,e=!!i&&i.visible,s=i&&(0!==i.x||0!==i.y);return t&&e&&!!s}updateVisibility(){const t=this.shouldShow();t&&!this.visible?(this.visible=!0,this.textures&&this.textures.length>0&&this.play()):!t&&this.visible?(this.visible=!1,this.stop()):!t&&this.playing&&this.stop()}updateOffset(t){}draw(t){const i=n(),e=i.getApp().toFixedSize(i.robotConfig.sleepAnimation.offsetX),s=i.getApp().toFixedSize(i.robotConfig.sleepAnimation.offsetY),o={...t,x:t.x+e,y:t.y+s};super.draw(o,()=>this.shouldShow()),this.updateVisibility()}onRobotVisibilityChanged(){this.updateVisibility()}set visible(t){const i=super.visible;super.visible=t,t&&!i&&this.textures&&this.textures.length>0?this.play():!t&&i&&this.playing&&this.stop()}get visible(){return super.visible}destroy(t){n().emitter.off("antiScale",this.throttledUpdateOffset),this.unsubscribeFns.forEach(t=>t()),this.unsubscribeFns=[],this.stop(),super.destroy(t)}}export{r as SleepAnimation};
@@ -1 +0,0 @@
1
- import{Container as t}from"pixi.js";import{RobotIcon as i}from"./RobotIcon.js";import{SleepAnimation as o}from"./SleepAnimation.js";import{LAYER_ROBOT as s}from"../../application/AppContainer.js";import{Ring as e}from"../Base/Ring.js";import{subscribeKey as n}from"valtio/vanilla/utils";import{Logger as a}from"../../utils/logger.js";import{useAppService as r}from"../../application/AppService.js";class h extends t{robot;ring;sleepAnimation=null;unsubscribeFns=[];targetPosition=null;targetRotation=null;isMoving=!1;pathQueue=[];lastPosition=null;currentPathType=void 0;lastUpdateTime=0;constructor(){super();const t=r();t.appContainer.addToLayer(s,this),this.visible=t.runtimeSnapshot.showPath,this.ring=new e({config:t.robotConfig}),this.ring.visible=t.runtimeSnapshot.showRobotRing,this.addChild(this.ring),this.robot=new i,this.addChild(this.robot),this.lastUpdateTime=Date.now(),t.robotConfig.speed>0&&t.getApp().ticker.add(this.update,this);const o=n(t.runtime,"showRobotRing",t=>{a.log(`[runtime] showRobotRing: ${t}`),this.ring.visible=t});this.unsubscribeFns.push(o)}async initializeSleepAnimation(){try{this.sleepAnimation=await o.create(),this.addChild(this.sleepAnimation),a.log("Sleep animation added to robot")}catch(t){a.error("Failed to initialize sleep animation:",t)}}updatePositionByOrigin(t,i){this.position.set(t,i)}async draw({x:t,y:i,rotation:o}){this.ring.draw({x:t,y:i}),await this.robot.draw({x:t,y:i,rotation:o}),this.sleepAnimation||await this.initializeSleepAnimation(),this.sleepAnimation.draw({x:t,y:i,rotation:o}),this.lastPosition={x:t,y:i}}moveTo(t){this.pathQueue.push(t),this.isMoving||this.processNextPathPoint()}batchProcessQueue(t=!1){if(0===this.pathQueue.length)return;const i=[...this.pathQueue];if(t){const t=i[i.length-1];this.robot.position.set(t.x,t.y),void 0!==t.rotation&&(this.robot.rotation=t.rotation),this.lastPosition={x:t.x,y:t.y},this.pathQueue=[],this.isMoving=!1,this.targetPosition=null}else this.pathQueue.splice(0,i.length),0===this.pathQueue.length?(this.isMoving=!1,this.targetPosition=null):this.processNextPathPoint()}processNextPathPoint(){if(0===this.pathQueue.length)return this.isMoving=!1,this.currentPathType=void 0,this.stopRobotAnimation(),void r().emitter.emit("robotAnimationComplete");this.isMoving||this.startRobotAnimation(),this.isMoving=!0;const t=this.pathQueue[0];this.targetPosition={x:t.x,y:t.y},this.currentPathType=t.type,void 0!==t.rotation&&(this.targetRotation=t.rotation),this.lastPosition||(this.lastPosition={x:this.robot.x,y:this.robot.y})}update(){const t=r(),i=Date.now();if(0===this.lastUpdateTime)return void(this.lastUpdateTime=i);let o=i-this.lastUpdateTime;if(this.lastUpdateTime=i,o>500&&(o=16.67),this.targetPosition){const i=this.targetPosition.x-this.robot.x,s=this.targetPosition.y-this.robot.y,e=Math.sqrt(i*i+s*s),n=t.robotConfig.speed,a=t.getApp().metersToPixels(n);if(0===n)return this.robot.position.set(this.targetPosition.x,this.targetPosition.y),null!==this.targetRotation&&(this.robot.rotation=this.targetRotation,this.targetRotation=null),this.targetPosition=null,this.lastPosition={x:this.robot.x,y:this.robot.y},this.pathQueue.shift(),void this.processNextPathPoint();const h=a*(o/1e3);e<h?(this.robot.position.set(this.targetPosition.x,this.targetPosition.y),null!==this.targetRotation&&(this.robot.rotation=this.targetRotation,this.targetRotation=null),this.targetPosition=null,this.lastPosition={x:this.robot.x,y:this.robot.y},this.pathQueue.shift(),this.processNextPathPoint()):(this.robot.x+=i*(h/e),this.robot.y+=s*(h/e),r().emitter.emit("robotPositionUpdate",{x:this.robot.x,y:this.robot.y,pathType:this.currentPathType}),this.lastPosition={x:this.robot.x,y:this.robot.y})}}startRobotAnimation(){r().getApp().requestRender("robot-animation",!0)}set visible(t){super.visible=t,this.sleepAnimation&&this.sleepAnimation.onRobotVisibilityChanged()}get visible(){return super.visible}stopRobotAnimation(){r().getApp().stopRender("robot-animation")}remove(){this.pathQueue=[],this.isMoving=!1,this.targetPosition=null,this.stopRobotAnimation()}destroy(t){const i=r();this.unsubscribeFns.forEach(t=>t()),this.unsubscribeFns=[],this.stopRobotAnimation(),i.robotConfig.speed>0&&i.getApp().ticker.remove(this.update,this),this.ring.destroy(),super.destroy(t)}}export{h as Robot};
@@ -1 +0,0 @@
1
- import{Container as o,Assets as r,TilingSprite as e,Graphics as t}from"pixi.js";import{calculateMergedBounds as s}from"../../utils/algorithm.js";import{LAYER_ROOM_FLOOR_TYPE as a}from"../../application/AppContainer.js";import{Logger as p}from"../../utils/logger.js";import{useAppService as i}from"../../application/AppService.js";class l extends o{floorTypeMap=new Map;floorTypeMasks=new Map;floorTypeToRooms=new Map;constructor(){super({isRenderGroup:!0}),i().appContainer.addToLayer(a,this)}async createFloorTypes(o){if(!i().runtimeSnapshot.showRoomFloorType)return;this.clearFloorTypes();const r=this.groupRoomsByFloorType(o),e=[];for(const[o,t]of r)e.push(this.createMergedFloorType(o,t));await Promise.all(e)}groupRoomsByFloorType(o){const r=new Map,e=i();return o.forEach((o,t)=>{const s=e.getRoomData(t),a=s?.floorType||0;a>=0&&(r.has(a)||r.set(a,[]),r.get(a).push({roomId:t,graphics:o}))}),r}async createMergedFloorType(o,t){const a=i(),{assets:l,opacity:n,scale:c}=a.roomConfig.floorType,h=o%l.length,y=`floorType${h}`;if(!l[h])return void p.warn(`No texture asset configured for floorType: ${o}`);const f=await r.load(y);if(!f)return void p.warn(`Floor material texture not found: ${y}`);const d=t.map(({graphics:o})=>o.getLocalBounds()),m=s(d),T=new e({texture:f,width:m.width,height:m.height});T.x=m.x,T.y=m.y,T.alpha=n,T.tileScale.set(c);const g=this.createMergedMask(t.map(({graphics:o})=>o));T.mask=g,this.addChild(T),this.floorTypeMap.set(o,T),this.floorTypeMasks.set(o,g),this.floorTypeToRooms.set(o,new Set(t.map(({roomId:o})=>o)))}createMergedMask(r){const e=new o;return r.forEach(o=>{const r=new t;r.context=o.context.clone(),e.addChild(r)}),e}clearFloorTypes(){this.floorTypeMap.forEach(o=>{try{this.removeChild(o),o.destroy()}catch(o){p.warn("Error destroying floor material:",o)}}),this.floorTypeMap.clear(),this.floorTypeMasks.forEach(o=>{try{o.destroy()}catch(o){p.warn("Error destroying floor mask:",o)}}),this.floorTypeMasks.clear(),this.floorTypeToRooms.clear()}destroy(){this.clearFloorTypes(),super.destroy()}}export{l as RoomFloorType};
@@ -1 +0,0 @@
1
- import{Text as o,TextStyle as e}from"pixi.js";import{useAppService as t}from"../../application/AppService.js";class n extends o{roomId;roomIndex;constructor(o){const n=t(),{nameLabel:i,colors:r}=n.roomConfig,m=o.colorIndex??o.index,s=r.name[m%r.name.length],l=new e({fontSize:i.fontSize,fontFamily:i.fontFamily,fontWeight:i.fontWeight,fill:s,align:"center"});super({text:o.name||"Unknown",style:l}),this.roomId=o.id,this.roomIndex=o.index,this.anchor.set(.5)}updateName(o){this.text=o}refreshColor(o){const e=t(),{colors:n}=e.roomConfig,i=e.getRoomData(this.roomId),r=i?.colorIndex??this.roomIndex,m=o??n.name[r%n.name.length];this.style.fill=m}}export{n as RoomName};
@@ -1 +0,0 @@
1
- import{Container as e,Graphics as t,Text as o,TextStyle as r}from"pixi.js";import{EnhancedSprite as i}from"../Base/EnhancedSprite.js";import{useAppService as n}from"../../application/AppService.js";class s extends e{background;propertyIcons=new Map;orderContainer;orderBackground;orderText;bubble=null;isFolded=!1;roomId;roomIndex;constructor(i){super();const s=n(),l=s.roomConfig;this.roomId=i.id,this.roomIndex=i.index,this.background=new t;const{property:a,colors:{propertyTheme:d}}=l;l.property.foldable&&(this.bubble=new t);const c=d[(i.colorIndex??i.index)%d.length];this.initializePropertyIcons(a.displayOrders,c),this.orderContainer=new e,this.orderBackground=new t,this.orderText=new o({text:"",style:new r({fontSize:a.cleanOrder.fontSize,fontFamily:a.cleanOrder.fontFamily,fontWeight:a.cleanOrder.fontWeight,fill:a.cleanOrder.color,align:"center",trim:!0})}),this.orderText.anchor.set(.5,.5),this.orderContainer.addChild(this.orderBackground),this.orderContainer.addChild(this.orderText),this.addChild(this.background),this.bubble&&this.addChild(this.bubble),this.propertyIcons.forEach(({sprite:e})=>{this.addChild(e)}),this.addChild(this.orderContainer),this.visible=s.runtimeSnapshot.showRoomProperty,this.updateProperty(i)}initializePropertyIcons(e,t){const o=["cleanMode","suction","cistern","cleanTimes"];e.forEach(e=>{const r=o.includes(e),n=new i;n.tint=t,n.anchor.set(0,0),this.propertyIcons.set(e,{fieldName:e,sprite:n,isBuiltin:r})})}async updateProperty(e){await this.updateIcons(e),this.updateBackground()}getFieldValue(e,t){if(["cleanMode","suction","cistern","cleanTimes"].includes(t))return e[t]??null;if(e.customData&&t in e.customData){const o=e.customData[t];return"number"==typeof o?o:null}return null}getAssetAlias(e,t){const o={cleanMode:e=>`cleanMode_${e}`,suction:e=>`fan_${e}`,cistern:e=>`water_${e}`,cleanTimes:e=>`cleanTimes${e}`};return e in o?o[e](t):`custom_${e}_${t}`}shouldShowField(e,t,o){const r=n(),{showRoomProperty:i}=r.runtimeSnapshot;return!(null===o||!i||"cleanTimes"===t&&o<=0)}getDisplayElements(e){const t=n(),{displayOrders:o}=t.roomConfig.property,{showRoomOrder:r}=t.runtimeSnapshot,i=e.order||0,s=[];return r&&i>0&&s.push({element:this.orderContainer,show:!0,isOrder:!0,fieldName:"order"}),o.forEach(t=>{const o=this.propertyIcons.get(t);if(!o)return;const r=this.getFieldValue(e,t);this.shouldShowField(e,t,r)&&null!==r&&s.push({element:o.sprite,show:!0,isOrder:!1,fieldName:t,value:r})}),{elementsToShow:s,orderValue:i}}async updateIcons(e){const t=n(),{iconWidth:o,iconHeight:r,container:i,cleanOrder:s,foldable:l,iconGap:a}=t.roomConfig.property,{propertyTheme:d}=t.roomConfig.colors,{paddingHorizontal:c,paddingVertical:h}=i,{elementsToShow:p,orderValue:u}=this.getDisplayElements(e);if(this.orderContainer.visible=!1,this.propertyIcons.forEach(({sprite:e})=>{e.visible=!1}),l&&this.isFolded)return;const b=[];p.forEach(t=>{if(t.isOrder){this.orderContainer.visible=!0,this.orderText.text=u.toString();const t=e.colorIndex??this.roomIndex;this.orderBackground.clear(),this.orderBackground.setFillStyle({color:d[t%d.length]}),this.orderBackground.circle(o/2,r/2,o/2).fill(),this.orderText.position.set(o/2,r/2)}else{const e=this.propertyIcons.get(t.fieldName);if(e){e.sprite.visible=!0;const i=this.getAssetAlias(t.fieldName,t.value);b.push(e.sprite.loadTextureAndSetSize(i,{width:o,height:r,sizeFixed:!1}))}}}),await Promise.all(b);let g=c;p.forEach((e,t)=>{const{element:r,isOrder:i}=e;r.position.set(g,h),g+=o,t<p.length-1&&(g+=i?s.gapRight:a)})}updateBackground(){const e=n().roomConfig,{container:t,foldable:o}=e.property,{borderRadius:r,tailHeight:i,tailWidth:s,backgroundColor:l}=t,a=this.calculateContentWidth(),d=this.calculateContentHeight(),c=Math.min(s,a/2);if(this.background.clear(),this.bubble&&this.bubble.clear(),this.background.setFillStyle({color:l}),this.background.roundRect(0,0,a,d,r).fill(),o&&this.bubble){const e=(a-c)/2;this.bubble.setFillStyle({color:l}),this.bubble.poly([e,d-1,e+c,d-1,e+c/2,d+i]).fill()}}calculateContentWidth(){const e=n(),{iconWidth:t,container:o,cleanOrder:r,iconGap:i}=e.roomConfig.property,{paddingHorizontal:s}=o,l=e.getRoomData(this.roomId);if(!l)return 2*s;const{elementsToShow:a}=this.getDisplayElements(l);let d=s;return a.forEach((e,o)=>{const{isOrder:n}=e;d+=t,o<a.length-1&&(d+=n?r.gapRight:i)}),d+=s,d}calculateContentHeight(){const e=n().roomConfig,{iconHeight:t,container:o}=e.property;return o.paddingVertical+t+o.paddingVertical}getTotalHeight(){const e=n(),{foldable:t,container:o}=e.roomConfig.property,{tailHeight:r}=o;return this.calculateContentHeight()+(t?r:0)}getTotalWidth(){return this.calculateContentWidth()}setFolded(e){const t=n(),{foldable:o}=t.roomConfig.property;if(o)if(this.isFolded=e,e)this.background.visible=!1,this.orderContainer.visible=!1,this.propertyIcons.forEach(({sprite:e})=>{e.visible=!1}),this.bubble&&(this.bubble.visible=!0,this.bubble.rotation=Math.PI,this.repositionFoldedBubble());else{this.background.visible=!0,this.bubble&&(this.bubble.visible=!0,this.bubble.rotation=0,this.bubble.position.set(0,0)),this.updateBackground();const e=t.getRoomData(this.roomId);e&&this.updateIcons(e)}}isFoldedState(){const e=n(),{foldable:t}=e.roomConfig.property;return!!t&&this.isFolded}repositionFoldedBubble(){const e=n(),{foldable:t}=e.roomConfig.property;if(!t||!this.bubble)return;const o=e.roomConfig,{tailHeight:r}=o.property.container,i=this.calculateContentWidth(),s=this.calculateContentHeight(),l=i/2;this.bubble.position.set(l,s+r/2)}refreshColor(){const e=n(),{propertyTheme:t}=e.roomConfig.colors,o=e.getRoomData(this.roomId),r=o?.colorIndex??this.roomIndex,i=t[r%t.length];if(this.propertyIcons.forEach(({sprite:e})=>{e.tint=i}),this.orderBackground&&this.orderBackground.visible){const{property:o}=e.roomConfig,i=o.iconWidth,n=o.iconHeight;this.orderBackground.clear(),this.orderBackground.setFillStyle({color:t[r%t.length]}),this.orderBackground.circle(i/2,n/2,i/2).fill()}}destroy(){this.propertyIcons.forEach(({sprite:e})=>{e.destroy()}),this.propertyIcons.clear(),super.destroy()}}export{s as RoomProperty};
@@ -1 +0,0 @@
1
- import{Container as o,Graphics as t}from"pixi.js";import{EnhancedSprite as i}from"../Base/EnhancedSprite.js";import{useAppService as e}from"../../application/AppService.js";class c extends o{background;checkmarkIcon;bubble;roomIndex;roomId;constructor(o){super();const c=e().roomConfig;this.roomId=o.id,this.roomIndex=o.index,this.background=new t,this.bubble=new t;const{colors:{selectionIndicatorIcon:n}}=c;this.checkmarkIcon=new i,this.checkmarkIcon.tint=n[o.index%n.length],this.checkmarkIcon.anchor.set(0,0),this.addChild(this.background),this.addChild(this.bubble),this.addChild(this.checkmarkIcon),this.updateIndicator(o)}async updateIndicator(o){const t=e(),{roomSelectionMode:i,enableRoomSelection:c,selectRoomIds:n}=t.runtimeSnapshot;if(!c||"checkmark"!==i)return void(this.visible=!1);const r=n.includes(o.id);await this.showCheckmarkMode(r),this.updateBackground()}async showCheckmarkMode(o){const t=e(),{selectionIndicator:i}=t.roomConfig,{iconWidth:c,iconHeight:n}=i;if(o){this.visible=!0,this.checkmarkIcon.visible=!0,await this.checkmarkIcon.loadTextureAndSetSize("checkmark",{width:c,height:n,sizeFixed:!1});const o=i.containerWidth/2,t=i.containerHeight/2;this.checkmarkIcon.position.set(o-c/2,t-n/2)}else this.visible=!1}updateBackground(){const o=e(),{selectionIndicator:t,colors:i}=o.roomConfig,{containerWidth:c,containerHeight:n,strokeWidth:r,strokeColor:s,borderRadius:a,tailHeight:h,tailWidth:d}=t,l=o.getRoomData(this.roomId),k=l?.colorIndex??this.roomIndex,m=i.selectionIndicatorBackground[k%i.selectionIndicatorBackground.length];if(this.background.clear(),this.bubble.clear(),this.background.setFillStyle({color:m}).roundRect(0,0,c,n,a).fill().setStrokeStyle({color:s,width:r,alignment:0}).stroke(),h>0&&d>0){const o=(c-d)/2;this.bubble.setFillStyle({color:s});const t=n+r;this.bubble.poly([o,t-1,o+d,t-1,o+d/2,t+h]).fill()}}getTotalHeight(){const o=e(),{selectionIndicator:t}=o.roomConfig,{containerHeight:i,tailHeight:c,strokeWidth:n}=t;return i+n+(c>0?c:0)}getTotalWidth(){const o=e(),{selectionIndicator:t}=o.roomConfig;return t.containerWidth}async refreshColor(){const o=e().getRoomData(this.roomId);o&&await this.updateIndicator(o)}destroy(){this.checkmarkIcon?.destroy(),super.destroy()}}export{c as RoomSelectionIndicator};
@@ -1 +0,0 @@
1
- import{RoomName as o}from"./RoomName.js";import{RoomProperty as t}from"./RoomProperty.js";import{RoomSelectionIndicator as e}from"./RoomSelectionIndicator.js";import{ClickHandler as i}from"../../mixins/ClickHandler.js";import{FixedSizeContainer as r}from"../Base/FixedSizeContainer.js";import{useAppService as s}from"../../application/AppService.js";class n extends r{roomId;roomName;roomProperty=null;roomSelectionIndicator=null;clickHandler=null;constructor(t){super();const e=s();this.enableRenderGroup(),this.roomId=t.id,t.centerPoint&&this.position.set(t.centerPoint.x,t.centerPoint.y),this.roomName=new o(t),this.roomName.visible=e.runtimeSnapshot.showRoomName,this.createRoomProperty(t),this.createRoomSelectionIndicator(t),this.updateLayout(),this.clickHandler=new i(this,{onClick:()=>{e.events?.onClickRoomProperties?.(t)}})}shouldShowRoomProperty(){const o=s(),{showRoomOrder:t,showRoomProperty:e,selectRoomIds:i,enableRoomSelection:r,roomSelectionMode:n}=o.runtimeSnapshot,m=o.getRoomData(this.roomId);if(!m)return!1;if(r&&"checkmark"===n&&i.includes(this.roomId))return!1;const a=t&&(m.order||0)>0;let c=!1;if(e){const{displayOrders:t}=o.roomConfig.property;c=t.some(o=>"suction"===o&&null!=m.suction||"cistern"===o&&null!=m.cistern||"cleanMode"===o&&null!=m.cleanMode||"cleanTimes"===o&&m.cleanTimes>0||!(!m.customData||!(o in m.customData)||"number"!=typeof m.customData[o]||null==m.customData[o]))}return a||c}shouldShowRoomSelectionIndicator(){const o=s(),{enableRoomSelection:t,roomSelectionMode:e}=o.runtimeSnapshot;return t&&"checkmark"===e}updateRoomPropertyVisibility(){const o=s();if(this.roomProperty){if(this.shouldShowRoomProperty()){this.roomProperty.visible=!0;const t=o.runtimeSnapshot.roomPropertyFoldIds.includes(this.roomId);this.roomProperty.setFolded(t);const e=o.getRoomData(this.roomId);e&&this.roomProperty.updateProperty(e)}else this.roomProperty.visible=!1;this.updateLayout()}}async updateRoomSelectionIndicatorVisibility(){const o=s();if(this.roomSelectionIndicator){if(this.shouldShowRoomSelectionIndicator()){const t=o.getRoomData(this.roomId);t&&await this.roomSelectionIndicator.updateIndicator(t)}else this.roomSelectionIndicator.visible=!1;this.updateLayout()}}async createRoomProperty(o){const e=s();this.roomProperty&&(this.removeChild(this.roomProperty),this.roomProperty.destroy()),this.roomProperty=new t(o),await this.roomProperty.updateProperty(o),this.addChild(this.roomProperty),this.addChild(this.roomName),this.roomName.visible=e.runtimeSnapshot.showRoomName,this.updateRoomPropertyVisibility()}async createRoomSelectionIndicator(o){this.roomSelectionIndicator&&(this.removeChild(this.roomSelectionIndicator),this.roomSelectionIndicator.destroy()),this.roomSelectionIndicator=new e(o),this.addChild(this.roomSelectionIndicator),await this.updateRoomSelectionIndicatorVisibility()}updateLayout(){const o=s(),{property:{offsetY:t,offsetX:e},selectionIndicator:{offsetY:i,offsetX:r}}=o.roomConfig,n=this.roomProperty?.visible||!1,m=this.roomName.visible,a=this.roomSelectionIndicator?.visible||!1;if(n&&this.roomProperty)if(this.roomProperty.isFoldedState())this.roomProperty.position.set(e,-t);else{const o=this.roomProperty.getTotalHeight(),i=this.roomProperty.getTotalWidth();m?(this.roomProperty.position.set(-i/2+e,-t-o),this.roomName.position.set(0,0)):this.roomProperty.position.set(-i/2+e,-o/2-t)}if(a&&this.roomSelectionIndicator){const o=this.roomSelectionIndicator.getTotalHeight(),t=this.roomSelectionIndicator.getTotalWidth();m?(this.roomSelectionIndicator.position.set(-t/2+r,-i-o),this.roomName.position.set(0,0)):this.roomSelectionIndicator.position.set(-t/2+r,-o/2-i)}!m||n||a||this.roomName.position.set(0,0)}updateName(o){this.roomName.updateName(o)}updateRoomNameVisibility(o){this.roomName.visible=o,this.updateLayout()}updatePosition(o){this.position.set(o.x,o.y)}async refreshColor(){this.roomName&&this.roomName.refreshColor(),this.roomProperty&&this.roomProperty.refreshColor(),this.roomSelectionIndicator&&await this.roomSelectionIndicator.refreshColor()}destroy(){this.clickHandler?.destroy(),this.clickHandler=null,this.roomProperty?.destroy(),this.roomProperty=null,this.roomSelectionIndicator?.destroy(),this.roomSelectionIndicator=null,this.roomName?.destroy(),super.destroy()}}export{n as RoomInfo};
@@ -1 +0,0 @@
1
- import o from"../assets/chargingStation.png.js";import e from"../assets/robot.png.js";import t from"../assets/fan0.png.js";import i from"../assets/fan1.png.js";import r from"../assets/fan2.png.js";import s from"../assets/fan3.png.js";import n from"../assets/fan4.png.js";import a from"../assets/water0.png.js";import f from"../assets/water1.png.js";import l from"../assets/water2.png.js";import d from"../assets/water3.png.js";import h from"../assets/cleanMode0.png.js";import c from"../assets/cleanMode1.png.js";import p from"../assets/cleanMode2.png.js";import m from"../assets/cleanMode3.png.js";import g from"../assets/cleanTimes1.png.js";import b from"../assets/cleanTimes2.png.js";import S from"../assets/controlScale.png.js";import u from"../assets/controlDelete.png.js";import C from"../assets/controlRotate.png.js";import W from"../assets/controlMove.png.js";import k from"../assets/checkmark.png.js";import y from"../assets/spot.png.js";import D from"../assets/floorType1.png.js";import j from"../assets/floorType2.png.js";import x from"../assets/floorType3.png.js";import F from"../assets/carpet.png.js";import w from"../assets/sleep.json.js";import{SPECIAL_ROOM_IDS as A}from"@ray-js/robot-protocol";const O="system-ui, -apple-system, sans-serif",R=["#2563b8","#26966b","#7c3fb8","#d97706"],P={global:{containerTop:"0px",containerLeft:"0px",containerWidth:"100%",containerHeight:"100%",backgroundColor:"#f6f6f6"},map:{autoPaddingPercent:.05,adjacencyThreshold:3,obstacleColor:"#999999",freeColor:"#ebebeb"},room:{colors:{active:["#a8c8f5","#9de5c7","#d4b9f7","#ffd399"],inactive:["#d6e7fc","#d1f4e5","#ece0fb","#fff0d9"],name:[...R],propertyTheme:[...R],selectionIndicatorBackground:[...R],selectionIndicatorIcon:["#ffffff","#ffffff","#ffffff","#ffffff"],[A.NO_ROOM_DATA]:"#ebebeb",[A.ROOM_GAP]:"#ebebeb",[A.OBSTACLE_ROOM]:"#ebebeb",[A.UNKNOWN_ROOM]:"#ebebeb"},nameLabel:{fontSize:10,fontFamily:O,fontWeight:"500"},property:{displayOrders:["cleanMode","suction","cistern","cleanTimes"],iconWidth:12,iconHeight:12,foldable:!0,offsetX:0,offsetY:4,iconGap:0,container:{backgroundColor:"#ffffff",paddingVertical:1.5,paddingHorizontal:1.5,borderRadius:16,tailHeight:2,tailWidth:10},suction:{assets:[t,i,r,s,n]},cistern:{assets:[a,f,l,d]},cleanMode:{assets:[h,c,p,m]},cleanTimes:{assets:[g,b]},cleanOrder:{color:"#ffffff",fontFamily:O,fontWeight:"400",fontSize:8,gapRight:2}},selectionIndicator:{iconSrc:k,iconWidth:12,iconHeight:12,containerWidth:16,containerHeight:16,strokeWidth:2,strokeColor:"#ffffff",borderRadius:16,offsetY:4,offsetX:0,tailHeight:2,tailWidth:6},floorType:{assets:["",D,j,x],opacity:.1,scale:.2}},path:{lineWidthFixed:!1,incrementalThreshold:5,commonPath:{visible:!0,color:"#ffffff",width:.5},transitionPath:{visible:!1,color:"#ffffff",width:.5},chargePath:{visible:!1,color:"#ffffff",width:.5}},carpet:{src:F,opacity:.5,scale:.2},robot:{icon:{sizeFixed:!1,width:8,height:8,src:e},speed:0,rotationCorrection:0,sleepAnimation:{jsonSrc:w,framePrefix:"sleep_",width:16,height:16,sizeFixed:!1,frameCount:96,offsetX:8,offsetY:-8},ringSize:1,ringColor:"rgba(255, 68, 68, 0.2)",ringStrokeWidth:1,ringStrokeColor:"#ffffff",ringStrokeDashed:!0,ringStrokeDashArray:[4,4]},chargingStation:{icon:{sizeFixed:!1,width:8,height:8,src:o},rotationCorrection:0,ringSize:1,ringColor:"rgba(255, 68, 68, 0.2)",ringStrokeWidth:1,ringStrokeColor:"#ffffff",ringStrokeDashed:!0,ringStrokeDashArray:[4,4]},interaction:{zoomRange:{min:.5,max:8},fitMinScale:1,fitMaxScale:4,enableDoubleTapZoom:!0},controls:{iconWrapperWidth:24,iconWrapperHeight:24,iconWrapperBorderRadius:16,iconWidth:12,iconHeight:12,deleteIconSrc:u,rotateIconSrc:C,scaleIconSrc:S,moveIconSrc:W,moveButtonOffset:30,textFontSize:12,textFontFamily:O,textFontWeight:"400",unitLabel:"m",forbiddenSweepZone:{minSize:1,iconWrapperFillColor:"#ff4444",strokeColor:"#ff4444",strokeWidth:2,fillColor:"rgba(255, 68, 68, 0.1)",outlineOffset:16,outlineStrokeColor:"#ff4444",outlineStrokeWidth:2,outlineDashed:!0,outlineDashArray:[4,3],outlineFillColor:"rgba(255, 68, 68, 0.05)",showRotateButton:!0,textColor:"#ff4444",textPosition:"bottom",textOffset:8,editing:{isDashed:!1,dashArray:[0,0]},normal:{isDashed:!1,dashArray:[0,0]}},forbiddenMopZone:{minSize:1,iconWrapperFillColor:"#fe8a07",strokeColor:"#fe8a07",strokeWidth:2,fillColor:"rgba(254, 138, 7, 0.1)",outlineOffset:16,outlineStrokeColor:"#fe8a07",outlineStrokeWidth:2,outlineDashed:!0,outlineDashArray:[4,3],outlineFillColor:"rgba(254, 138, 7, 0.05)",showRotateButton:!0,textColor:"#fe8a07",textPosition:"bottom",textOffset:8,editing:{isDashed:!1,dashArray:[0,0]},normal:{isDashed:!1,dashArray:[0,0]}},cleanZone:{minSize:1,iconWrapperFillColor:"#5d68fe",strokeColor:"#5d68fe",strokeWidth:2,fillColor:"rgba(93, 104, 254, 0.1)",outlineOffset:16,outlineStrokeColor:"#5d68fe",outlineStrokeWidth:2,outlineDashed:!0,outlineDashArray:[4,3],outlineFillColor:"rgba(93, 104, 254, 0.05)",showRotateButton:!0,textColor:"#5d68fe",textPosition:"bottom",textOffset:8,editing:{isDashed:!1,dashArray:[0,0]},normal:{isDashed:!1,dashArray:[0,0]}},virtualWall:{iconWrapperFillColor:"#ff4444",lineWidth:2,lineColor:"#ff4444",hitAreaThickness:30,outlineOffset:16,outlineStrokeColor:"#ff4444",outlineStrokeWidth:2,outlineDashed:!0,outlineDashArray:[4,3],outlineFillColor:"rgba(255, 68, 68, 0.05)",minWidth:1,textColor:"#ff4444",textOffset:8,editing:{isDashed:!1,dashArray:[0,0]},normal:{isDashed:!1,dashArray:[0,0]}},spot:{iconSrc:y,iconSize:8,size:1,strokeColor:"#5d68fe",strokeWidth:2,fillColor:"rgba(93, 104, 254, 0.1)",textColor:"#5d68fe",textPosition:"bottom",textOffset:8,editing:{isDashed:!1,dashArray:[0,0]},normal:{isDashed:!1,dashArray:[0,0]}}},divider:{lineColor:"#ff4444",dashLineWidth:2,dashLineDashArray:[4,3],solidLineWidth:2,endPointSize:12,endPointColor:"#ff4444",endPointStrokeColor:"#ffffff",endPointStrokeWidth:2,hitAreaThickness:30,resetDividerWhenOutOfRoom:!1,defaultExtension:20,defaultDirection:"horizontal"},detectedObject:{height:43,width:38,interactive:!1},heatmap:{cellSize:2,maxDistance:14,smoothIterations:10,heatmapAlpha:.8,colorGradients:["#FF3B30","#FF7A00","#FFA100","#FFD700","#99DD70","#2EC070","#40E0D0","#88D0E9"]},snapshot:{format:"png",quality:1,antialias:!0,resolution:window?.devicePixelRatio||1}},z={dividingRoomId:null,enableRoomSelection:!1,editingForbiddenSweepZoneIds:[],editingForbiddenMopZoneIds:[],editingCleanZoneIds:[],editingVirtualWallIds:[],editingSpotIds:[],roomPropertyFoldIds:[],roomSelectionMode:"checkmark",selectRoomIds:[],showRoomProperty:!1,showRoomOrder:!0,showRoomName:!0,showPath:!0,showChargingStation:!0,showRoomFloorType:!0,showCarpet:!0,showChargingStationRing:!1,showRobotRing:!1,showRobotSleepAnimation:!1};export{P as DEFAULT_CONFIG,z as DEFAULT_RUNTIME_CONFIG,O as TEXT_FONT_FAMILY};
@@ -1 +0,0 @@
1
- const e="MAIN",o=5e3;export{e as MAIN_INSTANCE_KEY,o as RASTER_CHUNK_SIZE};
@@ -1 +0,0 @@
1
- import{LAYER_CONTROLS as e}from"../application/AppContainer.js";import{subscribeKey as t}from"valtio/vanilla/utils";import{ForbiddenSweepZone as o}from"../components/Controls/ForbiddenSweepZone.js";import{ForbiddenMopZone as i}from"../components/Controls/ForbiddenMopZone.js";import{CleanZone as a}from"../components/Controls/CleanZone.js";import{VirtualWall as n}from"../components/Controls/VirtualWall.js";import{Spot as r}from"../components/Controls/Spot.js";import{Divider as s}from"../components/Controls/Divider.js";import{Logger as l}from"../utils/logger.js";import{useAppService as d}from"../application/AppService.js";class p{forbiddenSweepZoneMap=new Map;forbiddenMopZoneMap=new Map;cleanZoneMap=new Map;virtualWallMap=new Map;spotMap=new Map;divider=null;unsubscribeFns=[];constructor(){const e=d(),o=t(e.runtime,"editingForbiddenSweepZoneIds",e=>{l.log(`[runtime] editingForbiddenSweepZoneIds: ${e}`),this.updateZonesEditState(this.forbiddenSweepZoneMap)}),i=t(e.runtime,"editingForbiddenMopZoneIds",e=>{l.log(`[runtime] editingForbiddenMopZoneIds: ${e}`),this.updateZonesEditState(this.forbiddenMopZoneMap)}),a=t(e.runtime,"editingCleanZoneIds",e=>{l.log(`[runtime] editingCleanZoneIds: ${e}`),this.updateZonesEditState(this.cleanZoneMap)}),n=t(e.runtime,"editingVirtualWallIds",e=>{l.log(`[runtime] editingVirtualWallIds: ${e}`),this.updateVirtualWallsEditState(this.virtualWallMap)}),r=t(e.runtime,"editingSpotIds",e=>{l.log(`[runtime] editingSpotIds: ${e}`),this.updateSpotsEditState(this.spotMap)}),s=t(e.runtime,"dividingRoomId",e=>{l.log(`[runtime] dividingRoomId: ${e}`),this.handleDividingRoomIdChange(e)});this.unsubscribeFns.push(o,i,a,n,r,s)}updatePositionByOrigin(t,o){const i=d().appContainer.getLayer(e);i&&i.position.set(t,o)}drawForbiddenSweepZones(e){this.drawZones(e,this.forbiddenSweepZoneMap,e=>o.create(e))}getForbiddenSweepZones(){return this.getZonesData(this.forbiddenSweepZoneMap)}clearAllForbiddenSweepZones(){this.clearAllZones(this.forbiddenSweepZoneMap)}drawForbiddenMopZones(e){this.drawZones(e,this.forbiddenMopZoneMap,e=>i.create(e))}getForbiddenMopZones(){return this.getZonesData(this.forbiddenMopZoneMap)}clearAllForbiddenMopZones(){this.clearAllZones(this.forbiddenMopZoneMap)}drawCleanZones(e){this.drawZones(e,this.cleanZoneMap,e=>a.create(e))}getCleanZones(){return this.getZonesData(this.cleanZoneMap)}clearAllCleanZones(){this.clearAllZones(this.cleanZoneMap)}drawVirtualWalls(t){const o=d(),i=this.virtualWallMap,a=new Set(t.map(e=>e.id));for(const[t,n]of i)a.has(t)||(o.appContainer.removeFromLayer(e,n),n.destroy(),i.delete(t));t.forEach(t=>{const a=i.get(t.id);if(a)this.isWallDataEqual(a.getWallData(),t)||a.updateWallData(t);else{const a=new n({wallData:t,events:{onRemove:e=>{o.events?.onRemoveVirtualWall?.(e)},onUpdate:e=>{o.events?.onUpdateVirtualWall?.(e)},onClick:e=>{o.events?.onClickVirtualWall?.(e)}}});i.set(t.id,a),o.appContainer.addToLayer(e,a)}})}getVirtualWalls(){return this.getWallsData(this.virtualWallMap)}clearAllVirtualWalls(){this.clearAllWalls(this.virtualWallMap)}drawSpots(e){const t=this.spotMap;if(!e||0===e.length)return void this.clearAllSpotsInternal(t);const o=new Set(t.keys()),i=new Set(e.map(e=>e.id));for(const e of o)i.has(e)||this.removeSpot(e,t);e.forEach(e=>{const o=t.get(e.id);o?this.isSpotDataEqual(o.getSpotData(),e)||o.updateSpotData(e):this.addNewSpot(e,t)})}getSpots(){return this.getSpotsData(this.spotMap)}clearAllSpots(){this.clearAllSpotsInternal(this.spotMap)}drawZones(e,t,o){if(!e||0===e.length)return void this.clearAllZones(t);const i=new Set(t.keys()),a=new Set(e.map(e=>e.id));for(const e of i)a.has(e)||this.removeZone(e,t);e.forEach(e=>{const i=t.get(e.id);i?this.isZoneDataEqual(i.getZoneData(),e)||i.updateZoneData(e):this.addNewZone(e,t,o)})}addNewZone(t,o,i){const a=d(),n=i(t);o.set(t.id,n),a.appContainer.addToLayer(e,n)}removeZone(t,o){const i=d(),a=o.get(t);a&&(i.appContainer.removeFromLayer(e,a),a.destroy(),o.delete(t))}getZonesData(e){const t=[];return e.forEach(e=>{t.push(e.getZoneData())}),t}clearAllZones(e){e.forEach((t,o)=>{const i=e.get(o);i&&(i.parent?.removeChild(i),i.destroy())}),e.clear()}updateZonesEditState(e){e.forEach(e=>{e.updateEditState()})}updateVirtualWallsEditState(e){e.forEach(e=>{e.updateEditingState()})}isZoneDataEqual(e,t){if(e.id!==t.id)return!1;if(e.points.length!==t.points.length)return!1;for(let o=0;o<e.points.length;o++){const i=e.points[o],a=t.points[o];if(Math.abs(i.x-a.x)>.1||Math.abs(i.y-a.y)>.1)return!1}return!0}getWallsData(e){return Array.from(e.values()).map(e=>e.getWallData())}clearAllWalls(e){for(const t of e.values())t.destroy();e.clear()}isWallDataEqual(e,t){if(e.id!==t.id)return!1;if(e.points.length!==t.points.length)return!1;for(let o=0;o<e.points.length;o++){const i=e.points[o],a=t.points[o];if(Math.abs(i.x-a.x)>.1||Math.abs(i.y-a.y)>.1)return!1}return!0}addNewSpot(t,o){const i=d(),a=r.create(t);o.set(t.id,a),i.appContainer.addToLayer(e,a)}removeSpot(t,o){const i=d(),a=o.get(t);a&&(i.appContainer.removeFromLayer(e,a),a.destroy(),o.delete(t))}getSpotsData(e){const t=[];return e.forEach(e=>{t.push(e.getSpotData())}),t}clearAllSpotsInternal(e){e.forEach((t,o)=>{const i=e.get(o);i&&(i.parent?.removeChild(i),i.destroy())}),e.clear()}updateSpotsEditState(e){e.forEach(e=>{e.updateEditState()})}isSpotDataEqual(e,t){if(e.id!==t.id)return!1;const o=e.point,i=t.point;return!(Math.abs(o.x-i.x)>.1||Math.abs(o.y-i.y)>.1)}handleDividingRoomIdChange(e){null!=e&&this.getRoomGeometry(e)?this.createDefaultDivider(e):this.clearDivider()}getRoomGeometry(e){return d().mapManager.getRoomById(e)}createDefaultDivider(t){const o=d();this.clearDivider(),this.divider=new s({roomId:t,events:{onUpdate:e=>{o.events?.onUpdateDivider?.(e)}}}),o.appContainer.addToLayer(e,this.divider)}clearDivider(){this.divider&&(d().appContainer.removeFromLayer(e,this.divider),this.divider.destroy(),this.divider=null)}getDividerEndPoints(){return this.divider?this.divider.getDividerEndPoints():null}getEffectiveDividerPoints(){return this.divider?this.divider.getEffectiveDividerPoints():null}destroy(){this.clearAllForbiddenSweepZones(),this.clearAllForbiddenMopZones(),this.clearAllCleanZones(),this.clearAllVirtualWalls(),this.clearAllSpots(),this.clearDivider(),this.unsubscribeFns.forEach(e=>e()),this.unsubscribeFns=[]}}export{p as ControlsManager};
@@ -1 +0,0 @@
1
- import{Assets as e,Ticker as t}from"pixi.js";import{CustomGif as i}from"../components/CustomElements/CustomGif.js";import{CustomImage as s}from"../components/CustomElements/CustomImage.js";import{CustomHTML as a}from"../components/CustomElements/CustomHTML.js";import{LAYER_CUSTOM_ELEMENT as n,LAYER_CUSTOM_ELEMENT_GIF as r}from"../application/AppContainer.js";import{Logger as o}from"../utils/logger.js";import{useAppService as m}from"../application/AppService.js";class p{customElementsMap=new Map;gifTicker=null;gifElements=new Set;constructor(){}updatePositionByOrigin(e,t){const i=m(),s=i.appContainer.getLayer(n),a=i.appContainer.getLayer(r);s&&s.position.set(e,t),a&&a.position.set(e,t)}async drawCustomElements(e){if(!e||0===e.length)return void this.clearAllCustomElements();const t=new Set(e.map(e=>e.id)),i=Array.from(this.customElementsMap.keys());for(const e of i)t.has(e)||this.removeCustomElement(e);const s=e.map(async e=>{const t=this.customElementsMap.get(e.id);t?this.isSameData(t,e)||("gif"===e.type&&t.getElementData().src!==e.src?(this.removeCustomElement(e.id),await this.addNewCustomElement(e)):await this.updateElementData(t,e)):await this.addNewCustomElement(e)});await Promise.all(s),this.updateGifTicker()}clearAllCustomElements(){const e=m();this.customElementsMap.forEach(t=>{t instanceof i?e.appContainer.removeFromLayer(r,t):e.appContainer.removeFromLayer(n,t),t.destroy()}),this.customElementsMap.clear(),this.gifElements.clear(),this.stopGifTicker()}async addNewCustomElement(t){const o=m();let p;switch(t.type){case"image":p=new s(t);break;case"gif":{const s=await e.load(t.src);p=new i(s,t);break}case"html":p=new a(t);break;default:throw new Error(`Unsupported custom element type: ${t.type}`)}await p.initialize(),this.customElementsMap.set(t.id,p),p instanceof i?(o.appContainer.addToLayer(r,p),this.gifElements.add(p)):o.appContainer.addToLayer(n,p)}removeCustomElement(e){const t=m(),s=this.customElementsMap.get(e);s&&(s instanceof i?(this.gifElements.delete(s),t.appContainer.removeFromLayer(r,s)):t.appContainer.removeFromLayer(n,s),s.destroy(),this.customElementsMap.delete(e))}isSameData(e,t){return e.getElementData().type===t.type&&("image"===t.type&&e instanceof s||"gif"===t.type&&e instanceof i||"html"===t.type&&e instanceof a)&&e.isSameData(t)}async updateElementData(e,t){if("image"===t.type&&e instanceof s)await e.updateElementData(t);else if("gif"===t.type&&e instanceof i)await e.updateElementData(t);else{if(!("html"===t.type&&e instanceof a))throw new Error("Element type mismatch during update");await e.updateElementData(t)}}updateGifTicker(){this.gifElements.size>0?this.startGifTicker():this.stopGifTicker()}startGifTicker(){this.gifTicker?.started||(this.gifTicker?this.gifTicker.maxFPS=1:(this.gifTicker=new t,this.gifTicker.maxFPS=1,this.gifTicker.add(()=>{this.renderGifContainer()})),this.gifTicker.start())}stopGifTicker(){this.gifTicker?.started&&(o.log("⏸️ [GifTicker] 停止 GIF 专用渲染"),this.gifTicker.stop())}renderGifContainer(){const e=m();if(0===this.gifElements.size)return;const t=e.getApp();t.renderer.render(t.stage)}destroy(){this.stopGifTicker(),this.gifTicker&&(this.gifTicker.destroy(),this.gifTicker=null),this.clearAllCustomElements()}}export{p as CustomElementsManager};
@@ -1 +0,0 @@
1
- import{LAYER_DETECTED_OBJECT as e}from"../application/AppContainer.js";import{DetectedObject as t}from"../components/DetectedObject/index.js";import{useAppService as a}from"../application/AppService.js";class c{detectedObjectMap=new Map;updatePositionByOrigin(t,c){const i=a().appContainer.getLayer(e);i&&i.position.set(t,c)}async drawDetectedObjects(e){if(!e||0===e.length)return void this.clearAllDetectedObjects();const t=new Set(e.map(e=>e.id)),a=Array.from(this.detectedObjectMap.keys());for(const e of a)t.has(e)||this.removeDetectedObject(e);for(const t of e){const e=this.detectedObjectMap.get(t.id);e?e.isSameData(t)||await e.updateObjectData(t):await this.addNewDetectedObject(t)}}clearAllDetectedObjects(){const t=a();this.detectedObjectMap.forEach(a=>{t.appContainer.removeFromLayer(e,a),a.destroy()}),this.detectedObjectMap.clear()}async addNewDetectedObject(c){const i=a(),o=new t(c);await o.initializeSprite(),this.detectedObjectMap.set(c.id,o),i.appContainer.addToLayer(e,o)}removeDetectedObject(t){const c=a(),i=this.detectedObjectMap.get(t);i&&(c.appContainer.removeFromLayer(e,i),i.destroy(),this.detectedObjectMap.delete(t))}destroy(){this.clearAllDetectedObjects()}}export{c as DetectedObjectManager};
@@ -1 +0,0 @@
1
- import{Heatmap as t}from"../components/Heatmap/index.js";import{useAppService as i}from"../application/AppService.js";class a{heatmap=new t;pointsTopLeftOrigin=[];signalGrid=[];cellSize=2;maxDistance=14;smoothIterations=10;heatmapAlpha=.8;constructor(){const t=i().heatMapConfig;this.cellSize=t.cellSize,this.maxDistance=t.maxDistance,this.smoothIterations=t.smoothIterations,this.heatmapAlpha=t.heatmapAlpha}draw({mapData:t,heatmapPoints:a,useGradient:e=!0}){const s=i(),l=t.origin[0],n=t.origin[1],{minX:o,minY:h}=s.mapManager.mapBounds,r=a.map(t=>({x:+(l+t.x-o).toFixed(0),y:+(n+t.y-h).toFixed(0),signal:t.signal}));this.signalGrid=this.calculateInterpolatedSignal(r),this.heatmap.draw(this.signalGrid,e,this.heatmapAlpha)}calculateInterpolatedSignal(t){const a=i(),{minX:e,minY:s,maxX:l,maxY:n}=a.mapManager.mapBounds,o=Math.ceil((n-s)/this.cellSize),h=Math.ceil((l-e)/this.cellSize),r=Array(o).fill(null).map(()=>Array(h).fill(null));for(let i=0;i<o;i++){const a=s+i*this.cellSize+this.cellSize/2,o=Math.min(this.cellSize,n-(a-this.cellSize/2));for(let s=0;s<h;s++){const n=e+s*this.cellSize+this.cellSize/2,h=Math.min(this.cellSize,l-(n-this.cellSize/2));let c=0,m=!1;for(let i=0;i<t.length;i++){const e=t[i];if(Math.abs(n-e.x)<=h/2&&Math.abs(a-e.y)<=o/2){const t=1-e.signal/7;c=Math.round(10*Math.max(c,t))/10,m=!0}}r[i][s]={x:n,y:a,signal:c,hasPoint:m}}}const c=(i,a)=>{if(0===t.length)return 0;let e=0,s=0;for(const l of t){const t=Math.sqrt((i-l.x)**2+(a-l.y)**2);if(t<=this.maxDistance){const i=1/(1+t);s+=i*(1-l.signal/7),e+=i}}return 0===e?0:Math.round(s/e*1e3)/1e3};for(let t=0;t<o;t++)for(let i=0;i<h;i++){const a=r[t][i];a.hasPoint||(a.signal=c(a.x,a.y))}return((t,i=1)=>{for(let a=0;a<i;a++){const i=t.map(t=>[...t]);for(let a=1;a<o-1;a++)for(let e=1;e<h-1;e++)if(!t[a][e].hasPoint){let s=0,l=0;const n=4;for(let i=-n;i<=n;i++)for(let r=-n;r<=n;r++){if(0===i&&0===r)continue;const n=a+i,c=e+r;if(n>=0&&n<o&&c>=0&&c<h){const a=1/(1+.3*Math.sqrt(i*i+r*r));s+=t[n][c].signal*a,l+=a}}if(l>0){const n=s/l,o=.6,h=.4;i[a][e].signal=t[a][e].signal*o+n*h,i[a][e].signal>.1&&(i[a][e].signal=Math.max(i[a][e].signal,.2))}}for(let a=0;a<o;a++)for(let e=0;e<h;e++)t[a][e].signal=i[a][e].signal}})(r,this.smoothIterations),r}}export{a as HeatmapManager};