keyframeSvgPoint.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import * as React from "react";
  2. import { Vector2 } from "babylonjs/Maths/math.vector";
  3. import { AnchorSvgPoint } from "./anchorSvgPoint";
  4. const keyInactive = require("./assets/keyInactiveIcon.svg") as string;
  5. const keySelected = require("./assets/keySelectedIcon.svg") as string;
  6. export interface IKeyframeSvgPoint {
  7. keyframePoint: Vector2;
  8. rightControlPoint: Vector2 | null;
  9. leftControlPoint: Vector2 | null;
  10. id: string;
  11. selected: boolean;
  12. isLeftActive: boolean;
  13. isRightActive: boolean;
  14. curveId?: ICurveMetaData;
  15. }
  16. export interface ICurveMetaData {
  17. id: number;
  18. animationName: string;
  19. property: string;
  20. }
  21. interface IKeyframeSvgPointProps {
  22. keyframePoint: Vector2;
  23. leftControlPoint: Vector2 | null;
  24. rightControlPoint: Vector2 | null;
  25. id: string;
  26. selected: boolean;
  27. selectKeyframe: (id: string, multiselect: boolean) => void;
  28. selectedControlPoint: (type: string, id: string) => void;
  29. isLeftActive: boolean;
  30. isRightActive: boolean;
  31. framesInCanvasView: { from: number; to: number };
  32. }
  33. /**
  34. * Renders the Keyframe as an SVG Element for the Canvas component.
  35. * Holds the two control points to generate the proper curve.
  36. */
  37. export class KeyframeSvgPoint extends React.Component<IKeyframeSvgPointProps> {
  38. constructor(props: IKeyframeSvgPointProps) {
  39. super(props);
  40. }
  41. select = (e: React.MouseEvent<SVGImageElement>) => {
  42. e.preventDefault();
  43. let multiSelect = false;
  44. if (e.buttons === 0 && e.ctrlKey) {
  45. multiSelect = true;
  46. }
  47. this.props.selectKeyframe(this.props.id, multiSelect);
  48. };
  49. selectedControlPointId = (type: string) => {
  50. this.props.selectedControlPoint(type, this.props.id);
  51. };
  52. render() {
  53. const svgImageIcon = this.props.selected ? keySelected : keyInactive;
  54. return (
  55. <>
  56. <svg
  57. className="draggable"
  58. x={this.props.keyframePoint.x}
  59. y={this.props.keyframePoint.y}
  60. style={{ overflow: "visible", cursor: "pointer" }}
  61. >
  62. <image
  63. data-id={this.props.id}
  64. className="draggable"
  65. x="-1"
  66. y="-1.5"
  67. width="3"
  68. height="3"
  69. href={svgImageIcon}
  70. onClick={this.select}
  71. />
  72. </svg>
  73. {this.props.leftControlPoint && (
  74. <AnchorSvgPoint
  75. type="left"
  76. index={this.props.id}
  77. control={this.props.leftControlPoint}
  78. anchor={this.props.keyframePoint}
  79. active={this.props.selected}
  80. selected={this.props.isLeftActive}
  81. selectControlPoint={this.selectedControlPointId}
  82. framesInCanvasView={this.props.framesInCanvasView}
  83. />
  84. )}
  85. {this.props.rightControlPoint && (
  86. <AnchorSvgPoint
  87. type="right"
  88. index={this.props.id}
  89. control={this.props.rightControlPoint}
  90. anchor={this.props.keyframePoint}
  91. active={this.props.selected}
  92. selected={this.props.isRightActive}
  93. selectControlPoint={this.selectedControlPointId}
  94. framesInCanvasView={this.props.framesInCanvasView}
  95. />
  96. )}
  97. </>
  98. );
  99. }
  100. }