mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-06-22 09:49:28 +08:00
feat(stage): 支持配置对齐元素
This commit is contained in:
parent
eb43deb9f5
commit
f8125aa149
@ -377,6 +377,7 @@ export default class ActionManager extends EventEmitter {
|
|||||||
targetEls: this.selectedElList,
|
targetEls: this.selectedElList,
|
||||||
targetElIds: this.selectedElList?.map((item) => item.id),
|
targetElIds: this.selectedElList?.map((item) => item.id),
|
||||||
isMulti,
|
isMulti,
|
||||||
|
document: this.getRenderDocument(),
|
||||||
};
|
};
|
||||||
return options(cfg);
|
return options(cfg);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
import EventEmitter from 'events';
|
import EventEmitter from 'events';
|
||||||
|
|
||||||
import { merge } from 'lodash-es';
|
import { merge } from 'lodash-es';
|
||||||
import { MoveableOptions } from 'moveable';
|
import type { ElementGuidelineValueOption, MoveableOptions, MoveableRefType } from 'moveable';
|
||||||
|
|
||||||
import { GuidesType, Mode } from './const';
|
import { GuidesType, Mode } from './const';
|
||||||
import MoveableActionsAble from './MoveableActionsAble';
|
import MoveableActionsAble from './MoveableActionsAble';
|
||||||
@ -88,16 +88,19 @@ export default class MoveableOptionsManager extends EventEmitter {
|
|||||||
/**
|
/**
|
||||||
* 设置有哪些元素要辅助对齐
|
* 设置有哪些元素要辅助对齐
|
||||||
* @param selectedElList 选中的元素列表,需要排除在对齐元素之外
|
* @param selectedElList 选中的元素列表,需要排除在对齐元素之外
|
||||||
* @param allElList 全部元素列表
|
|
||||||
*/
|
*/
|
||||||
protected setElementGuidelines(selectedElList: HTMLElement[], allElList: Element[]): void {
|
protected setElementGuidelines(selectedElList: HTMLElement[]): void {
|
||||||
this.elementGuidelines.forEach((node) => {
|
this.elementGuidelines.forEach((node) => {
|
||||||
node.remove();
|
node.remove();
|
||||||
});
|
});
|
||||||
this.elementGuidelines = [];
|
this.elementGuidelines = [];
|
||||||
|
|
||||||
|
// 设置选中元素的周围元素,用于选中元素跟周围元素对齐辅助
|
||||||
|
const elementGuidelines: Array<ElementGuidelineValueOption | MoveableRefType<Element>> =
|
||||||
|
this.getCustomizeOptions()?.elementGuidelines || Array.from(selectedElList[0]?.parentElement?.children || []);
|
||||||
|
|
||||||
if (this.mode === Mode.ABSOLUTE) {
|
if (this.mode === Mode.ABSOLUTE) {
|
||||||
this.container.append(this.createGuidelineElements(selectedElList, allElList));
|
this.container.append(this.createGuidelineElements(selectedElList, elementGuidelines));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,13 +227,29 @@ export default class MoveableOptionsManager extends EventEmitter {
|
|||||||
* @param allElList 全部元素列表
|
* @param allElList 全部元素列表
|
||||||
* @returns frame 辅助对齐元素集合的页面片
|
* @returns frame 辅助对齐元素集合的页面片
|
||||||
*/
|
*/
|
||||||
private createGuidelineElements(selectedElList: HTMLElement[], allElList: Element[]): DocumentFragment {
|
private createGuidelineElements(
|
||||||
|
selectedElList: HTMLElement[],
|
||||||
|
allElList: Array<ElementGuidelineValueOption | MoveableRefType<Element>>,
|
||||||
|
): DocumentFragment {
|
||||||
const frame = globalThis.document.createDocumentFragment();
|
const frame = globalThis.document.createDocumentFragment();
|
||||||
|
|
||||||
for (const node of allElList) {
|
for (const element of allElList) {
|
||||||
const { width, height } = node.getBoundingClientRect();
|
let node: MoveableRefType<Element> =
|
||||||
if (this.isInElementList(node, selectedElList)) continue;
|
(element as ElementGuidelineValueOption).element || (element as MoveableRefType<Element>);
|
||||||
const { left, top } = getOffset(node);
|
|
||||||
|
if (!node || typeof node === 'string') continue;
|
||||||
|
|
||||||
|
if (typeof node === 'function') {
|
||||||
|
node = node();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isInElementList(node as Element, selectedElList)) continue;
|
||||||
|
|
||||||
|
const { width, height } = (node as Element).getBoundingClientRect();
|
||||||
|
|
||||||
|
if (!width || !height) continue;
|
||||||
|
|
||||||
|
const { left, top } = getOffset(node as Element);
|
||||||
const elementGuideline = globalThis.document.createElement('div');
|
const elementGuideline = globalThis.document.createElement('div');
|
||||||
elementGuideline.style.cssText = `position: absolute;width: ${width}px;height: ${height}px;top: ${top}px;left: ${left}px`;
|
elementGuideline.style.cssText = `position: absolute;width: ${width}px;height: ${height}px;top: ${top}px;left: ${left}px`;
|
||||||
this.elementGuidelines.push(elementGuideline);
|
this.elementGuidelines.push(elementGuideline);
|
||||||
|
@ -131,9 +131,7 @@ export default class StageDragResize extends MoveableOptionsManager {
|
|||||||
this.dragResizeHelper.updateShadowEl(el);
|
this.dragResizeHelper.updateShadowEl(el);
|
||||||
this.dragResizeHelper.setMode(this.mode);
|
this.dragResizeHelper.setMode(this.mode);
|
||||||
|
|
||||||
// 设置选中元素的周围元素,用于选中元素跟周围元素对齐辅助
|
this.setElementGuidelines([this.target as HTMLElement]);
|
||||||
const elementGuidelines: Element[] = Array.from(this.target?.parentElement?.children || []);
|
|
||||||
this.setElementGuidelines([this.target as HTMLElement], elementGuidelines);
|
|
||||||
|
|
||||||
return this.getOptions(false, {
|
return this.getOptions(false, {
|
||||||
target: this.dragResizeHelper.getShadowEl(),
|
target: this.dragResizeHelper.getShadowEl(),
|
||||||
|
@ -79,9 +79,7 @@ export default class StageMultiDragResize extends MoveableOptionsManager {
|
|||||||
|
|
||||||
this.dragResizeHelper.updateGroup(els);
|
this.dragResizeHelper.updateGroup(els);
|
||||||
|
|
||||||
// 设置周围元素,用于选中元素跟周围元素的对齐辅助
|
this.setElementGuidelines(this.targetList);
|
||||||
const elementGuidelines: Element[] = Array.from(this.targetList[0].parentElement?.children || []);
|
|
||||||
this.setElementGuidelines(this.targetList, elementGuidelines);
|
|
||||||
|
|
||||||
this.moveableForMulti?.destroy();
|
this.moveableForMulti?.destroy();
|
||||||
this.dragResizeHelper.clear();
|
this.dragResizeHelper.clear();
|
||||||
|
@ -101,6 +101,7 @@ export interface CustomizeMoveableOptionsCallbackConfig {
|
|||||||
targetEls?: HTMLElement[];
|
targetEls?: HTMLElement[];
|
||||||
targetElIds?: string[];
|
targetElIds?: string[];
|
||||||
isMulti: boolean;
|
isMulti: boolean;
|
||||||
|
document?: Document;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface StageRenderConfig {
|
export interface StageRenderConfig {
|
||||||
|
@ -52,7 +52,7 @@ import { TMagicDialog, tMagicMessage, tMagicMessageBox } from '@tmagic/design';
|
|||||||
import { DatasourceTypeOption, editorService, MenuBarData, MoveableOptions, TMagicEditor } from '@tmagic/editor';
|
import { DatasourceTypeOption, editorService, MenuBarData, MoveableOptions, TMagicEditor } from '@tmagic/editor';
|
||||||
import type { MContainer, MNode } from '@tmagic/schema';
|
import type { MContainer, MNode } from '@tmagic/schema';
|
||||||
import { NodeType } from '@tmagic/schema';
|
import { NodeType } from '@tmagic/schema';
|
||||||
import { CustomizeMoveableOptionsCallbackConfig } from '@tmagic/stage';
|
import type { CustomizeMoveableOptionsCallbackConfig } from '@tmagic/stage';
|
||||||
import { asyncLoadJs } from '@tmagic/utils';
|
import { asyncLoadJs } from '@tmagic/utils';
|
||||||
|
|
||||||
import DeviceGroup from '../components/DeviceGroup.vue';
|
import DeviceGroup from '../components/DeviceGroup.vue';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user