|
@@ -0,0 +1,75 @@
|
|
|
+import * as React from "react";
|
|
|
+import {RountangleAction} from "./RountangleActions";
|
|
|
+import {RountangleProps, RountangleState} from "./RountangleComponent";
|
|
|
+
|
|
|
+interface RountangleResizeHandleProps {
|
|
|
+ id: string;
|
|
|
+ dispatch: (action: RountangleAction) => void;
|
|
|
+ width: number;
|
|
|
+ height: number;
|
|
|
+}
|
|
|
+
|
|
|
+export class RountangleResizeHandleComponent extends React.Component<RountangleResizeHandleProps, RountangleState> {
|
|
|
+ shouldComponentUpdate(nextProps: Readonly<RountangleResizeHandleProps>, nextState: Readonly<RountangleState>, nextContext: any): boolean {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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});
|
|
|
+ if (event.movementX !== 0 || event.movementY !== 0) {
|
|
|
+ this.props.dispatch({
|
|
|
+ tag: 'resizeRountangle',
|
|
|
+ id: this.props.id,
|
|
|
+ width: this.props.width + event.movementX,
|
|
|
+ height: this.props.height + event.movementY
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ event.stopPropagation();
|
|
|
+ event.preventDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ onPointerUp = (event: React.PointerEvent<HTMLDivElement>) => {
|
|
|
+ event.currentTarget.releasePointerCapture(event.pointerId);
|
|
|
+ event.stopPropagation();
|
|
|
+ event.preventDefault();
|
|
|
+
|
|
|
+ // if left button, complete dragging
|
|
|
+ if (event.button === 0) {
|
|
|
+ this.setState({dragging: false, moved: false});
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ return <div
|
|
|
+ className={'re-rountangle-resize-handle'}
|
|
|
+ onPointerDown={this.onPointerDown}
|
|
|
+ onPointerMove={this.onPointerMove}
|
|
|
+ onPointerUp={this.onPointerUp}
|
|
|
+ />
|
|
|
+ }
|
|
|
+}
|