serialization is almost working again

This commit is contained in:
Dylan Vorster
2019-08-10 14:08:28 +02:00
parent 7045d75ae7
commit a46e17306b
14 changed files with 85 additions and 84 deletions

View File

@ -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);
}

View File

@ -35,7 +35,6 @@ export default () => {
//!------------- SERIALIZING ------------------
var str = JSON.stringify(model.serialize());
console.log(model.serialize());
//!------------- DESERIALIZING ----------------

View File

@ -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 {

View File

@ -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);
}

View File

@ -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>

View File

@ -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);

View File

@ -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

View File

@ -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,

View File

@ -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 {

View File

@ -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) {

View File

@ -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() {

View File

@ -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) {

View File

@ -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[];
}

View File

@ -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() {