mirror of
				https://github.com/Tencent/tmagic-editor.git
				synced 2025-11-04 10:49:51 +08:00 
			
		
		
		
	fix: 当前选中组件处于流式布局模式下时,直接拖动其他组件会错误判断成是流式组件
This commit is contained in:
		
							parent
							
								
									d334b697ae
								
							
						
					
					
						commit
						89f863d873
					
				@ -160,7 +160,7 @@ StageDragResize实例
 | 
				
			|||||||
  销毁实例
 | 
					  销毁实例
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### setElementFromPoint
 | 
					### getElementFromPoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **参数:**
 | 
					- **参数:**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -41,8 +41,7 @@ import { computed, defineComponent, inject, ref } from 'vue';
 | 
				
			|||||||
import serialize from 'serialize-javascript';
 | 
					import serialize from 'serialize-javascript';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import type StageCore from '@tmagic/stage';
 | 
					import type StageCore from '@tmagic/stage';
 | 
				
			||||||
import { GHOST_EL_ID_PREFIX } from '@tmagic/stage';
 | 
					import { removeClassNameByClassName } from '@tmagic/utils';
 | 
				
			||||||
import { addClassName, removeClassNameByClassName } from '@tmagic/utils';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import MIcon from '@editor/components/Icon.vue';
 | 
					import MIcon from '@editor/components/Icon.vue';
 | 
				
			||||||
import type { ComponentGroup, ComponentItem, Services, StageOptions } from '@editor/type';
 | 
					import type { ComponentGroup, ComponentItem, Services, StageOptions } from '@editor/type';
 | 
				
			||||||
