class MovableView { mouseDown = false; mouseDownPos = null; // move starts in dragableUi, // movable in movableUi, // the pos of posUi is set. constructor(dragableUi, posUi, funcOnMove) { let movableUi = document.getElementById("move-handle-wrapper"); dragableUi.addEventListener("mousedown", (event)=>{ if (event.which == 1 && event.currentTarget == event.target) { this.mouseDown = true; this.mouseDownPos = {x: event.clientX, y:event.clientY}; movableUi.style.display="inherit"; } }); movableUi.addEventListener("mouseup", (event)=>{ if (this.mouseDown){ dragableUi.style.cursor = ""; event.stopPropagation(); event.preventDefault(); this.mouseDown = false; movableUi.style.display="none"; } }); movableUi.addEventListener("mousemove", (event)=>{ if (this.mouseDown){ let posDelta = { x: event.clientX - this.mouseDownPos.x, y: event.clientY - this.mouseDownPos.y }; dragableUi.style.cursor = "move"; this.mouseDownPos = {x: event.clientX, y:event.clientY}; let left = posUi.offsetLeft; let top = posUi.offsetTop; posUi.style.left = Math.max(0, (left + posDelta.x)) + 'px'; posUi.style.top = Math.max(0, (top + posDelta.y)) + 'px'; if (funcOnMove) funcOnMove(); } }); } } class PopupDialog extends MovableView { constructor(ui) { super(ui.querySelector("#header"), ui.querySelector("#view")); this.ui = ui; //wrapper this.viewUi = this.ui.querySelector("#view"); this.headerUi = this.ui.querySelector("#header"); this.titleUi = this.ui.querySelector("#title"); this.ui.onclick = ()=>{ this.hide(); }; this.ui.addEventListener("keydown", (event)=>{ if (event.key == 'Escape'){ this.hide(); event.preventDefault(); } event.stopPropagation(); }); this.viewUi.onclick = function(event){ //event.preventDefault(); event.stopPropagation(); }; this.titleUi.onclick = function(event){ //event.preventDefault(); event.stopPropagation(); }; this.titleUi.addEventListener("mousedown", (event)=>{ //event.preventDefault(); event.stopPropagation(); }); this.titleUi.addEventListener("contextmenu", (event)=>{ event.stopPropagation(); }) // this.viewUi.addEventListener("contextmenu", (e)=>{ // e.stopPropagation(); // e.preventDefault(); // }); // this.ui.querySelector("#info-view").onclick = function(event){ // event.preventDefault(); // event.stopPropagation(); // }; this.ui.querySelector("#btn-exit").onclick = (event)=>{ this.hide(); } this.maximizeButton = this.ui.querySelector("#btn-maximize") if (this.maximizeButton) { this.maximizeButton.onclick = (event)=>{ let v = this.viewUi; v.style.top = "0%"; v.style.left = "0%"; v.style.width = "100%"; v.style.height = "100%"; v.style["z-index"] = 5; event.currentTarget.style.display = 'none'; this.ui.querySelector("#btn-restore").style.display = "inherit"; }; } this.restoreButton = this.ui.querySelector("#btn-restore"); if (this.restoreButton) { this.restoreButton.onclick = (event)=>{ let v = this.viewUi; v.style.top = "20%"; v.style.left = "20%"; v.style.width = "60%"; v.style.height = "60%"; event.currentTarget.style.display = 'none'; this.ui.querySelector("#btn-maximize").style.display = "inherit"; }; } } hide(msg) { this.ui.style.display = 'none'; if (this.onExit) { this.onExit(msg); } } show(onexit) { this.ui.style.display = 'inherit'; this.onExit = onexit; //this.ui.focus(); } } export {PopupDialog, MovableView}