瀏覽代碼

fix: 修改图层树

jiaxing.liao 1 月之前
父節點
當前提交
c944bccf87
共有 2 個文件被更改,包括 68 次插入3 次删除
  1. 14 3
      src/renderer/src/store/modules/action.ts
  2. 54 0
      src/renderer/src/views/designer/sidebar/Hierarchy.vue

+ 14 - 3
src/renderer/src/store/modules/action.ts

@@ -2,7 +2,7 @@ import { ref } from 'vue'
 import { defineStore } from 'pinia'
 
 import { bfsWalk } from 'simple-mind-map/src/utils'
-import { moveToPosition } from '@/utils'
+import { moveToPosition, getAddWidgetIndex } from '@/utils'
 import { klona } from 'klona'
 import { v4 } from 'uuid'
 
@@ -407,13 +407,24 @@ export const useActionStore = defineStore('action', () => {
       ? target?.children || projectStore.activePage?.children || []
       : projectStore.activePage?.children || []
     const newArr: BaseWidget[] = []
+
     clipboard.value.forEach((obj) => {
       obj.props.x += 10
       obj.props.y += 10
+      const index = getAddWidgetIndex(projectStore.activePage as Page, obj.type)
       const newWidget = klona({
         ...obj,
-        id: v4(),
-        events: []
+        // 最后一个_加索引
+        name: `${obj.name.split('_')[0]}_${index}`,
+        id: v4()
+      })
+      // 修改子节点ID
+      bfsWalk(newWidget, (child) => {
+        if (child?.id) {
+          const index = getAddWidgetIndex(projectStore.activePage as Page, child.type)
+          child.name = `${child.name.split('_')[0]}_${index}`
+          child.id = v4()
+        }
       })
       list.push(newWidget)
       newArr.push(newWidget)

+ 54 - 0
src/renderer/src/views/designer/sidebar/Hierarchy.vue

@@ -258,6 +258,11 @@ const hasLockedWidgetTree = (node: HierarchyNodeData): boolean => {
 
 const allowDrag: AllowDragFunction = (node) => {
   const currentNode = getHierarchyNode(node.data)
+
+  if (currentNode.nodeType === 'page') {
+    return true
+  }
+
   return (
     currentNode.nodeType === 'widget' &&
     !hasLockedWidgetTree(currentNode) &&
@@ -270,6 +275,15 @@ const allowDrop: AllowDropFunction = (dragNode, dropNode, type) => {
   const dragData = getHierarchyNode(dragNode.data)
   const dropData = getHierarchyNode(dropNode.data)
 
+  if (dragData.nodeType === 'page') {
+    return (
+      dropData.nodeType === 'page' &&
+      dragData.screenId === dropData.screenId &&
+      dragData.id !== dropData.id &&
+      type !== 'inner'
+    )
+  }
+
   if (dragData.nodeType !== 'widget' || dropData.nodeType === 'screen') return false
   if (hasLockedWidgetTree(dragData)) return false
   if (!dragData.pageId || !dropData.pageId || dragData.pageId !== dropData.pageId) return false
@@ -294,6 +308,41 @@ const findPageById = (pageId?: string) => {
     .find((page) => page.id === pageId)
 }
 
+const findScreenById = (screenId?: string) => {
+  if (!screenId) return
+
+  return projectStore.project?.screens.find((screen) => screen.id === screenId)
+}
+
+const reorderPage = (
+  dragData: HierarchyNodeData,
+  targetData: HierarchyNodeData,
+  dropType: NodeDropType
+) => {
+  if (dropType === 'inner' || dragData.screenId !== targetData.screenId) return
+
+  const screen = findScreenById(dragData.screenId)
+  if (!screen) return
+
+  const fromIndex = screen.pages.findIndex((page) => page.id === dragData.id)
+  const targetIndex = screen.pages.findIndex((page) => page.id === targetData.id)
+  if (fromIndex === -1 || targetIndex === -1 || fromIndex === targetIndex) return
+
+  const [page] = screen.pages.splice(fromIndex, 1)
+  const nextTargetIndex = screen.pages.findIndex((item) => item.id === targetData.id)
+  if (nextTargetIndex === -1) return
+
+  screen.pages.splice(dropType === 'before' ? nextTargetIndex : nextTargetIndex + 1, 0, page)
+
+  const screenIndex =
+    projectStore.project?.screens.findIndex((item) => item.id === screen.id) ?? -1
+  const openedPageId = projectStore.openPageIds[screenIndex]
+  setOpenedPage(
+    screen.id,
+    screen.pages.some((item) => item.id === openedPageId) ? openedPageId : page.id
+  )
+}
+
 const findWidgetListById = (widgets: BaseWidget[], widgetId: string) => {
   for (const widget of widgets) {
     if (widget.id === widgetId) {
@@ -329,6 +378,11 @@ const handleNodeDrop = (dragNode: TreeDragNode, dropNode: TreeDragNode, dropType
 
   if (dropType === 'none') return
 
+  if (dragData.nodeType === 'page') {
+    reorderPage(dragData, targetData, dropType)
+    return
+  }
+
   if (dragData.nodeType !== 'widget' || !dragData.pageId || dragData.pageId !== targetData.pageId) {
     return
   }