class Contextmenu{
static currentmenu:HTMLElement|"";
name:string;
buttons:[string,(this:x,arg:y,e:MouseEvent)=>void,string|null,(this:x,arg:y)=>boolean,(this:x,arg:y)=>boolean,string][];
div:HTMLDivElement;
static setup(){
Contextmenu.currentmenu="";
document.addEventListener("click", event=>{
if(Contextmenu.currentmenu===""){
return;
}
if(!Contextmenu.currentmenu.contains(event.target as Node)){
Contextmenu.currentmenu.remove();
Contextmenu.currentmenu="";
}
});
}
constructor(name:string){
this.name=name;
this.buttons=[];
}
addbutton(text:string,onclick:(this:x,arg:y,e:MouseEvent)=>void,img:null|string=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){
this.buttons.push([text,onclick,img,shown,enabled,"button"]);
return{};
}
addsubmenu(text:string,onclick:(this:x,arg:y,e:MouseEvent)=>void,img=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){
this.buttons.push([text,onclick,img,shown,enabled,"submenu"]);
return{};
}
private makemenu(x:number,y:number,addinfo:x,other:y){
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:HTMLElement,addinfo:x,other:y){
const func=event=>{
event.preventDefault();
event.stopImmediatePropagation();
this.makemenu(event.clientX,event.clientY,addinfo,other);
};
obj.addEventListener("contextmenu", func);
return func;
}
static keepOnScreen(obj:HTMLElement){
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};