scratch extesion: input by rssaromeo

none

  1. // ==UserScript==
  2. // @name scratch extesion: input by rssaromeo
  3. // @version 3
  4. // @description none
  5. // @run-at document-start
  6. // @author rssaromeo
  7. // @license GPLv3
  8. // @tag lib
  9. // @match *://*/*
  10. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAxQTFRFAAAAGO3tDoeH////Ea+F+gAAAAR0Uk5TAP///7MtQIgAAAFySURBVHicjZMxbsMwDEXFwXOX+jQuUPcENVDrlPKgDp2jS/QUWrp7cPk/KUcpUiBCYEfPIr+kT0rAGGd9HBv+Ch7DQrznBrjAlwDIGmzUYkAjZMVnxABErgFJBDpjEg3QnyDCVRJiBBquUouGKYjIMEwFWZICWREBoNNaRFMggmDPexZNEYODYzs2BW9rAyEBMKeDWpJYTgd7rgq4iyswEQfHtouJONCsQhF5/5q+aw8+PqcxQeYiVJU1vzwTFIlUjT/haaOMA1XinQOY6sIbVl0HmiiFHoRovl3BOOUGuNG205AaaOMf4Ize3QWn++lBMM7DwnPgZTsdFp5D1keB+vDKk4ZIs6MbE4K7H906A3rJakMPLnfAHDugznU5zew/oLaCOZO0krKBkroFl62VpV8IqrDLqiIZoOsolLZOW0xi8ev07Eprj3H2mFqsgfQ7l+js7DlmSbQOXQnZiK9d355GWavHdrRw2/v0T8K5hAvCLxHq4ydmN9O+AAAAAElFTkSuQmCC
  11. // @grant unsafeWindow
  12. // @namespace https://greasyfork.org/users/1184528
  13. // ==/UserScript==
  14.  
  15. // fix +=+up=up -> + in list
  16.  
  17. ;(async () => {
  18. await loadlib("libloader").waitforlib("scratchextesnsionmanager")
  19. const {
  20. newext,
  21. newmenu,
  22. newblock,
  23. bt,
  24. inp,
  25. gettarget,
  26. totype,
  27. scratch_math,
  28. projectid,
  29. canvas,
  30. scratchvar,
  31. scratchlist,
  32. } = loadlib("scratchextesnsionmanager")
  33. var a = loadlib("newallfuncs")
  34. var vm
  35. loadlib("libloader")
  36. .waitforlib("scratch")
  37. .then(() => (vm = loadlib("scratch").vm))
  38.  
  39. var mousestate = {
  40. left: false,
  41. center: false,
  42. right: false,
  43. }
  44.  
  45. newext(
  46. "input",
  47. "rssaromeo",
  48. class {
  49. getmouse({ button }) {
  50. button = totype(button, "string", 1)
  51. if (button == "any")
  52. return Object.values(mousestate).includes(true)
  53. if (mousestate?.[button] !== undefined)
  54. return mousestate[button]
  55. else return false
  56. }
  57. press({ key }) {
  58. if (key == " ") key = "space"
  59. if (/^[a-z]$/.test(key)) key = key.toUpperCase()
  60. var index =
  61. vm.runtime.ioDevices.keyboard._keysPressed.indexOf(key)
  62. if (index !== -1) {
  63. vm.runtime.ioDevices.keyboard._keysPressed.splice(index, 1)
  64. }
  65. vm.runtime.ioDevices.keyboard._keysPressed.push(key)
  66. }
  67. unpress({ key }) {
  68. key = totype(key, "string")
  69. if (key == " ") key = "space"
  70. if (/^[a-z]$/.test(key)) key = key.toUpperCase()
  71. var index =
  72. vm.runtime.ioDevices.keyboard._keysPressed.indexOf(key)
  73. if (index !== -1) {
  74. vm.runtime.ioDevices.keyboard._keysPressed.splice(index, 1)
  75. }
  76. }
  77. keypressed({ key }) {
  78. if (key == "any")
  79. return !!vm.runtime.ioDevices.keyboard._keysPressed.length
  80. return !!vm.runtime.ioDevices.keyboard._keysPressed.includes(
  81. key
  82. )
  83. }
  84. },
  85. [
  86. newblock(bt.bool, "getmouse", "mouse [button] pressed?", [
  87. newmenu("getmouse", {
  88. items: ["left", "right", "center", "any"],
  89. defaultValue: "right",
  90. }),
  91. ]),
  92. newblock(bt.cmd, "press", "press [key]", [
  93. newmenu("fullkeylist", {
  94. defaultValue: "escape",
  95. }),
  96. ]),
  97. newblock(bt.cmd, "unpress", "unpress [key]", [
  98. newmenu("fullkeylist", {
  99. defaultValue: "escape",
  100. }),
  101. ]),
  102. newblock(bt.bool, "keypressed", "key [key] pressed?", [
  103. newmenu("fullkeylistandany", {
  104. defaultValue: "any",
  105. }),
  106. ]),
  107. ],
  108. "12B3B3",
  109. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAxQTFRFAAAAGO3tDoeH////Ea+F+gAAAAR0Uk5TAP///7MtQIgAAAFySURBVHicjZMxbsMwDEXFwXOX+jQuUPcENVDrlPKgDp2jS/QUWrp7cPk/KUcpUiBCYEfPIr+kT0rAGGd9HBv+Ch7DQrznBrjAlwDIGmzUYkAjZMVnxABErgFJBDpjEg3QnyDCVRJiBBquUouGKYjIMEwFWZICWREBoNNaRFMggmDPexZNEYODYzs2BW9rAyEBMKeDWpJYTgd7rgq4iyswEQfHtouJONCsQhF5/5q+aw8+PqcxQeYiVJU1vzwTFIlUjT/haaOMA1XinQOY6sIbVl0HmiiFHoRovl3BOOUGuNG205AaaOMf4Ize3QWn++lBMM7DwnPgZTsdFp5D1keB+vDKk4ZIs6MbE4K7H906A3rJakMPLnfAHDugznU5zew/oLaCOZO0krKBkroFl62VpV8IqrDLqiIZoOsolLZOW0xi8ev07Eprj3H2mFqsgfQ7l+js7DlmSbQOXQnZiK9d355GWavHdrRw2/v0T8K5hAvCLxHq4ydmN9O+AAAAAElFTkSuQmCC"
  110. )
  111. await loadlib("libloader").waitforlib("scratch")
  112. await a.waituntil(canvas)
  113. // unsafeWindow.vm = loadlib("scratch").vm
  114. function fkey(key) {
  115. if (key == " ") key = "space"
  116. key = key.replace(/arrow(up|down|left|right)/i, "$1 arrow")
  117. if (/^[a-z]$/.test(key)) key = key.toUpperCase()
  118. else key = key.toLowerCase()
  119. return key
  120. }
  121. // setInterval(() => {
  122. function isinselfmenu() {
  123. if (document.querySelector(".blocklyDropDownArrow.arrowTop")) {
  124. var rect = document
  125. .querySelector(".blocklyDropDownArrow.arrowTop")
  126. .getBoundingClientRect()
  127. var arr = document.elementsFromPoint(rect.x, rect.y - 20)
  128. } else if (
  129. document.querySelector(".blocklyDropDownArrow.arrowBottom")
  130. ) {
  131. var rect = document
  132. .querySelector(".blocklyDropDownArrow.arrowBottom")
  133. .getBoundingClientRect()
  134. var arr = document.elementsFromPoint(rect.x, rect.y + 20)
  135. } else return false
  136.  
  137. return arr
  138. .filter((e) => e.tagName.toLowerCase() == "path")
  139. .map((e) => e.parentElement.dataset.id)
  140. .join("|")
  141. .includes("inputcreatedbyrssaromeo")
  142. }
  143. window.onkeydown = (e) => {
  144. // log(e.target)
  145. if (e.target == document.querySelector(".u-dropdown-searchbar")) {
  146. if (!isinselfmenu()) return
  147. e.stopImmediatePropagation()
  148. e.stopPropagation()
  149. e.preventDefault()
  150. return
  151. }
  152. if (e.target !== document.body) return
  153. var key = fkey(e.key)
  154. if (key.length == 1) return
  155. e.preventDefault()
  156. var index =
  157. vm.runtime.ioDevices.keyboard._keysPressed.indexOf(key)
  158. if (index !== -1) {
  159. vm.runtime.ioDevices.keyboard._keysPressed.splice(index, 1)
  160. }
  161. vm.runtime.ioDevices.keyboard._keysPressed.push(key)
  162. }
  163. window.onkeyup = (e) => {
  164. if (e.target == document.querySelector(".u-dropdown-searchbar")) {
  165. if (!isinselfmenu()) return
  166. e.stopImmediatePropagation()
  167. e.stopPropagation()
  168. e.preventDefault()
  169. log(e.target, e.key, fkey(e.key))
  170. e.target.value = fkey(e.key)
  171. e.target.dispatchEvent(
  172. new Event("input", {
  173. bubbles: true,
  174. cancelable: true,
  175. })
  176. )
  177. e.target.dispatchEvent(
  178. new KeyboardEvent("keydown", {
  179. key: "Enter",
  180. code: "Enter",
  181. keyCode: 13,
  182. bubbles: true,
  183. })
  184. )
  185. // --editorTheme3-hoveredItem: #224b4b;
  186. return
  187. }
  188. e.preventDefault()
  189. var key = fkey(e.key)
  190. var index =
  191. vm.runtime.ioDevices.keyboard._keysPressed.indexOf(key)
  192. if (index !== -1) {
  193. vm.runtime.ioDevices.keyboard._keysPressed.splice(index, 1)
  194. }
  195. }
  196. window.onblur = () =>
  197. (vm.runtime.ioDevices.keyboard._keysPressed = [])
  198. canvas().onmousedown = canvas().onmouseup = function (e) {
  199. e.preventDefault()
  200. switch (e.buttons) {
  201. case 0:
  202. mousestate = {
  203. left: false,
  204. center: false,
  205. right: false,
  206. }
  207. break
  208. case 1:
  209. mousestate = {
  210. left: true,
  211. center: false,
  212. right: false,
  213. }
  214. break
  215. case 2:
  216. mousestate = {
  217. left: false,
  218. center: false,
  219. right: true,
  220. }
  221. break
  222. case 3:
  223. mousestate = {
  224. left: true,
  225. center: false,
  226. right: true,
  227. }
  228. break
  229. case 4:
  230. mousestate = {
  231. left: false,
  232. center: true,
  233. right: false,
  234. }
  235. break
  236. case 5:
  237. mousestate = {
  238. left: true,
  239. center: true,
  240. right: false,
  241. }
  242. break
  243. case 6:
  244. mousestate = {
  245. left: false,
  246. center: true,
  247. right: true,
  248. }
  249. break
  250. case 7:
  251. mousestate = {
  252. left: true,
  253. center: true,
  254. right: true,
  255. }
  256. break
  257. }
  258. }
  259. // })
  260. })()