guiListComponent.tsx 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import * as React from "react";
  2. import { GlobalState } from "../../globalState";
  3. import { LineContainerComponent } from "../../sharedUiComponents/lines/lineContainerComponent";
  4. import { DraggableLineComponent } from "../../sharedUiComponents/lines/draggableLineComponent";
  5. import { Observer } from "babylonjs/Misc/observable";
  6. import { Nullable } from "babylonjs/types";
  7. require("./guiList.scss");
  8. interface IGuiListComponentProps {
  9. globalState: GlobalState;
  10. }
  11. export class GuiListComponent extends React.Component<IGuiListComponentProps, { filter: string }> {
  12. private _onResetRequiredObserver: Nullable<Observer<void>>;
  13. private static _Tooltips: { [key: string]: string } = {
  14. Button: "A simple button",
  15. };
  16. constructor(props: IGuiListComponentProps) {
  17. super(props);
  18. this.state = { filter: "" };
  19. this._onResetRequiredObserver = this.props.globalState.onResetRequiredObservable.add(() => {
  20. this.forceUpdate();
  21. });
  22. }
  23. componentWillUnmount() {
  24. this.props.globalState.onResetRequiredObservable.remove(this._onResetRequiredObserver);
  25. }
  26. filterContent(filter: string) {
  27. this.setState({ filter: filter });
  28. }
  29. render() {
  30. // Block types used to create the menu from
  31. const allBlocks: any = {
  32. Buttons: ["TextButton", "ImageButton"],
  33. Controls: ["Slider", "Checkbox", "ColorPicker", "VirtualKeyboard"],
  34. Containers: ["DisplayGrid", "Grid"],
  35. Shapes: ["Ellipse", "Image", "Line", "Rectangle"],
  36. Inputs: ["Text", "InputText", "InputPassword"],
  37. };
  38. // Create node menu
  39. var blockMenu = [];
  40. for (var key in allBlocks) {
  41. var blockList = (allBlocks as any)[key]
  42. .filter((b: string) => !this.state.filter || b.toLowerCase().indexOf(this.state.filter.toLowerCase()) !== -1)
  43. .sort((a: string, b: string) => a.localeCompare(b))
  44. .map((block: any, i: number) => {
  45. return <DraggableLineComponent key={block} data={block} tooltip={GuiListComponent._Tooltips[block] || ""} />;
  46. });
  47. if (blockList.length) {
  48. blockMenu.push(
  49. <LineContainerComponent key={key + " blocks"} title={key.replace("__", ": ").replace("_", " ")} closed={false}>
  50. {blockList}
  51. </LineContainerComponent>
  52. );
  53. }
  54. }
  55. return (
  56. <div id="guiList">
  57. <div className="panes">
  58. <div className="pane">
  59. <div className="filter">
  60. <input
  61. type="text"
  62. placeholder="Filter"
  63. onFocus={() => (this.props.globalState.blockKeyboardEvents = true)}
  64. onBlur={(evt) => {
  65. this.props.globalState.blockKeyboardEvents = false;
  66. }}
  67. onChange={(evt) => this.filterContent(evt.target.value)}
  68. />
  69. </div>
  70. <div className="list-container">{blockMenu}</div>
  71. </div>
  72. </div>
  73. </div>
  74. );
  75. }
  76. }