sceneGroupInEditor.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <template>
  2. <div class="scene-group">
  3. <div
  4. class="top-bar"
  5. :class="isConfirmingDeletion ? '' : 'show-icons-on-hover'"
  6. @click="onClickTopBar"
  7. :style="{
  8. paddingLeft: topBarPaddingLeft,
  9. }"
  10. >
  11. <i class="iconfont icon-edit_input_arrow icon-expand" :class="isExpanded ? '' : 'collapsed'"></i>
  12. <i v-show="isExpanded" class="iconfont icon-editor_folder_on folder_expalded"></i>
  13. <i v-show="!isExpanded" class="iconfont icon-editor_folder_off folder_collapsed"></i>
  14. <span class="group-name" v-title="groupNode.name">{{groupNode.name}}</span>
  15. <i v-show="level === 1"
  16. class="iconfont icon-editor_list_add icon-add"
  17. v-tool-tip-wrapper
  18. >
  19. <TooltipInEditor
  20. :text="'新增二级分组'"
  21. ></TooltipInEditor>
  22. </i>
  23. <i
  24. class="iconfont icon-editor_list_image icon-image"
  25. v-tool-tip-wrapper
  26. >
  27. <TooltipInEditor
  28. :text="'新增全景图或三维场景'"
  29. ></TooltipInEditor>
  30. </i>
  31. <i
  32. class="iconfont icon-editor_list_edit icon-edit"
  33. v-tool-tip-wrapper
  34. >
  35. <TooltipInEditor
  36. :text="'重命名'"
  37. ></TooltipInEditor>
  38. </i>
  39. <i
  40. class="iconfont icon-editor_list_delete icon-delete"
  41. v-tool-tip-wrapper
  42. @click.stop="onRequestForDelete"
  43. >
  44. <TooltipInEditor
  45. :text="'删除'"
  46. ></TooltipInEditor>
  47. </i>
  48. <div class="deletion-confirm-wrap">
  49. <div class="deletion-confirm" :class="isConfirmingDeletion ? 'show' : 'hide'"
  50. v-clickoutside="onRequestForCancelDelete"
  51. @click.stop="onConfirmDelete"
  52. >
  53. 删除
  54. </div>
  55. </div>
  56. </div>
  57. <div class="group-content" v-if="isExpanded">
  58. <template v-if="!(groupNode.children.length === 1 && groupNode.children[0].name === '默认二级分组')">
  59. <div
  60. v-for="(item) of groupNode.children"
  61. :key=item.id
  62. >
  63. <component
  64. :is="'SceneGroup'"
  65. v-if="!item.type"
  66. :groupNode="item"
  67. :level="level + 1"
  68. @renameScene="onRenameScene"
  69. @deleteScene="onDeleteScene"
  70. @deleteGroup="onInnerGroupConfirmDelete"
  71. />
  72. <SceneInGroupInEditor
  73. v-else
  74. :style="{
  75. paddingLeft: sceneItemPaddingLeft,
  76. }"
  77. :sceneInfo="item"
  78. @rename="onRenameScene"
  79. @delete="onDeleteScene"
  80. />
  81. </div>
  82. </template>
  83. <template v-else>
  84. <!-- 自动生成的默认二级分组不显示,里边的内容显示成直属于一级分组的效果。 -->
  85. <SceneInGroupInEditor
  86. v-for="(item) of groupNode.children[0].children"
  87. :key=item.id
  88. :style="{
  89. paddingLeft: sceneItemPaddingLeft,
  90. }"
  91. :sceneInfo="item"
  92. @rename="onRenameScene"
  93. @delete="onDeleteScene"
  94. />
  95. </template>
  96. </div>
  97. </div>
  98. </template>
  99. <script>
  100. import TooltipInEditor from '@/components/TooltipInEditor.vue'
  101. import SceneInGroupInEditor from "@/components/sceneInGroupInEditor.vue";
  102. export default {
  103. name: 'SceneGroup',
  104. components: {
  105. TooltipInEditor,
  106. SceneInGroupInEditor,
  107. },
  108. props: {
  109. groupNode: {
  110. type: Object,
  111. required: true,
  112. },
  113. level: {
  114. type: Number,
  115. default: 1,
  116. }
  117. },
  118. data() {
  119. return {
  120. isExpanded: false,
  121. isConfirmingDeletion: false,
  122. }
  123. },
  124. computed: {
  125. topBarPaddingLeft() {
  126. return 12 + (this.level - 1) * 12 + 'px'
  127. },
  128. sceneItemPaddingLeft() {
  129. return 18 + this.level * 12 + 'px'
  130. },
  131. },
  132. methods: {
  133. onClickTopBar() {
  134. if (this.isConfirmingDeletion) {
  135. return
  136. }
  137. this.isExpanded = !this.isExpanded
  138. if (this.isExpanded) {
  139. this.$bus.emit('scene-group-expanded', this.groupNode.id, this.level)
  140. }
  141. },
  142. onOtherSceneGroupExpanded(id, level) {
  143. if (id !== this.groupNode.id && level === this.level) {
  144. this.isExpanded = false
  145. }
  146. },
  147. onRenameScene(...params) {
  148. this.$emit('renameScene', ...params)
  149. },
  150. onDeleteScene(...params) {
  151. this.$emit('deleteScene', ...params)
  152. },
  153. onRequestForDelete() {
  154. this.isConfirmingDeletion = true
  155. },
  156. onRequestForCancelDelete() {
  157. if (!this.isConfirmingDeletion) {
  158. return
  159. }
  160. // 先保持isConfirmingDeletion不变,因为onClickTopBar可能要用到
  161. setTimeout(() => {
  162. this.isConfirmingDeletion = false
  163. }, 0);
  164. },
  165. onConfirmDelete() {
  166. this.$emit('deleteGroup', this.groupNode.id, this.level)
  167. this.isConfirmingDeletion = false
  168. },
  169. onInnerGroupConfirmDelete(...params) {
  170. console.log('jlkjljlkj');
  171. this.$emit('deleteGroup', ...params)
  172. }
  173. },
  174. mounted() {
  175. this.$bus.on('scene-group-expanded', this.onOtherSceneGroupExpanded)
  176. },
  177. destroyed() {
  178. this.$bus.removeListener('scene-group-expanded', this.onOtherSceneGroupExpanded)
  179. }
  180. }
  181. </script>
  182. <style lang="less" scoped>
  183. .scene-group {
  184. margin-top: 6px;
  185. .top-bar {
  186. position: relative;
  187. color: rgba(255, 255, 255, 0.6);
  188. height: 40px;
  189. border-radius: 4px;
  190. display: flex;
  191. align-items: center;
  192. margin-left: -12px;
  193. margin-right: -10px;
  194. padding-right: 10px;
  195. &:hover {
  196. background: #313131;
  197. > .group-name {
  198. width: 120px;
  199. }
  200. }
  201. &.show-icons-on-hover:hover {
  202. > .icon-add, .icon-image, .icon-edit, .icon-delete {
  203. display: block;
  204. }
  205. }
  206. > .icon-expand {
  207. display: inline-block;
  208. font-size: 12px;
  209. transform: scale(0.7);
  210. &.collapsed {
  211. display: inline-block;
  212. transform: scale(0.7) rotate(-90deg);
  213. }
  214. }
  215. > .folder_expalded {
  216. font-size: 16px;
  217. margin-left: 7px;
  218. }
  219. > .folder_collapsed {
  220. font-size: 16px;
  221. margin-left: 7px;
  222. }
  223. > .group-name {
  224. margin-left: 6px;
  225. display: inline-block;
  226. text-overflow: ellipsis;
  227. overflow: hidden;
  228. white-space: nowrap;
  229. flex: 1 1 auto;
  230. }
  231. > .icon-add {
  232. margin-left: 12px;
  233. display: none;
  234. cursor: pointer;
  235. &:hover {
  236. color: #0076f6;
  237. }
  238. }
  239. > .icon-image {
  240. margin-left: 12px;
  241. display: none;
  242. cursor: pointer;
  243. &:hover {
  244. color: #0076f6;
  245. }
  246. }
  247. > .icon-edit {
  248. margin-left: 12px;
  249. display: none;
  250. cursor: pointer;
  251. &:hover {
  252. color: #0076f6;
  253. }
  254. }
  255. > .icon-delete {
  256. margin-left: 12px;
  257. display: none;
  258. cursor: pointer;
  259. &:hover {
  260. color: #fa5555;
  261. }
  262. }
  263. .deletion-confirm-wrap {
  264. position: absolute;
  265. top: 0;
  266. bottom: 0;
  267. right: 0;
  268. width: 44px;
  269. overflow: hidden;
  270. pointer-events: none;
  271. border-top-right-radius: 4px;
  272. border-bottom-right-radius: 4px;
  273. > .deletion-confirm {
  274. position: absolute;
  275. top: 0;
  276. bottom: 0;
  277. width: 100%;
  278. background: #FA5555;
  279. transition: right 0.3s;
  280. cursor: pointer;
  281. text-align: center;
  282. font-size: 12px;
  283. color: #fff;
  284. pointer-events: auto;
  285. &::after {
  286. content: '';
  287. height: 100%;
  288. vertical-align: middle;
  289. display: inline-block;
  290. }
  291. &.show {
  292. right: 0;
  293. }
  294. &.hide {
  295. right: -44px;
  296. }
  297. }
  298. }
  299. }
  300. }
  301. </style>