feat: add APIs for plugin-outline-pane which will be splitted in near future

This commit is contained in:
liujuping 2022-10-27 19:53:21 +08:00 committed by LeoYuan 袁力皓
parent e1153c9aae
commit 66f6918a69
14 changed files with 127 additions and 15 deletions

View File

@ -7,6 +7,10 @@ const DETECTING_CHANGE_EVENT = 'detectingChange';
export class Detecting {
@obx.ref private _enable = true;
/**
* hover
* TODO: 将该逻辑从设计器中抽离出来
*/
get enable() {
return this._enable;
}

View File

@ -8,3 +8,4 @@ export * from './location';
export * from './offset-observer';
export * from './scroller';
export * from './setting';
export * from './active-tracker';

View File

@ -5,11 +5,18 @@ import {
TransformStage,
LiveEditing,
isDragNodeDataObject,
isDragNodeObject,
isDragAnyObject,
DragObjectType,
isNode,
isShaken,
contains,
LocationDetailType,
isLocationChildrenDetail,
ScrollTarget,
} from '@alilc/lowcode-designer';
import { Editor } from '@alilc/lowcode-editor-core';
import { Dragon } from '@alilc/lowcode-shell';
import { designerCabinSymbol, Dragon } from '@alilc/lowcode-shell';
export default function getDesignerCabin(editor: Editor) {
const designer = editor.get('designer') as Designer;
@ -23,5 +30,21 @@ export default function getDesignerCabin(editor: Editor) {
DragObjectType,
isDragNodeDataObject,
isNode,
[designerCabinSymbol]: {
isDragNodeObject,
isDragAnyObject,
isShaken,
contains,
LocationDetailType,
isLocationChildrenDetail,
ScrollTarget,
isSettingField,
TransformStage,
SettingField,
LiveEditing,
DragObjectType,
isDragNodeDataObject,
isNode,
},
};
}

View File

@ -8,6 +8,7 @@ import {
editorSymbol,
settingPropEntrySymbol,
settingTopEntrySymbol,
designerCabinSymbol,
} from '@alilc/lowcode-shell';
export default {
@ -20,4 +21,5 @@ export default {
designerSymbol,
settingPropEntrySymbol,
settingTopEntrySymbol,
designerCabinSymbol,
};

View File

@ -1,6 +1,6 @@
import { isFormEvent, compatibleLegaoSchema, getNodeSchemaById } from '@alilc/lowcode-utils';
import { isNodeSchema } from '@alilc/lowcode-types';
import { getConvertedExtraKey, getOriginalExtraKey } from '@alilc/lowcode-designer';
import { getConvertedExtraKey, getOriginalExtraKey, isNode, isSettingField } from '@alilc/lowcode-designer';
const utils = {
isNodeSchema,

View File

@ -1,6 +1,6 @@
import { Component, MouseEvent as ReactMouseEvent } from 'react';
import { observer, Editor, globalContext } from '@alilc/lowcode-editor-core';
import { isRootNode, Node, DragObjectType, isShaken } from '@alilc/lowcode-designer';
import { Node, DragObjectType, isShaken } from '@alilc/lowcode-designer';
import { isFormEvent, canClickNode } from '@alilc/lowcode-utils';
import { Tree } from '../tree';
import RootTreeNodeView from './root-tree-node';

View File

@ -1,3 +1,4 @@
import Node from './node';
import {
Detecting as InnerDetecting,
DocumentModel as InnerDocumentModel,
@ -13,6 +14,13 @@ export default class Detecting {
this[detectingSymbol] = document.designer.detecting;
}
/**
* hover
*/
get current() {
return Node.create(this[detectingSymbol].current);
}
/**
* hover
* @param id id

View File

@ -2,15 +2,15 @@ import { Editor } from '@alilc/lowcode-editor-core';
import {
DocumentModel as InnerDocumentModel,
Node as InnerNode,
ParentalNode,
IOnChangeOptions as InnerIOnChangeOptions,
PropChangeOptions as InnerPropChangeOptions,
DragObject as InnerDragObject,
DragNodeObject,
DragNodeDataObject,
isDragNodeObject,
} from '@alilc/lowcode-designer';
import {
TransformStage,
RootSchema,
NodeSchema,
NodeData,
GlobalEvent,
} from '@alilc/lowcode-types';
import Node from './node';
@ -40,6 +40,8 @@ const Events = {
IMPORT_SCHEMA: 'shell.document.importSchema',
};
const shellDocSymbol = Symbol('shellDocSymbol');
export default class DocumentModel {
private readonly [documentSymbol]: InnerDocumentModel;
private readonly [editorSymbol]: Editor;
@ -61,8 +63,13 @@ export default class DocumentModel {
}
static create(document: InnerDocumentModel | undefined | null) {
if (document == undefined) return null;
return new DocumentModel(document);
if (!document) return null;
// @ts-ignore 直接返回已挂载的 shell doc 实例
if (document[shellDocSymbol]) return document[shellDocSymbol];
const shellDoc = new DocumentModel(document);
// @ts-ignore 直接返回已挂载的 shell doc 实例
document[shellDocSymbol] = shellDoc;
return shellDoc;
}
/**
@ -200,6 +207,23 @@ export default class DocumentModel {
return this[documentSymbol].getComponentsMap(extraComps);
}
/**
*
* @param dropTarget
* @param dragObject
* @returns boolean
*/
checkNesting(dropTarget: Node, dragObject: DragNodeObject | DragNodeDataObject): boolean {
let innerDragObject: InnerDragObject = dragObject;
if (isDragNodeObject(dragObject)) {
innerDragObject.nodes = innerDragObject.nodes.map((node: Node) => (node[nodeSymbol] || node));
}
return this[documentSymbol].checkNesting(
(dropTarget[nodeSymbol] || dropTarget) as any,
innerDragObject as any,
);
}
/**
* document
*/

View File

@ -128,6 +128,13 @@ export default class Node {
return true;
}
/**
*
*/
get isLocked() {
return this[nodeSymbol].isLocked;
}
/**
*
*/
@ -314,6 +321,14 @@ export default class Node {
return this[nodeSymbol].isConditionalVisible();
}
/**
*
* @param flag
*/
lock(flag?: boolean) {
this[nodeSymbol].lock(flag);
}
/**
* @deprecated use .props instead
*/
@ -347,10 +362,11 @@ export default class Node {
* path
* props props
* @param path a / a.b / a.0
* @param createIfNone
* @returns
*/
getExtraProp(path: string): Prop | null {
return Prop.create(this[nodeSymbol].getProp(getConvertedExtraKey(path)));
getExtraProp(path: string, createIfNone?: boolean): Prop | null {
return Prop.create(this[nodeSymbol].getExtraProp(path, createIfNone));
}
/**
@ -460,4 +476,8 @@ export default class Node {
remove() {
this[nodeSymbol].remove();
}
internalToShellNode() {
return this;
}
}

View File

@ -4,18 +4,20 @@ import {
PropsReducer as PropsTransducer,
TransformStage,
} from '@alilc/lowcode-designer';
import { RootSchema, ProjectSchema } from '@alilc/lowcode-types';
import { RootSchema, ProjectSchema, IEditor } from '@alilc/lowcode-types';
import DocumentModel from './document-model';
import SimulatorHost from './simulator-host';
import { projectSymbol, simulatorHostSymbol, simulatorRendererSymbol, documentSymbol } from './symbols';
import { editorSymbol, projectSymbol, simulatorHostSymbol, simulatorRendererSymbol, documentSymbol } from './symbols';
export default class Project {
private readonly [projectSymbol]: InnerProject;
private readonly [editorSymbol]: IEditor;
private [simulatorHostSymbol]: BuiltinSimulatorHost;
private [simulatorRendererSymbol]: any;
constructor(project: InnerProject) {
this[projectSymbol] = project;
this[editorSymbol] = project?.designer.editor;
}
static create(project: InnerProject) {
@ -132,6 +134,15 @@ export default class Project {
this[projectSymbol].designer.addPropsReducer(transducer, stage);
}
/**
*
* @param fn
* @returns
*/
onRemoveDocument(fn: (data: { id: string}) => void) {
return this[editorSymbol].on('designer.document.remove', (data: { id: string }) => fn(data));
}
/**
* project document
*/

View File

@ -71,6 +71,13 @@ export default class Prop {
return this[propSymbol].getValue();
}
/**
*
*/
remove() {
this[propSymbol].remove();
}
/**
*
* @param stage

View File

@ -84,4 +84,15 @@ export default class Selection {
getNodes(): Node[] {
return this[selectionSymbol].getNodes().map((node: InnerNode) => Node.create(node));
}
/**
*
* for example:
* getNodes() returns [A, subA, B], then
* getTopNodes() will return [A, B], subA will be removed
* @returns
*/
getTopNodes(): Node[] {
return this[selectionSymbol].getTopNodes().map((node: InnerNode) => Node.create(node));
}
}

View File

@ -23,4 +23,5 @@ export const dropLocationSymbol = Symbol('dropLocation');
export const simulatorHostSymbol = Symbol('simulatorHost');
export const simulatorRendererSymbol = Symbol('simulatorRenderer');
export const dragObjectSymbol = Symbol('dragObject');
export const locateEventSymbol = Symbol('locateEvent');
export const locateEventSymbol = Symbol('locateEvent');
export const designerCabinSymbol = Symbol('designerCabin');

View File

@ -156,7 +156,7 @@ export interface Utils {
}
export interface PluginProps {
editor: IEditor;
editor?: IEditor;
config: PluginConfig;
[key: string]: any;
}