|
@@ -7,6 +7,7 @@ import {PrimitiveValue} from "../../onion/types";
|
|
|
export interface RountangleProps extends Rountangle {
|
|
|
id: PrimitiveValue;
|
|
|
dispatch: (action: RountangleAction) => void;
|
|
|
+ zoom: number;
|
|
|
}
|
|
|
|
|
|
export interface RountangleState {
|
|
@@ -19,8 +20,6 @@ export interface RountangleState {
|
|
|
}
|
|
|
|
|
|
export class RountangleComponent extends React.Component<RountangleProps, RountangleState> {
|
|
|
- private readonly rountangleRef: React.RefObject<HTMLDivElement>
|
|
|
-
|
|
|
shouldComponentUpdate(nextProps: Readonly<RountangleProps>, nextState: Readonly<RountangleState>, nextContext: any): boolean {
|
|
|
return this.props.posX !== nextProps.posX
|
|
|
|| this.props.posY !== nextProps.posY
|
|
@@ -35,15 +34,6 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
|| this.state.resizeHeight !== nextState.resizeHeight;
|
|
|
}
|
|
|
|
|
|
- componentDidMount() {
|
|
|
- // IMPORTANT: notice the `passive: false` option
|
|
|
- this.rountangleRef.current?.addEventListener('wheel', this.onWheel, { passive: false });
|
|
|
- }
|
|
|
-
|
|
|
- componentWillUnmount() {
|
|
|
- this.rountangleRef.current?.removeEventListener('wheel', this.onWheel);
|
|
|
- }
|
|
|
-
|
|
|
constructor(props: RountangleProps) {
|
|
|
super(props);
|
|
|
this.state = {
|
|
@@ -54,11 +44,9 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
resizeWidth: 0,
|
|
|
resizeHeight: 0
|
|
|
}
|
|
|
-
|
|
|
- this.rountangleRef = React.createRef<HTMLDivElement>();
|
|
|
}
|
|
|
|
|
|
- onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ onPointerDown = (event: React.PointerEvent<SVGRectElement>) => {
|
|
|
// only left mouse button
|
|
|
if (event.button !== 0) return;
|
|
|
|
|
@@ -69,19 +57,22 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
event.preventDefault();
|
|
|
}
|
|
|
|
|
|
- onPointerMove = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ onPointerMove = (event: React.PointerEvent<SVGRectElement>) => {
|
|
|
if (!this.state.dragging) return;
|
|
|
- this.setState({
|
|
|
- moved: true,
|
|
|
- movementsX: this.state.movementsX + event.movementX,
|
|
|
- movementsY: this.state.movementsY + event.movementY
|
|
|
- });
|
|
|
+
|
|
|
+ if (event.movementX !== 0 || event.movementY !== 0) {
|
|
|
+ this.setState({
|
|
|
+ moved: true,
|
|
|
+ movementsX: this.state.movementsX + event.movementX * this.props.zoom,
|
|
|
+ movementsY: this.state.movementsY + event.movementY * this.props.zoom
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
event.stopPropagation();
|
|
|
event.preventDefault();
|
|
|
}
|
|
|
|
|
|
- onPointerUp = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ onPointerUp = (event: React.PointerEvent<SVGRectElement>) => {
|
|
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
|
event.stopPropagation();
|
|
|
event.preventDefault();
|
|
@@ -107,17 +98,6 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- onWheel = (event: WheelEvent) => {
|
|
|
- event.preventDefault();
|
|
|
- event.stopPropagation();
|
|
|
-
|
|
|
- this.props.dispatch({
|
|
|
- tag: 'changeRountangleZ',
|
|
|
- id: this.props.id,
|
|
|
- newPosZ: Math.max(this.props.posZ + event.deltaY, 10)
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
onDoubleClick = (event: React.MouseEvent) => {
|
|
|
const newRountangleName = prompt('Rename', this.props.name);
|
|
|
if (newRountangleName && newRountangleName !== this.props.name) {
|
|
@@ -130,10 +110,12 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
}
|
|
|
|
|
|
onResize = (deltaHeight: number, deltaWidth: number) => {
|
|
|
- this.setState({
|
|
|
- resizeWidth: this.state.resizeWidth + deltaHeight,
|
|
|
- resizeHeight: this.state.resizeHeight + deltaWidth
|
|
|
- })
|
|
|
+ if (deltaHeight !== 0 || deltaWidth !== 0) {
|
|
|
+ this.setState({
|
|
|
+ resizeWidth: this.state.resizeWidth + deltaHeight * this.props.zoom,
|
|
|
+ resizeHeight: this.state.resizeHeight + deltaWidth * this.props.zoom
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
onResizeComplete = () => {
|
|
@@ -152,32 +134,45 @@ export class RountangleComponent extends React.Component<RountangleProps, Rounta
|
|
|
|
|
|
render() {
|
|
|
return(
|
|
|
- <div
|
|
|
- ref={this.rountangleRef}
|
|
|
- className={`re-rountangle ${this.state.dragging ? 'dragging' : ''}`}
|
|
|
- style={{
|
|
|
- left: this.props.posX + this.state.movementsX,
|
|
|
- top: this.props.posY + this.state.movementsY,
|
|
|
- zIndex: this.props.posZ,
|
|
|
- width: this.props.width + this.state.resizeWidth,
|
|
|
- height: this.props.height + this.state.resizeHeight
|
|
|
- }}
|
|
|
- onPointerDown={this.onPointerDown}
|
|
|
- onPointerMove={this.onPointerMove}
|
|
|
- onPointerUp={this.onPointerUp}
|
|
|
- onDoubleClick={this.onDoubleClick}
|
|
|
- >
|
|
|
- <div title={this.props.id.toString()} className={'re-rountangle-name'}>
|
|
|
- {this.props.name}
|
|
|
- </div>
|
|
|
- <RountangleResizeHandleComponent
|
|
|
- id={this.props.id}
|
|
|
- height={this.props.height + this.state.resizeHeight}
|
|
|
- width={this.props.width + this.state.resizeWidth}
|
|
|
- onResize={this.onResize}
|
|
|
- onResizeComplete={this.onResizeComplete}
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <g
|
|
|
+ className={`re-rountangle-wrapper ${this.state.dragging ? 'dragging' : ''}`}
|
|
|
+ >
|
|
|
+ <rect
|
|
|
+ rx={5}
|
|
|
+ ry={5}
|
|
|
+ x={this.props.posX + this.state.movementsX}
|
|
|
+ y={this.props.posY + this.state.movementsY}
|
|
|
+ width={this.props.width + this.state.resizeWidth}
|
|
|
+ height={this.props.height + this.state.resizeHeight}
|
|
|
+ className={'re-rountangle'}
|
|
|
+ />
|
|
|
+ <foreignObject
|
|
|
+ x={this.props.posX + this.state.movementsX}
|
|
|
+ y={this.props.posY + this.state.movementsY}
|
|
|
+ width={this.props.width + this.state.resizeWidth}
|
|
|
+ height={this.props.height + this.state.resizeHeight}
|
|
|
+ onPointerDown={this.onPointerDown}
|
|
|
+ onPointerMove={this.onPointerMove}
|
|
|
+ onPointerUp={this.onPointerUp}
|
|
|
+ onDoubleClick={this.onDoubleClick}
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ className={'re-rountangle-name'}
|
|
|
+ title={this.props.id.toString()}
|
|
|
+ >
|
|
|
+ <span>{this.props.name}</span>
|
|
|
+ </div>
|
|
|
+ </foreignObject>
|
|
|
+ <RountangleResizeHandleComponent
|
|
|
+ id={this.props.id}
|
|
|
+ x={this.props.posX + this.state.movementsX}
|
|
|
+ y={this.props.posY + this.state.movementsY}
|
|
|
+ height={this.props.height + this.state.resizeHeight}
|
|
|
+ width={this.props.width + this.state.resizeWidth}
|
|
|
+ onResize={this.onResize}
|
|
|
+ onResizeComplete={this.onResizeComplete}
|
|
|
+ />
|
|
|
+ </g>
|
|
|
);
|
|
|
}
|
|
|
}
|