|
@@ -0,0 +1,86 @@
|
|
|
+import * as React from "react";
|
|
|
+import {RountangleAction} from "./RountangleActions";
|
|
|
+
|
|
|
+export interface RountangleProps {
|
|
|
+ id: string;
|
|
|
+ name: string;
|
|
|
+ posX: number;
|
|
|
+ posY: number;
|
|
|
+ dispatch: (action: RountangleAction) => void;
|
|
|
+}
|
|
|
+
|
|
|
+interface RountangleState {
|
|
|
+ dragging: boolean;
|
|
|
+ moved: boolean;
|
|
|
+}
|
|
|
+
|
|
|
+export class RountangleComponent extends React.Component<RountangleProps, RountangleState> {
|
|
|
+ shouldComponentUpdate(nextProps: Readonly<RountangleProps>, nextState: Readonly<RountangleState>, nextContext: any): boolean {
|
|
|
+ const compare = this.props.posX !== nextProps.posX
|
|
|
+ || this.props.posY !== nextProps.posY;
|
|
|
+
|
|
|
+ console.log(`${this.props.name}: ${compare}`);
|
|
|
+
|
|
|
+ return this.props.posX !== nextProps.posX
|
|
|
+ || this.props.posY !== nextProps.posY;
|
|
|
+ }
|
|
|
+
|
|
|
+ constructor(props: RountangleProps) {
|
|
|
+ super(props);
|
|
|
+ this.state = {
|
|
|
+ dragging: false,
|
|
|
+ moved: false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ // only left mouse button
|
|
|
+ if (event.button !== 0) return;
|
|
|
+
|
|
|
+ event.currentTarget.setPointerCapture(event.pointerId);
|
|
|
+
|
|
|
+ this.setState({dragging: true, moved: false});
|
|
|
+ event.stopPropagation();
|
|
|
+ event.preventDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ onPointerMove = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ if (!this.state.dragging) return;
|
|
|
+ this.setState({moved: true});
|
|
|
+ this.props.dispatch({
|
|
|
+ tag: 'moveRountangle',
|
|
|
+ id: this.props.id,
|
|
|
+ newPosX: this.props.posX + event.movementX,
|
|
|
+ newPosY: this.props.posY + event.movementY
|
|
|
+ });
|
|
|
+
|
|
|
+ event.stopPropagation();
|
|
|
+ event.preventDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ onPointerUp = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ event.currentTarget.releasePointerCapture(event.pointerId);
|
|
|
+ event.stopPropagation();
|
|
|
+ event.preventDefault();
|
|
|
+
|
|
|
+ // only left mouse button
|
|
|
+ if (event.button !== 0) return;
|
|
|
+ this.setState({dragging: false, moved: false});
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ return(
|
|
|
+ <div
|
|
|
+ className={'sce-rountangle'}
|
|
|
+ style={{ left: this.props.posX, top: this.props.posY }}
|
|
|
+ onPointerDown={this.onPointerDown}
|
|
|
+ onPointerMove={this.onPointerMove}
|
|
|
+ onPointerUp={this.onPointerUp}
|
|
|
+ >
|
|
|
+ <div className={'sce-ruontangle-name'}>
|
|
|
+ {this.props.name}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|