class Contextmenu { static currentmenu; name; buttons; div; static setup() { Contextmenu.currentmenu = ""; document.addEventListener("click", event => { if (Contextmenu.currentmenu == "") { return; } if (!Contextmenu.currentmenu.contains(event.target)) { Contextmenu.currentmenu.remove(); Contextmenu.currentmenu = ""; } }); } constructor(name) { this.name = name; this.buttons = []; } addbutton(text, onclick, img = null, shown = _ => true, enabled = _ => true) { this.buttons.push([text, onclick, img, shown, enabled, "button"]); return {}; } addsubmenu(text, onclick, img = null, shown = _ => true, enabled = _ => true) { this.buttons.push([text, onclick, img, shown, enabled, "submenu"]); return {}; } makemenu(x, y, addinfo, other) { const div = document.createElement("div"); div.classList.add("contextmenu", "flexttb"); let visibleButtons = 0; for (const thing of this.buttons) { if (!thing[3].bind(addinfo)(other)) continue; visibleButtons++; const intext = document.createElement("button"); intext.disabled = !thing[4].bind(addinfo)(other); intext.classList.add("contextbutton"); intext.textContent = thing[0]; console.log(thing); if (thing[5] === "button" || thing[5] === "submenu") { intext.onclick = thing[1].bind(addinfo, other); } div.appendChild(intext); } if (visibleButtons == 0) return; if (Contextmenu.currentmenu != "") { Contextmenu.currentmenu.remove(); } div.style.top = y + "px"; div.style.left = x + "px"; document.body.appendChild(div); Contextmenu.keepOnScreen(div); console.log(div); Contextmenu.currentmenu = div; return this.div; } bindContextmenu(obj, addinfo, other) { const func = event => { event.preventDefault(); event.stopImmediatePropagation(); this.makemenu(event.clientX, event.clientY, addinfo, other); }; obj.addEventListener("contextmenu", func); return func; } static keepOnScreen(obj) { const html = document.documentElement.getBoundingClientRect(); const docheight = html.height; const docwidth = html.width; const box = obj.getBoundingClientRect(); console.log(box, docheight, docwidth); if (box.right > docwidth) { console.log("test"); obj.style.left = docwidth - box.width + "px"; } if (box.bottom > docheight) { obj.style.top = docheight - box.height + "px"; } } } Contextmenu.setup(); export { Contextmenu };