cables_dev/cables_ui/src/ui/elements/contextmenu.js
export default class ContextMenu
{
constructor()
{
this._element = null;
this._modalBg = null;
this._visible = false;
}
close()
{
if (this._element) this._element.remove();
if (this._modalBg) this._modalBg.remove();
this._element = null;
this._modalBg = null;
this._visible = false;
}
isVisible()
{
return this._visible;
}
show(obj, parent)
{
if (!this._modalBg)
{
this._modalBg = document.createElement("div");
this._modalBg.classList.add("cables_contextmenu_modal");
this._modalBg.addEventListener("click",
function ()
{
CABLES.contextMenu.close();
});
document.body.appendChild(this._modalBg);
}
if (!this._element)
{
this._element = document.createElement("ul");
this._element.classList.add("cables_contextmenu");
this._element.classList.add("cablesCssUi");
document.body.appendChild(this._element);
}
const rect = parent.getBoundingClientRect();
if (rect.x == 0 && rect.y == 0 && rect.width == 0 && rect.height == 0) return;
if (rect.left > window.innerWidth - 200)
{
this._element.style.right = window.innerWidth - rect.left + "px";
this._element.style.left = "initial";
}
else
{
this._element.style.right = "initial";
this._element.style.left = rect.left + 5 + "px";
}
this._element.style.top = rect.top + 5 + "px";
if (obj && obj.items && obj.items.length > 0)
{
for (let i = 0; i < obj.items.length; i++)
{
const item = document.createElement("li");
item.classList.add("cm_item");
item.innerText = obj.items[i].title;
if (obj.items[i].iconClass)
{
const icon = document.createElement("span");
icon.classList.add("cm_icon");
const classes = obj.items[i].iconClass.split(" ");
for (const ii in classes) icon.classList.add(classes[ii]);
icon.style.float = "left";
item.appendChild(icon);
}
this._element.appendChild(item);
this._visible = true;
item.addEventListener("click", function ()
{
if (obj.refresh)
{
setTimeout(function ()
{
CABLES.contextMenu.close();
obj.refresh(parent);
}, 100);
}
else CABLES.contextMenu.close();
setTimeout(this.func.bind(this), 20);
}.bind(obj.items[i]));
}
}
}
}