index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <div class="dnd-flow" >
  3. <VueFlow ref="vueFlowRef" :nodes="nodes" :edges="edges" @drop="onDrop" @contextmenu.prevent="onContextMenu"
  4. @keydown.delete="onDeleteKey" @dragover="onDragOver" @dragleave="onDragLeave" @node-click="onNodeClick">
  5. <!-- <template #node-default="props"> -->
  6. <template #node-default="props">
  7. <modelb :node="props" />
  8. <!-- <modelb :node="props" /> -->
  9. </template>
  10. <!-- //<Handle type="target" :position="Position.Left" /> -->
  11. <!-- <Panel>
  12. <DropzoneBackground
  13. :style="{
  14. backgroundColor: isDragOver ? '#e7f3ff' : 'transparent',
  15. transition: 'background-color 0.2s ease',
  16. }"
  17. >
  18. </DropzoneBackground>
  19. </Panel> -->
  20. </VueFlow>
  21. <!-- <Sidebar /> -->
  22. <!-- 优化器 -->
  23. <div id="contextMenu" v-show="shopShow" @click="deleteItemConfirm">删除</div>
  24. </div>
  25. </template>
  26. <script setup>
  27. import { ref } from 'vue'
  28. import { VueFlow, useVueFlow,Position } from '@vue-flow/core'
  29. import "./main.css";//重置样式
  30. import DropzoneBackground from './DropzoneBackground.vue'
  31. import useDragAndDrop from './useDnD'
  32. import f11 from '@/assets/img/f11.png'
  33. import modelb from './modelb.vue'
  34. import { useDialogState } from './delete.js'
  35. const { isVisible, message, resolve } = useDialogState()
  36. const { onConnect, addEdges, onNodesChange, onEdgesChange, applyNodeChanges, applyEdgeChanges } = useVueFlow()
  37. let vueFlowRef=ref();
  38. let emit = defineEmits(['optimizerfalse']);
  39. const props = defineProps({})
  40. let shopShow=ref(false);
  41. let noid=ref([]);
  42. let node=ref();
  43. let contextMenu=ref( {
  44. shopShow: false,
  45. position: { x: 0, y: 0 },
  46. target: 'kong',
  47. })
  48. const { onDragOver, onDrop, onDragLeave, isDragOver} = useDragAndDrop();
  49. const edges = ref([]);
  50. const nodes = ref([]);
  51. onConnect(addEdges)
  52. function onNodeClick(e){
  53. noid.value=e.node;
  54. console.log(e);
  55. console.log(111111)
  56. if(e.node.data.label=='优化器'||e.node.data.label=='进化优化器'){
  57. console.log(e.node);
  58. emit('optimizerfalse', true);
  59. }
  60. }
  61. function onContextMenu(event,node) {
  62. console.log(event)
  63. console.log(node)
  64. // event.preventDefault();
  65. if(noid.value!==null){
  66. if (noid.value.id) {
  67. document.getElementById('contextMenu').style.top = noid.value.position.y+50 + 'px';
  68. document.getElementById('contextMenu').style.left = noid.value.position.x +80+ 'px';
  69. document.getElementById('contextMenu').style.display = 'block';
  70. shopShow.value=true;
  71. event.preventDefault();
  72. }
  73. }
  74. }
  75. //点击左键右键内容消失
  76. document.addEventListener('click', function(e) {
  77. if (e.button === 0) { // 0 是左键
  78. //document.getElementById('contextMenu').style.display = 'none';
  79. shopShow.value=false;
  80. }
  81. });
  82. function onDeleteKey(event,node) {
  83. // 禁用Backspace删除节点
  84. console.log(event)
  85. event.preventDefault();
  86. }
  87. //删除
  88. const deleteItemConfirm=()=>{
  89. //const index = nodes.value.findIndex(n => n.id === noid.value.id);
  90. if(noid.value.id){
  91. vueFlowRef.value.removeNodes(noid.value.id);
  92. noid.value=null;
  93. // nodes.value = nodes.value.filter(node => node.id !== noid.value.id);
  94. //console.log(noid.value.id);
  95. // resolve(true)
  96. // console.log( resolve(true));
  97. shopShow.value = false
  98. }
  99. }
  100. onNodesChange(async (changes) => {
  101. const nextChanges = []
  102. for (const change of changes) {
  103. if (change.type === 'remove') {
  104. const isConfirmed = noid.value.id
  105. console.log(isConfirmed)
  106. if (isConfirmed) {
  107. nextChanges.push(change)
  108. }
  109. } else {
  110. nextChanges.push(change)
  111. }
  112. }
  113. applyNodeChanges(nextChanges)
  114. })
  115. </script>
  116. <style>
  117. .vue-flow__edge {
  118. text-align: left; /* 设置edges的左对齐 */
  119. }
  120. #contextMenu{
  121. /* display: none; */
  122. position: absolute;
  123. background-color: #fff;
  124. border-radius: 5px;
  125. padding: 10px;
  126. text-align: center;
  127. color: black;
  128. font-size: 14px;
  129. font-weight: 400;
  130. cursor: pointer;
  131. }
  132. </style>