Home Reference Source

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

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