-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathCanvasWidget.tsx
118 lines (104 loc) · 2.92 KB
/
CanvasWidget.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import * as React from 'react';
import { CanvasEngine } from '../../CanvasEngine';
import { TransformLayerWidget } from '../layer/TransformLayerWidget';
import styled from '@emotion/styled';
import { SmartLayerWidget } from '../layer/SmartLayerWidget';
export interface DiagramProps {
engine: CanvasEngine;
className?: string;
}
namespace S {
export const Canvas = styled.div`
position: relative;
cursor: move;
overflow: hidden;
`;
}
export class CanvasWidget extends React.Component<DiagramProps> {
ref: React.RefObject<HTMLDivElement>;
keyUp: any;
keyDown: any;
blur: any;
canvasListener: any;
constructor(props: DiagramProps) {
super(props);
this.ref = React.createRef();
this.state = {
action: null,
diagramEngineListener: null
};
}
componentWillUnmount() {
this.props.engine.deregisterListener(this.canvasListener);
this.props.engine.setCanvas(null);
document.removeEventListener('keyup', this.keyUp);
document.removeEventListener('keydown', this.keyDown);
}
registerCanvas() {
this.props.engine.setCanvas(this.ref.current);
this.props.engine.iterateListeners((list) => {
list.rendered && list.rendered();
});
}
componentDidUpdate() {
this.registerCanvas();
}
componentDidMount() {
this.canvasListener = this.props.engine.registerListener({
repaintCanvas: () => {
this.forceUpdate();
}
});
this.keyDown = (event) => {
this.props.engine.getActionEventBus().fireAction({ event });
};
this.keyUp = (event) => {
this.props.engine.getActionEventBus().fireAction({ event });
};
this.blur = () => {
this.props.engine.getActionEventBus().clearKeys();
};
document.addEventListener('keyup', this.keyUp);
document.addEventListener('keydown', this.keyDown);
document.addEventListener('blur', this.blur);
this.registerCanvas();
}
render() {
const engine = this.props.engine;
const model = engine.getModel();
return (
<S.Canvas
className={this.props.className}
ref={this.ref}
onWheel={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onMouseDown={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onMouseUp={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onMouseMove={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onTouchStart={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onTouchEnd={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}
onTouchMove={(event) => {
this.props.engine.getActionEventBus().fireAction({ event });
}}>
{model.getLayers().map((layer) => {
return (
<TransformLayerWidget layer={layer} key={layer.getID()}>
<SmartLayerWidget layer={layer} engine={this.props.engine} key={layer.getID()} />
</TransformLayerWidget>
);
})}
</S.Canvas>
);
}
}