RountangleResizeHandleComponent.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import * as React from "react";
  2. import {RountangleState} from "./RountangleComponent";
  3. import {PrimitiveValue} from "../../onion/types";
  4. interface RountangleResizeHandleProps {
  5. id: PrimitiveValue;
  6. x: number;
  7. y: number;
  8. width: number;
  9. height: number;
  10. onResize: (deltaX: number, deltaY: number) => void;
  11. onResizeComplete: () => void;
  12. }
  13. export interface RountangleResizeHandleState {
  14. dragging: boolean;
  15. moved: boolean;
  16. }
  17. export class RountangleResizeHandleComponent extends React.Component<RountangleResizeHandleProps, RountangleResizeHandleState> {
  18. shouldComponentUpdate(nextProps: Readonly<RountangleResizeHandleProps>, nextState: Readonly<RountangleState>, nextContext: any): boolean {
  19. return this.props.width !== nextProps.width
  20. || this.props.height !== nextProps.height
  21. || this.props.x !== nextProps.x
  22. || this.props.y !== nextProps.y
  23. }
  24. constructor(props: RountangleResizeHandleProps) {
  25. super(props);
  26. this.state = {
  27. dragging: false,
  28. moved: false
  29. }
  30. }
  31. onPointerDown = (event: React.PointerEvent<SVGSVGElement>) => {
  32. // only left mouse button
  33. if (event.button !== 0) return;
  34. event.currentTarget.setPointerCapture(event.pointerId);
  35. this.setState({
  36. dragging: true,
  37. moved: false
  38. });
  39. event.stopPropagation();
  40. event.preventDefault();
  41. }
  42. onPointerMove = (event: React.PointerEvent<SVGSVGElement>) => {
  43. if (!this.state.dragging) return;
  44. this.props.onResize(event.movementX, event.movementY);
  45. event.stopPropagation();
  46. event.preventDefault();
  47. }
  48. onPointerUp = (event: React.PointerEvent<SVGSVGElement>) => {
  49. event.currentTarget.releasePointerCapture(event.pointerId);
  50. event.stopPropagation();
  51. event.preventDefault();
  52. // if left button, complete dragging
  53. if (event.button === 0) {
  54. if (this.state.dragging) {
  55. this.setState({dragging: false, moved: false});
  56. this.props.onResizeComplete();
  57. }
  58. }
  59. }
  60. render() {
  61. return <svg
  62. x={this.props.x + this.props.width - 16.5}
  63. y={this.props.y + this.props.height - 16.5}
  64. width={15}
  65. height={15}
  66. className="re-rountangle-resize-handle"
  67. onPointerDown={this.onPointerDown}
  68. onPointerMove={this.onPointerMove}
  69. onPointerUp={this.onPointerUp}
  70. >
  71. <polygon
  72. points={"15,0 15,15, 0,15"}
  73. />
  74. </svg>
  75. }
  76. }