@ -125,19 +124,9 @@ export default defineComponent({
 | 
				
			|||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (timeout) return;
 | 
					        if (timeout || !stage.value) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        timeout = globalThis.setTimeout(async () => {
 | 
					        timeout = stage.value.getAddContainerHighlightClassNameTimeout(e);
 | 
				
			||||||
          if (!stageOptions || !stage.value) return;
 | 
					 | 
				
			||||||
          const doc = stage.value.renderer.contentWindow?.document;
 | 
					 | 
				
			||||||
          const els = stage.value.getElementsFromPoint(e);
 | 
					 | 
				
			||||||
          for (const el of els) {
 | 
					 | 
				
			||||||
            if (doc && !el.id.startsWith(GHOST_EL_ID_PREFIX) && (await stageOptions.isContainer(el))) {
 | 
					 | 
				
			||||||
              addClassName(el, doc, stageOptions?.containerHighlightClassName);
 | 
					 | 
				
			||||||
              break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }, stageOptions?.containerHighlightDuration);
 | 
					 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@
 | 
				
			|||||||
import { EventEmitter } from 'events';
 | 
					import { EventEmitter } from 'events';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import type { Id } from '@tmagic/schema';
 | 
					import type { Id } from '@tmagic/schema';
 | 
				
			||||||
 | 
					import { addClassName } from '@tmagic/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { DEFAULT_ZOOM, GHOST_EL_ID_PREFIX, PAGE_CLASS } from './const';
 | 
					import { DEFAULT_ZOOM, GHOST_EL_ID_PREFIX, PAGE_CLASS } from './const';
 | 
				
			||||||
import StageDragResize from './StageDragResize';
 | 
					import StageDragResize from './StageDragResize';
 | 
				
			||||||
@ -86,7 +87,7 @@ export default class StageCore extends EventEmitter {
 | 
				
			|||||||
    this.mask
 | 
					    this.mask
 | 
				
			||||||
      .on('beforeSelect', async (event: MouseEvent) => {
 | 
					      .on('beforeSelect', async (event: MouseEvent) => {
 | 
				
			||||||
        this.clearSelectStatus('multiSelect');
 | 
					        this.clearSelectStatus('multiSelect');
 | 
				
			||||||
        const el = await this.setElementFromPoint(event);
 | 
					        const el = await this.getElementFromPoint(event);
 | 
				
			||||||
        if (!el) return;
 | 
					        if (!el) return;
 | 
				
			||||||
        this.select(el, event);
 | 
					        this.select(el, event);
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
@ -98,7 +99,7 @@ export default class StageCore extends EventEmitter {
 | 
				
			|||||||
        this.emit('changeGuides', data);
 | 
					        this.emit('changeGuides', data);
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      .on('highlight', async (event: MouseEvent) => {
 | 
					      .on('highlight', async (event: MouseEvent) => {
 | 
				
			||||||
        const el = await this.setElementFromPoint(event, 'mousemove');
 | 
					        const el = await this.getElementFromPoint(event, 'mousemove');
 | 
				
			||||||
        if (!el) return;
 | 
					        if (!el) return;
 | 
				
			||||||
        await this.highlight(el);
 | 
					        await this.highlight(el);
 | 
				
			||||||
        if (this.highlightedDom === this.selectedDom) {
 | 
					        if (this.highlightedDom === this.selectedDom) {
 | 
				
			||||||
@ -111,7 +112,7 @@ export default class StageCore extends EventEmitter {
 | 
				
			|||||||
        this.highlightLayer.clearHighlight();
 | 
					        this.highlightLayer.clearHighlight();
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      .on('beforeMultiSelect', async (event: MouseEvent) => {
 | 
					      .on('beforeMultiSelect', async (event: MouseEvent) => {
 | 
				
			||||||
        const el = await this.setElementFromPoint(event);
 | 
					        const el = await this.getElementFromPoint(event);
 | 
				
			||||||
        if (!el) return;
 | 
					        if (!el) return;
 | 
				
			||||||
        // 多选不可以选中magic-ui-page
 | 
					        // 多选不可以选中magic-ui-page
 | 
				
			||||||
        if (el.className.includes(PAGE_CLASS)) return;
 | 
					        if (el.className.includes(PAGE_CLASS)) return;
 | 
				
			||||||
@ -165,7 +166,7 @@ export default class StageCore extends EventEmitter {
 | 
				
			|||||||
    return doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];
 | 
					    return doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async setElementFromPoint(event: MouseEvent, type?: String) {
 | 
					  public async getElementFromPoint(event: MouseEvent, type?: String) {
 | 
				
			||||||
    const els = this.getElementsFromPoint(event);
 | 
					    const els = this.getElementsFromPoint(event);
 | 
				
			||||||
    let stopped = false;
 | 
					    let stopped = false;
 | 
				
			||||||
    const stop = () => (stopped = true);
 | 
					    const stop = () => (stopped = true);
 | 
				
			||||||
@ -306,6 +307,27 @@ export default class StageCore extends EventEmitter {
 | 
				
			|||||||
    this.dr.clearGuides();
 | 
					    this.dr.clearGuides();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async addContainerHighlightClassName(event: MouseEvent, exclude: Element[]) {
 | 
				
			||||||
 | 
					    const els = this.getElementsFromPoint(event);
 | 
				
			||||||
 | 
					    const { renderer } = this;
 | 
				
			||||||
 | 
					    const doc = renderer.contentWindow?.document;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!doc) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const el of els) {
 | 
				
			||||||
 | 
					      if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.isContainer(el)) && !exclude.includes(el)) {
 | 
				
			||||||
 | 
					        addClassName(el, doc, this.containerHighlightClassName);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public getAddContainerHighlightClassNameTimeout(event: MouseEvent, exclude: Element[] = []) {
 | 
				
			||||||
 | 
					    return globalThis.setTimeout(() => {
 | 
				
			||||||
 | 
					      this.addContainerHighlightClassName(event, exclude);
 | 
				
			||||||
 | 
					    }, this.containerHighlightDuration);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * 销毁实例
 | 
					   * 销毁实例
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ import type { MoveableOptions } from 'moveable';
 | 
				
			|||||||
import Moveable from 'moveable';
 | 
					import Moveable from 'moveable';
 | 
				
			||||||
import MoveableHelper from 'moveable-helper';
 | 
					import MoveableHelper from 'moveable-helper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { addClassName, removeClassNameByClassName } from '@tmagic/utils';
 | 
					import { removeClassNameByClassName } from '@tmagic/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode, ZIndex } from './const';
 | 
					import { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode, ZIndex } from './const';
 | 
				
			||||||
import StageCore from './StageCore';
 | 
					import StageCore from './StageCore';
 | 
				
			||||||
@ -299,6 +299,7 @@ export default class StageDragResize extends EventEmitter {
 | 
				
			|||||||
        if (this.mode === Mode.SORTABLE) {
 | 
					        if (this.mode === Mode.SORTABLE) {
 | 
				
			||||||
          this.ghostEl = this.generateGhostEl(this.target);
 | 
					          this.ghostEl = this.generateGhostEl(this.target);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        frame.top = this.target.offsetTop;
 | 
					        frame.top = this.target.offsetTop;
 | 
				
			||||||
        frame.left = this.target.offsetLeft;
 | 
					        frame.left = this.target.offsetLeft;
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
@ -310,20 +311,7 @@ export default class StageDragResize extends EventEmitter {
 | 
				
			|||||||
          timeout = undefined;
 | 
					          timeout = undefined;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        timeout = globalThis.setTimeout(async () => {
 | 
					        timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]);
 | 
				
			||||||
          const els = this.core.getElementsFromPoint(e.inputEvent);
 | 
					 | 
				
			||||||
          for (const el of els) {
 | 
					 | 
				
			||||||
            if (
 | 
					 | 
				
			||||||
              doc &&
 | 
					 | 
				
			||||||
              !el.id.startsWith(GHOST_EL_ID_PREFIX) &&
 | 
					 | 
				
			||||||
              el !== this.target &&
 | 
					 | 
				
			||||||
              (await this.core.isContainer(el))
 | 
					 | 
				
			||||||
            ) {
 | 
					 | 
				
			||||||
              addClassName(el, doc, this.core.containerHighlightClassName);
 | 
					 | 
				
			||||||
              break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }, this.core.containerHighlightDuration);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.dragStatus = ActionStatus.ING;
 | 
					        this.dragStatus = ActionStatus.ING;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -483,6 +471,7 @@ export default class StageDragResize extends EventEmitter {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const ghostEl = el.cloneNode(true) as HTMLElement;
 | 
					    const ghostEl = el.cloneNode(true) as HTMLElement;
 | 
				
			||||||
 | 
					    this.setGhostElChildrenId(ghostEl);
 | 
				
			||||||
    const { top, left } = getAbsolutePosition(el, getOffset(el));
 | 
					    const { top, left } = getAbsolutePosition(el, getOffset(el));
 | 
				
			||||||
    ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;
 | 
					    ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;
 | 
				
			||||||
    ghostEl.style.zIndex = ZIndex.GHOST_EL;
 | 
					    ghostEl.style.zIndex = ZIndex.GHOST_EL;
 | 
				
			||||||
@ -494,6 +483,18 @@ export default class StageDragResize extends EventEmitter {
 | 
				
			|||||||
    return ghostEl;
 | 
					    return ghostEl;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private setGhostElChildrenId(el: Element) {
 | 
				
			||||||
 | 
					    for (const child of el.children) {
 | 
				
			||||||
 | 
					      if (child.id) {
 | 
				
			||||||
 | 
					        child.id = `${GHOST_EL_ID_PREFIX}${child.id}`;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (child.children.length) {
 | 
				
			||||||
 | 
					        this.setGhostElChildrenId(child);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private destroyGhostEl(): void {
 | 
					  private destroyGhostEl(): void {
 | 
				
			||||||
    this.ghostEl?.remove();
 | 
					    this.ghostEl?.remove();
 | 
				
			||||||
    this.ghostEl = undefined;
 | 
					    this.ghostEl = undefined;
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@
 | 
				
			|||||||
import { MoveableOptions } from 'moveable';
 | 
					import { MoveableOptions } from 'moveable';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Core from '@tmagic/core';
 | 
					import Core from '@tmagic/core';
 | 
				
			||||||
import type { Id, MApp, MNode } from '@tmagic/schema';
 | 
					import type { Id, MApp, MContainer, MNode } from '@tmagic/schema';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { GuidesType } from './const';
 | 
					import { GuidesType } from './const';
 | 
				
			||||||
import StageCore from './StageCore';
 | 
					import StageCore from './StageCore';
 | 
				
			||||||
@ -99,6 +99,7 @@ export interface SortEventData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export interface UpdateData {
 | 
					export interface UpdateData {
 | 
				
			||||||
  config: MNode;
 | 
					  config: MNode;
 | 
				
			||||||
 | 
					  parent?: MContainer;
 | 
				
			||||||
  root: MApp;
 | 
					  root: MApp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user