Home Reference Source

cables_dev/cables_ui/src/ui/commands/cmd_renderer.js

  1. import { ele } from "cables-shared-client";
  2. import CanvasLens from "../components/canvas/canvaslens.js";
  3. import ModalDialog from "../dialogs/modaldialog.js";
  4. import Gui, { gui } from "../gui.js";
  5. const CABLES_CMD_RENDERER = {};
  6. export { CmdRenderer };
  7. class CmdRenderer
  8. {
  9. /** @type {import("./commands.js").CommandObject[]} */
  10. static get commands()
  11. {
  12. return [
  13. {
  14. "cmd": "save screenshot",
  15. "category": "canvas",
  16. "func": CmdRenderer.screenshot,
  17. "icon": "image"
  18. },
  19. {
  20. "cmd": "maximize canvas",
  21. "category": "canvas",
  22. "func": CmdRenderer.maximizeCanvas,
  23. "icon": "canvas_max",
  24. "infotext": "renderer_maximize"
  25. },
  26. {
  27. "cmd": "change canvas size",
  28. "category": "canvas",
  29. "func": CmdRenderer.changeSize,
  30. "icon": "resize_canvas"
  31. },
  32. {
  33. "cmd": "reset canvas size",
  34. "keybindable": true,
  35. "category": "canvas",
  36. "func": CmdRenderer.resetSize,
  37. "icon": "reset_render_size"
  38. },
  39. {
  40. "cmd": "set canvas aspect ratio",
  41. "category": "canvas",
  42. "func": CmdRenderer.aspect,
  43. "icon": "canvas_max"
  44. },
  45. {
  46. "cmd": "scale canvas",
  47. "category": "canvas",
  48. "func": CmdRenderer.scaleCanvas,
  49. "icon": "scale_canvas"
  50. },
  51. {
  52. "cmd": "canvas magnifier",
  53. "category": "canvas",
  54. "func": CmdRenderer.canvasMagnifier,
  55. "icon": "picker"
  56. },
  57. {
  58. "cmd": "canvas window",
  59. "category": "canvas",
  60. "func": CmdRenderer.popoutCanvas,
  61. "icon": "external"
  62. },
  63. {
  64. "cmd": "Simulate Scrolling Page",
  65. "category": "canvas",
  66. "func": CmdRenderer.scrollingPage
  67. },
  68. {
  69. "cmd": "Maximize renderer",
  70. "category": "ui",
  71. "func": CmdRenderer.maximizeCanvas,
  72. "icon": "canvas_max",
  73. "hotkey": "CMD + ENTER"
  74. }
  75. ];
  76. }
  77. static screenshot()
  78. {
  79. gui.canvasManager.currentContextCg().saveScreenshot();
  80. gui.corePatch().resume();
  81. }
  82. static maximizeCanvas()
  83. {
  84. gui.toggleMaximizeCanvas();
  85. }
  86. static resetSize()
  87. {
  88. gui.rendererWidth = 640;
  89. gui.rendererHeight = 360;
  90. gui.setLayout();
  91. }
  92. static canvasMagnifier()
  93. {
  94. gui.canvasMagnifier = new CanvasLens();
  95. }
  96. static scrollingPage()
  97. {
  98. if (ele.byId("testcontent").innerHTML == "")
  99. {
  100. document.body.classList.add("scrollPage");
  101. let str = "";
  102. for (let i = 0; i < 1000; i++)
  103. {
  104. str += "- long page...<br/>";
  105. }
  106. str += "<div style=\"position:fixed;bottom:50px;z-index:99999;border-radius:10px;left:40%;cursor:pointer;background-color:#07F78C;color:#000;padding:20px;\" class=\"button-small\" onclick=\"CABLES.CMD.RENDERER.scrollingPage();\">exit scrollmode<div>";
  107. ele.byId("testcontent").innerHTML = str;
  108. }
  109. else
  110. {
  111. document.body.scrollTo({
  112. "top": 0,
  113. "behavior": "smooth"
  114. });
  115. document.body.classList.remove("scrollPage");
  116. ele.byId("testcontent").innerHTML = "";
  117. }
  118. }
  119. static aspect(a = 0)
  120. {
  121. if (!a)
  122. {
  123. new ModalDialog({
  124. "prompt": true,
  125. "title": "Change Aspect Ratio of Renderer",
  126. "text": "Enter an aspect ratio, e.g.: 16:9 or 0.22",
  127. "promptValue": gui.corePatch().cgl.canvasScale,
  128. "promptOk": (r) =>
  129. {
  130. if (r.indexOf(":") >= 0)
  131. {
  132. const parts = r.split(":");
  133. const s = parseInt(parts[0]) / parseInt(parts[1]);
  134. CmdRenderer.aspect(s);
  135. }
  136. else
  137. {
  138. const s = parseFloat(r);
  139. CmdRenderer.aspect(s);
  140. }
  141. }
  142. });
  143. return;
  144. }
  145. const nh = gui.rendererWidth * 1 / a;
  146. if (nh < window.innerHeight * 0.6)
  147. {
  148. gui.rendererHeight = nh;
  149. }
  150. else
  151. {
  152. gui.rendererHeight = window.innerHeight * 0.6;
  153. gui.rendererWidth = gui.rendererHeight * a;
  154. }
  155. gui.emitEvent(Gui.EVENT_RESIZE_CANVAS);
  156. gui.setLayout();
  157. gui.canvasManager.getCanvasUiBar().updateCanvasIconBar();
  158. }
  159. static scaleCanvas()
  160. {
  161. const p = new ModalDialog({
  162. "prompt": true,
  163. "title": "Change Scale of Renderer",
  164. "text": "Enter a new scale",
  165. "promptValue": gui.corePatch().cgl.canvasScale || 1,
  166. "promptOk": (r) =>
  167. {
  168. const s = parseFloat(r);
  169. gui.corePatch().cgl.canvasScale = s;
  170. gui.setLayout();
  171. }
  172. });
  173. }
  174. static changeSize()
  175. {
  176. let str = "Enter a new size:";
  177. if (gui.canvasManager.getCanvasUiBar())
  178. gui.canvasManager.getCanvasUiBar().showCanvasModal(false);
  179. const p = new ModalDialog({
  180. "prompt": true,
  181. "title": "Change Canvas size",
  182. "text": str,
  183. "promptValue": Math.round(gui.rendererWidth) + " x " + Math.round(gui.rendererHeight),
  184. "promptOk": (r) =>
  185. {
  186. const matches = r.match(/\d+/g);
  187. if (matches.length > 0)
  188. {
  189. gui.canvasManager.setSize(matches[0], matches[1]);
  190. if (gui.canvasManager.mode != gui.canvasManager.CANVASMODE_POPOUT)
  191. {
  192. gui.rendererWidth = matches[0];
  193. gui.rendererHeight = matches[1];
  194. }
  195. else
  196. {
  197. gui.canvasManager.subWindow.resizeTo(matches[0], matches[1]);
  198. }
  199. gui.setLayout();
  200. }
  201. }
  202. });
  203. }
  204. static popoutCanvas()
  205. {
  206. gui.canvasManager.popOut();
  207. }
  208. }