Home Reference Source

cables_dev/cables_ui/src/ui/components/canvas/canvasui.js

  1. import { ele } from "cables-shared-client";
  2. import { CgContext } from "cables-corelibs";
  3. import { gui } from "../../gui.js";
  4. import { userSettings } from "../usersettings.js";
  5. /**
  6. * the icon bar below the renderer canvas
  7. */
  8. export default class CanvasUi
  9. {
  10. #cg;
  11. #canvasEle;
  12. /**
  13. * @param {import("cables-corelibs").CgContext} [_cg]
  14. * @param {HTMLCanvasElement} [_canvEle]
  15. */
  16. constructor(_cg = null, _canvEle)
  17. {
  18. this.#cg = _cg;
  19. this.#canvasEle = _canvEle || _cg?.canvas;
  20. this.isCanvasFocussed = false;
  21. this.minimized = false;
  22. this._elCanvasIconbarContainer = this._elCanvasIconbarContainer || ele.byId("canvasicons");
  23. this._elCanvasIconbar = this._elCanvasIconbar || ele.byId("canvasIconBar");
  24. this._elcanvasCtxSwitcher = this._elcanvasCtxSwitcher || ele.byId("canvasCtxSwitcher");
  25. this._elCanvasInfoSize = this._elCanvasInfoSize || ele.byId("canvasInfoSize");
  26. this._elSplitterRightPanel = this._elSplitterRightPanel || ele.byId("splitterRightPanel");
  27. this._elCanvasInfoFps = this._elCanvasInfoFps || document.getElementById("canvasInfoFPS");
  28. this._elCtxSwitcher = this._elCtxSwitcher || document.getElementById("canvasCtxSwitcher");
  29. this._elCanvasInfoMs = this._elCanvasInfoMs || document.getElementById("canvasInfoMS");
  30. this._elInfoVersion = ele.byId("canvasInfoVersion");
  31. this._elCanvasInfoSizeOverlay = ele.byId("canvasInfoOverlay");
  32. this._elCanvasIconbarContainer.addEventListener("click", () =>
  33. {
  34. this.#canvasEle.focus();
  35. });
  36. this._elCanvasInfoSize.addEventListener("pointerenter", () =>
  37. {
  38. this._elCanvasInfoSizeOverlay.style.top = this._elCanvasInfoSize.getBoundingClientRect().y + 30 + "px";
  39. this._elCanvasInfoSizeOverlay.style.left = this._elCanvasInfoSize.getBoundingClientRect().x + "px";
  40. // this._elCanvasInfoSizeOverlay.innerHTML = "";
  41. this._elCanvasInfoSizeOverlay.classList.remove("hidden");
  42. });
  43. this._elCanvasInfoSize.addEventListener("pointerleave", () =>
  44. {
  45. this._elCanvasInfoSizeOverlay.classList.add("hidden");
  46. });
  47. if (this._elInfoVersion)
  48. {
  49. if (this.#cg && this.#cg.glVersion == 1)
  50. {
  51. this._elCanvasInfoVer = this._elCanvasInfoVer || document.getElementById("canvasInfoVersion");
  52. this._elCanvasInfoVer.innerHTML = "WebGL 1";
  53. }
  54. else this._elInfoVersion.remove();
  55. }
  56. if (this.#cg)
  57. {
  58. if (this.#cg && this.#cg.on)
  59. this.#cg.on("resize", () =>
  60. {
  61. this.updateSizeDisplay();
  62. });
  63. if (this.#cg)
  64. this.#cg.fpsCounter?.on("performance", (perf) =>
  65. {
  66. const p = gui.uiProfiler.start("[canvasUi] on performance");
  67. // if (this.isCanvasFocussed)
  68. // {
  69. if (this._oldFps != perf.fps) this._elCanvasInfoFps.innerHTML = perf.fps + " FPS";
  70. this._oldFps = perf.fps;
  71. if (this.#cg.profileData)
  72. {
  73. let ms = ((Math.round(this.#cg.profileData.profileOnAnimFrameOps * 100) / 100) || "0.0") + "ms";
  74. if (window.gui && gui.patchView.patchRenderer.vizLayer && gui.patchView.patchRenderer.vizLayer.renderMs > 3)
  75. {
  76. ms += " vizLayer: " + Math.round(gui.patchView.patchRenderer.vizLayer.renderMs) + "ms";
  77. }
  78. if (this._oldMs != ms) this._elCanvasInfoMs.innerHTML = ms;
  79. this._oldMs = ms;
  80. }
  81. // }
  82. p.finish();
  83. });
  84. }
  85. else
  86. {
  87. }
  88. this.#canvasEle.setAttribute("tabindex", 0);
  89. this.#canvasEle.addEventListener("focus", () =>
  90. {
  91. const p = gui.uiProfiler.start("[canvasUi] on focus");
  92. this.showCanvasModal(true);
  93. gui.canvasManager.setCurrentCanvas(this.#canvasEle);
  94. p.finish();
  95. });
  96. document.body.addEventListener("pointerdown",
  97. (e) =>
  98. {
  99. if (this.isCanvasFocussed &&
  100. !e.target.classList.contains("item") &&
  101. !e.target.classList.contains("icon") &&
  102. e.target != this.#canvasEle
  103. ) this.showCanvasModal(false);
  104. },
  105. true);
  106. }
  107. updateCanvasIconBar()
  108. {
  109. if (!this._elCanvasIconbarContainer) return;
  110. const perf = gui.uiProfiler.start("[canvasUi] updateCanvasIconBar");
  111. const splitterPatchRect = this._elSplitterRightPanel.getBoundingClientRect();
  112. const bodyRect = document.body.getBoundingClientRect();
  113. perf.finish();
  114. }
  115. updateSizeDisplay()
  116. {
  117. if (!gui.corePatch().cgl) return;
  118. const canvas = this.#canvasEle;
  119. const ctx = gui.canvasManager.currentContextCg();
  120. this._elCanvasInfoAspect = this._elCanvasInfoAspect || document.getElementById("canvasInfoAspect");
  121. let sizeStr = canvas.width + "x" + canvas.height;
  122. if (ctx && ctx.pixelDensity != 1) sizeStr += " (" + Math.round(ctx.pixelDensity * 100) / 100 + "x)";
  123. gui.canvasManager.updateCanvasUi();
  124. if (this._oldSizeStr != sizeStr) this._elCanvasInfoSize.innerHTML = sizeStr;
  125. this._oldSizeStr = sizeStr;
  126. this.updateIconState();
  127. let str = "<table>";
  128. if (ctx) str += "<tr><td>Canvas API</td><td>" + ctx.getGApiName() + "</td></tr>";
  129. str += "<tr><td>Canvas id</td><td>" + canvas.id + "</td></tr>";
  130. str += "<tr><td>Canvas CSS Size:</td><td><code>" + canvas.clientWidth + "&nbsp;x&nbsp;" + canvas.clientHeight + "</td></tr>";
  131. str += "<tr><td>Canvas Pixel Size:</td><td><code>" + canvas.width + " x " + canvas.height + "</td></tr>";
  132. str += "<tr><td>Device Pixel Ratio/Density:</td><td><code>" + window.devicePixelRatio + "</td></tr>";
  133. if (ctx) str += "<tr><td>Canvas Pixel Ratio/Density:</td><td><code>" + ctx.pixelDensity + "</td></tr>";
  134. str += "</table>";
  135. this._elCanvasInfoSizeOverlay.innerHTML = str;
  136. return sizeStr;
  137. }
  138. updateIconState()
  139. {
  140. const act = userSettings.get("overlaysShow");
  141. const icon = ele.byId("canvUitoggleOverlay");
  142. if (icon)
  143. if (act)icon.style.backgroundColor = "var(--color-special)";
  144. else icon.style.backgroundColor = "var(--color-07)";
  145. }
  146. /**
  147. * @param {boolean} show
  148. */
  149. showCanvasModal(show)
  150. {
  151. if (userSettings.get("hideCanvasUi")) return;
  152. const perf = gui.uiProfiler.start("[canvasUi] showCanvasModal");
  153. this._elCanvasModalDarkener = this._elCanvasModalDarkener || document.getElementById("canvasmodal");
  154. this.updateSizeDisplay();
  155. this.updateCanvasIconBar();
  156. this.isCanvasFocussed = show;
  157. if (this.isCanvasFocussed) this._elCanvasIconbar.classList.remove("hidden");
  158. else this._elCanvasIconbar.classList.add("hidden");
  159. if (show)
  160. {
  161. if (gui.canvasManager.mode == gui.canvasManager.CANVASMODE_PATCHBG)
  162. {
  163. ele.hide(this._elCanvasModalDarkener);
  164. }
  165. else
  166. {
  167. if (!this._showing) ele.show(this._elCanvasModalDarkener);
  168. }
  169. }
  170. else
  171. {
  172. setTimeout(() =>
  173. {
  174. // ele.hide(this._elCanvasIconbarContainer);
  175. ele.hide(this._elCanvasModalDarkener);
  176. }, 100);
  177. }
  178. this._showing = show;
  179. perf.finish();
  180. }
  181. }