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