mirror of
https://github.com/projectstorm/react-diagrams.git
synced 2025-08-17 18:53:37 +08:00
serialization is almost working again
This commit is contained in:
@ -30,9 +30,10 @@ class NodeDelayedPosition extends React.Component<any, any> {
|
|||||||
let str = JSON.stringify(model.serialize());
|
let str = JSON.stringify(model.serialize());
|
||||||
let model2 = new DiagramModel();
|
let model2 = new DiagramModel();
|
||||||
let obj: ReturnType<DiagramModel['serialize']> = JSON.parse(str);
|
let obj: ReturnType<DiagramModel['serialize']> = JSON.parse(str);
|
||||||
let node: ReturnType<NodeModel['serialize']> = _.values(obj.layers[0].models)[0] as any;
|
let node: ReturnType<NodeModel['serialize']> = _.values(obj.layers[1].models)[0] as any;
|
||||||
node.x += 30;
|
node.x += 30;
|
||||||
node.y += 30;
|
node.y += 30;
|
||||||
|
|
||||||
model2.deserializeModel(obj, engine);
|
model2.deserializeModel(obj, engine);
|
||||||
engine.setModel(model2);
|
engine.setModel(model2);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,6 @@ export default () => {
|
|||||||
//!------------- SERIALIZING ------------------
|
//!------------- SERIALIZING ------------------
|
||||||
|
|
||||||
var str = JSON.stringify(model.serialize());
|
var str = JSON.stringify(model.serialize());
|
||||||
console.log(model.serialize());
|
|
||||||
|
|
||||||
//!------------- DESERIALIZING ----------------
|
//!------------- DESERIALIZING ----------------
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ import { ActionEventBus } from './core-actions/ActionEventBus';
|
|||||||
import { ZoomCanvasAction } from './actions/ZoomCanvasAction';
|
import { ZoomCanvasAction } from './actions/ZoomCanvasAction';
|
||||||
import { DeleteItemsAction } from './actions/DeleteItemsAction';
|
import { DeleteItemsAction } from './actions/DeleteItemsAction';
|
||||||
import { StateMachine } from './core-state/StateMachine';
|
import { StateMachine } from './core-state/StateMachine';
|
||||||
import { ActionEvent } from './core-actions/Action';
|
|
||||||
|
|
||||||
export interface CanvasEngineListener extends BaseListener {
|
export interface CanvasEngineListener extends BaseListener {
|
||||||
canvasReady?(): void;
|
canvasReady?(): void;
|
||||||
@ -86,6 +85,11 @@ export class CanvasEngine<
|
|||||||
|
|
||||||
setModel(model: M) {
|
setModel(model: M) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
|
if (this.canvas) {
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
this.repaintCanvas();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getModel(): M {
|
getModel(): M {
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
import { BaseModel } from '../core-models/BaseModel';
|
||||||
|
|
||||||
export interface PeformanceWidgetProps {
|
export interface PeformanceWidgetProps {
|
||||||
children: () => JSX.Element;
|
children: () => JSX.Element;
|
||||||
serialized: object;
|
serialized: object;
|
||||||
|
model: BaseModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PeformanceWidgetState {}
|
export interface PeformanceWidgetState {}
|
||||||
@ -14,6 +16,12 @@ export class PeformanceWidget extends React.Component<PeformanceWidgetProps, Pef
|
|||||||
nextState: Readonly<PeformanceWidgetState>,
|
nextState: Readonly<PeformanceWidgetState>,
|
||||||
nextContext: any
|
nextContext: any
|
||||||
): boolean {
|
): boolean {
|
||||||
|
// deserialization event
|
||||||
|
if (this.props.model !== nextProps.model) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// change event
|
||||||
return !_.isEqual(this.props.serialized, nextProps.serialized);
|
return !_.isEqual(this.props.serialized, nextProps.serialized);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@ import * as React from 'react';
|
|||||||
import { DiagramEngine } from '../../DiagramEngine';
|
import { DiagramEngine } from '../../DiagramEngine';
|
||||||
import { LinkModel } from './LinkModel';
|
import { LinkModel } from './LinkModel';
|
||||||
import { PointModel } from './PointModel';
|
import { PointModel } from './PointModel';
|
||||||
import { PortModel } from '../port/PortModel';
|
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import { LabelWidget } from '../label/LabelWidget';
|
import { LabelWidget } from '../label/LabelWidget';
|
||||||
import { BaseEntityEvent, BasePositionModel, ListenerHandle, PeformanceWidget } from '@projectstorm/react-canvas-core';
|
import { BaseEntityEvent, BasePositionModel, ListenerHandle, PeformanceWidget } from '@projectstorm/react-canvas-core';
|
||||||
|
import { PortModel } from '../port/PortModel';
|
||||||
|
|
||||||
export interface LinkProps {
|
export interface LinkProps {
|
||||||
link: LinkModel;
|
link: LinkModel;
|
||||||
@ -13,8 +13,8 @@ export interface LinkProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface LinkState {
|
export interface LinkState {
|
||||||
sourceID: PortModel;
|
sourcePort: PortModel;
|
||||||
targetID: PortModel;
|
targetPort: PortModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
||||||
@ -24,8 +24,8 @@ export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
sourceID: null,
|
sourcePort: null,
|
||||||
targetID: null
|
targetPort: null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,41 +40,36 @@ export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
|||||||
|
|
||||||
static getDerivedStateFromProps(nextProps: LinkProps, prevState: LinkState): LinkState {
|
static getDerivedStateFromProps(nextProps: LinkProps, prevState: LinkState): LinkState {
|
||||||
return {
|
return {
|
||||||
sourceID: nextProps.link.getSourcePort(),
|
sourcePort: nextProps.link.getSourcePort(),
|
||||||
targetID: nextProps.link.getTargetPort()
|
targetPort: nextProps.link.getTargetPort()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
ensureInstalled(installSource: boolean, installTarget: boolean) {
|
installTarget() {
|
||||||
if (installSource) {
|
this.targetListener && this.targetListener.deregister();
|
||||||
this.sourceListener = this.props.link.getSourcePort().registerListener({
|
this.targetListener = this.props.link.getTargetPort().registerListener({
|
||||||
reportInitialPosition: (event: BaseEntityEvent<BasePositionModel>) => {
|
reportInitialPosition: (event: BaseEntityEvent<BasePositionModel>) => {
|
||||||
this.forceUpdate();
|
this.forceUpdate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (installTarget) {
|
|
||||||
this.targetListener = this.props.link.getTargetPort().registerListener({
|
|
||||||
reportInitialPosition: (event: BaseEntityEvent<BasePositionModel>) => {
|
|
||||||
this.forceUpdate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps: Readonly<LinkProps>, prevState: Readonly<LinkState>, snapshot?: any): void {
|
installSource() {
|
||||||
let installSource = false;
|
this.sourceListener && this.sourceListener.deregister();
|
||||||
let installTarget = false;
|
this.sourceListener = this.props.link.getSourcePort().registerListener({
|
||||||
if (this.state.sourceID !== prevState.sourceID) {
|
reportInitialPosition: (event: BaseEntityEvent<BasePositionModel>) => {
|
||||||
this.sourceListener && this.sourceListener.deregister();
|
this.forceUpdate();
|
||||||
installSource = true;
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps: Readonly<LinkProps>, prevState: Readonly<LinkState>, snapshot) {
|
||||||
|
if (prevState.sourcePort !== this.state.sourcePort) {
|
||||||
|
this.installSource();
|
||||||
}
|
}
|
||||||
if (this.state.targetID !== prevState.targetID) {
|
if (prevState.targetPort !== this.state.targetPort) {
|
||||||
this.targetListener && this.targetListener.deregister();
|
this.installTarget();
|
||||||
installTarget = true;
|
|
||||||
}
|
}
|
||||||
this.ensureInstalled(installSource, installTarget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static generateLinePath(firstPoint: PointModel, lastPoint: PointModel): string {
|
public static generateLinePath(firstPoint: PointModel, lastPoint: PointModel): string {
|
||||||
@ -82,7 +77,12 @@ export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount(): void {
|
componentDidMount(): void {
|
||||||
this.ensureInstalled(!!this.props.link.getSourcePort(), !!this.props.link.getTargetPort());
|
if (this.props.link.getSourcePort()) {
|
||||||
|
this.installSource();
|
||||||
|
}
|
||||||
|
if (this.props.link.getTargetPort()) {
|
||||||
|
this.installTarget();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -98,7 +98,7 @@ export class LinkWidget extends React.Component<LinkProps, LinkState> {
|
|||||||
|
|
||||||
//generate links
|
//generate links
|
||||||
return (
|
return (
|
||||||
<PeformanceWidget serialized={this.props.link.serialize()}>
|
<PeformanceWidget model={this.props.link} serialized={this.props.link.serialize()}>
|
||||||
{() => {
|
{() => {
|
||||||
return (
|
return (
|
||||||
<g>
|
<g>
|
||||||
|
@ -41,28 +41,12 @@ export class NodeModel<G extends NodeModelGenerics = NodeModelGenerics> extends
|
|||||||
let old = this.position;
|
let old = this.position;
|
||||||
super.setPosition(x, y);
|
super.setPosition(x, y);
|
||||||
|
|
||||||
// also update the port co-ordinates (for make glorious speed)
|
//also update the port co-ordinates (for make glorious speed)
|
||||||
_.forEach(this.ports, port => {
|
_.forEach(this.ports, port => {
|
||||||
port.setPosition(port.getX() + x - old.x, port.getY() + y - old.y);
|
port.setPosition(port.getX() + x - old.x, port.getY() + y - old.y);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getSelectedEntities() {
|
|
||||||
let entities = super.getSelectedEntities();
|
|
||||||
|
|
||||||
// add the points of each link that are selected here
|
|
||||||
if (this.isSelected()) {
|
|
||||||
_.forEach(this.ports, port => {
|
|
||||||
entities = entities.concat(
|
|
||||||
_.map(port.getLinks(), link => {
|
|
||||||
return link.getPointForPort(port);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return entities;
|
|
||||||
}
|
|
||||||
|
|
||||||
deserialize(event: DeserializeEvent<this>) {
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
super.deserialize(event);
|
super.deserialize(event);
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ export class NodeWidget extends React.Component<NodeProps> {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<PeformanceWidget serialized={this.props.node.serialize()}>
|
<PeformanceWidget model={this.props.node} serialized={this.props.node.serialize()}>
|
||||||
{() => {
|
{() => {
|
||||||
return (
|
return (
|
||||||
<S.Node
|
<S.Node
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { NodeModel } from '../node/NodeModel';
|
import { NodeModel } from '../node/NodeModel';
|
||||||
import { LinkModel } from '../link/LinkModel';
|
import { LinkModel } from '../link/LinkModel';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import { DiagramEngine } from '../../DiagramEngine';
|
|
||||||
import { Point } from '@projectstorm/geometry';
|
import { Point } from '@projectstorm/geometry';
|
||||||
import {
|
import {
|
||||||
BaseEntityEvent,
|
BaseEntityEvent,
|
||||||
|
@ -30,7 +30,7 @@ export class PortWidget extends React.Component<PortProps, PortState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount(): void {
|
componentWillUnmount(): void {
|
||||||
this.engineListenerHandle.deregister();
|
this.engineListenerHandle && this.engineListenerHandle.deregister();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps: Readonly<PortProps>, prevState: Readonly<PortState>, snapshot?: any): void {
|
componentDidUpdate(prevProps: Readonly<PortProps>, prevState: Readonly<PortState>, snapshot?: any): void {
|
||||||
|
@ -7,7 +7,8 @@ import {
|
|||||||
BaseModel,
|
BaseModel,
|
||||||
CanvasModel,
|
CanvasModel,
|
||||||
CanvasModelGenerics,
|
CanvasModelGenerics,
|
||||||
LayerModel
|
LayerModel,
|
||||||
|
DeserializeEvent
|
||||||
} from '@projectstorm/react-canvas-core';
|
} from '@projectstorm/react-canvas-core';
|
||||||
import { NodeLayerModel } from '../entities/node-layer/NodeLayerModel';
|
import { NodeLayerModel } from '../entities/node-layer/NodeLayerModel';
|
||||||
import { LinkLayerModel } from '../entities/link-layer/LinkLayerModel';
|
import { LinkLayerModel } from '../entities/link-layer/LinkLayerModel';
|
||||||
@ -32,6 +33,11 @@ export class DiagramModel<G extends DiagramModelGenerics = DiagramModelGenerics>
|
|||||||
this.addLayer(new NodeLayerModel());
|
this.addLayer(new NodeLayerModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
|
this.layers = [];
|
||||||
|
super.deserialize(event);
|
||||||
|
}
|
||||||
|
|
||||||
addLayer(layer: LayerModel): void {
|
addLayer(layer: LayerModel): void {
|
||||||
super.addLayer(layer);
|
super.addLayer(layer);
|
||||||
if (layer instanceof NodeLayerModel) {
|
if (layer instanceof NodeLayerModel) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { DiagramEngine, LabelModel, LabelModelGenerics } from '@projectstorm/react-diagrams-core';
|
import { DiagramEngine, LabelModel, LabelModelGenerics, LabelModelOptions } from '@projectstorm/react-diagrams-core';
|
||||||
import { LabelModelOptions } from '@projectstorm/react-diagrams-core';
|
import { DeserializeEvent } from '@projectstorm/react-canvas-core';
|
||||||
|
|
||||||
export interface DefaultLabelModelOptions extends LabelModelOptions {
|
export interface DefaultLabelModelOptions extends LabelModelOptions {
|
||||||
label?: string;
|
label?: string;
|
||||||
@ -22,9 +22,9 @@ export class DefaultLabelModel extends LabelModel<DefaultLabelModelGenerics> {
|
|||||||
this.options.label = label;
|
this.options.label = label;
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialize(ob, engine: DiagramEngine) {
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
super.deserialize(ob, engine);
|
super.deserialize(event);
|
||||||
this.options.label = ob.label;
|
this.options.label = event.data.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
serialize() {
|
serialize() {
|
||||||
|
@ -9,7 +9,7 @@ import {
|
|||||||
} from '@projectstorm/react-diagrams-core';
|
} from '@projectstorm/react-diagrams-core';
|
||||||
import { DefaultLabelModel } from '../label/DefaultLabelModel';
|
import { DefaultLabelModel } from '../label/DefaultLabelModel';
|
||||||
import { BezierCurve } from '@projectstorm/geometry';
|
import { BezierCurve } from '@projectstorm/geometry';
|
||||||
import { BaseEntityEvent, BaseModelOptions } from '@projectstorm/react-canvas-core';
|
import { BaseEntityEvent, BaseModelOptions, DeserializeEvent } from '@projectstorm/react-canvas-core';
|
||||||
|
|
||||||
export interface DefaultLinkModelListener extends LinkModelListener {
|
export interface DefaultLinkModelListener extends LinkModelListener {
|
||||||
colorChanged?(event: BaseEntityEvent<DefaultLinkModel> & { color: null | string }): void;
|
colorChanged?(event: BaseEntityEvent<DefaultLinkModel> & { color: null | string }): void;
|
||||||
@ -90,12 +90,12 @@ export class DefaultLinkModel extends LinkModel<DefaultLinkModelGenerics> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialize(ob: ReturnType<this['serialize']>, engine: DiagramEngine) {
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
super.deserialize(ob, engine);
|
super.deserialize(event);
|
||||||
this.options.color = ob.color;
|
this.options.color = event.data.color;
|
||||||
this.options.width = ob.width;
|
this.options.width = event.data.width;
|
||||||
this.options.curvyness = ob.curvyness;
|
this.options.curvyness = event.data.curvyness;
|
||||||
this.options.selectedColor = ob.selectedColor;
|
this.options.selectedColor = event.data.selectedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
addLabel(label: LabelModel | string) {
|
addLabel(label: LabelModel | string) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import { DiagramEngine, NodeModel, NodeModelGenerics, PortModelAlignment } from '@projectstorm/react-diagrams-core';
|
import { NodeModel, NodeModelGenerics, PortModelAlignment } from '@projectstorm/react-diagrams-core';
|
||||||
import { DefaultPortModel } from '../port/DefaultPortModel';
|
import { DefaultPortModel } from '../port/DefaultPortModel';
|
||||||
import { BasePositionModelOptions } from '@projectstorm/react-canvas-core';
|
import { BasePositionModelOptions, DeserializeEvent } from '@projectstorm/react-canvas-core';
|
||||||
|
|
||||||
export interface DefaultNodeModelOptions extends BasePositionModelOptions {
|
export interface DefaultNodeModelOptions extends BasePositionModelOptions {
|
||||||
name?: string;
|
name?: string;
|
||||||
@ -90,14 +90,14 @@ export class DefaultNodeModel extends NodeModel<DefaultNodeModelGenerics> {
|
|||||||
return this.addPort(p);
|
return this.addPort(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialize(object, engine: DiagramEngine) {
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
super.deserialize(object, engine);
|
super.deserialize(event);
|
||||||
this.options.name = object.name;
|
this.options.name = event.data.name;
|
||||||
this.options.color = object.color;
|
this.options.color = event.data.color;
|
||||||
this.portsIn = _.map(object.portsInOrder, id => {
|
this.portsIn = _.map(event.data.portsInOrder, id => {
|
||||||
return this.getPortFromID(id);
|
return this.getPortFromID(id);
|
||||||
}) as DefaultPortModel[];
|
}) as DefaultPortModel[];
|
||||||
this.portsOut = _.map(object.portsOutOrder, id => {
|
this.portsOut = _.map(event.data.portsOutOrder, id => {
|
||||||
return this.getPortFromID(id);
|
return this.getPortFromID(id);
|
||||||
}) as DefaultPortModel[];
|
}) as DefaultPortModel[];
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import {
|
|||||||
PortModelOptions
|
PortModelOptions
|
||||||
} from '@projectstorm/react-diagrams-core';
|
} from '@projectstorm/react-diagrams-core';
|
||||||
import { DefaultLinkModel } from '../link/DefaultLinkModel';
|
import { DefaultLinkModel } from '../link/DefaultLinkModel';
|
||||||
import { AbstractModelFactory } from '@projectstorm/react-canvas-core';
|
import { AbstractModelFactory, DeserializeEvent } from '@projectstorm/react-canvas-core';
|
||||||
|
|
||||||
export interface DefaultPortModelOptions extends PortModelOptions {
|
export interface DefaultPortModelOptions extends PortModelOptions {
|
||||||
label?: string;
|
label?: string;
|
||||||
@ -38,10 +38,10 @@ export class DefaultPortModel extends PortModel<DefaultPortModelGenerics> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialize(object, engine: DiagramEngine) {
|
deserialize(event: DeserializeEvent<this>) {
|
||||||
super.deserialize(object, engine);
|
super.deserialize(event);
|
||||||
this.options.in = object.in;
|
this.options.in = event.data.in;
|
||||||
this.options.label = object.label;
|
this.options.label = event.data.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
serialize() {
|
serialize() {
|
||||||
|
Reference in New Issue
Block a user