commonPropertyGridComponent.tsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  3. import { PropertyChangedEvent } from "../../../propertyChangedEvent";
  4. import { LineContainerComponent } from "../../lineContainerComponent";
  5. import { LockObject } from "./lockObject";
  6. import { GlobalState } from "../../../globalState";
  7. import { TextLineComponent } from '../../lines/textLineComponent';
  8. import { IndentedTextLineComponent } from '../../lines/indentedtextLineComponent';
  9. interface ICommonPropertyGridComponentProps {
  10. globalState: GlobalState;
  11. host: { metadata: any};
  12. lockObject: LockObject;
  13. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  14. }
  15. export class CommonPropertyGridComponent extends React.Component<ICommonPropertyGridComponentProps> {
  16. constructor(props: ICommonPropertyGridComponentProps) {
  17. super(props);
  18. }
  19. renderLevel(jsonObject: any) {
  20. let components = [];
  21. for (var data in jsonObject) {
  22. let value = jsonObject[data];
  23. let type = Object.prototype.toString.call(value);
  24. switch(type) {
  25. case '[object String]':
  26. components.push(
  27. <TextLineComponent key={data} label={data} ignoreValue={true}/>
  28. );
  29. components.push(
  30. <IndentedTextLineComponent key={data + value} value={value}/>
  31. );
  32. break;
  33. case '[object Array]':
  34. components.push(
  35. <TextLineComponent key={data} label={data} ignoreValue={true}/>
  36. );
  37. for (var entry of value) {
  38. components.push(
  39. <IndentedTextLineComponent key={data + entry} value={entry}/>
  40. );
  41. }
  42. break;
  43. case '[object Object]':
  44. components.push(
  45. <TextLineComponent key={data} label={data} ignoreValue={true}/>
  46. );
  47. for (var entryKey in value) {
  48. components.push(
  49. <TextLineComponent key={data + entry} label={entryKey} value={value[entryKey]} additionalClass="reduced-opacity"/>
  50. );
  51. }
  52. break;
  53. }
  54. }
  55. return components;
  56. }
  57. render() {
  58. if (!this.props.host.metadata) {
  59. return null;
  60. }
  61. if (!this.props.host.metadata.xmp) {
  62. return null;
  63. }
  64. return (
  65. <div>
  66. <LineContainerComponent globalState={this.props.globalState} title="XMP METADA">
  67. {
  68. this.renderLevel(this.props.host.metadata.xmp)
  69. }
  70. </LineContainerComponent>
  71. </div>
  72. );
  73. }
  74. }