custom-electronjs-titlebar
Version:
This is a library for electron.js to allow you to add custom titlebars!
566 lines (564 loc) • 19.6 kB
JavaScript
"use strict";
/* ---------------------------------------------------------------------------------------------
* Copyright (c) AlexTorresDev. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*-------------------------------------------------------------------------------------------- */
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CETMenu = exports.Direction = void 0;
const dom_1 = require("../../base/common/dom");
const lifecycle_1 = require("../../base/common/lifecycle");
const item_1 = require("./item");
const keyCodes_1 = require("../../base/common/keyCodes");
const keyboardEvent_1 = require("../../base/browser/keyboardEvent");
const event_1 = require("../../base/common/event");
const separator_1 = require("./separator");
const submenu_1 = require("./submenu");
const platform_1 = require("../../base/common/platform");
var Direction;
(function (Direction) {
Direction[Direction["Right"] = 0] = "Right";
Direction[Direction["Left"] = 1] = "Left";
})(_get__("Direction") || (exports.Direction = _assign__("Direction", {})));
class CETMenu extends _get__("lifecycle_1").Disposable {
constructor(menuContainer, menuIcons, parentOptions, currentOptions, closeSubMenu = () => {}) {
super();
this.menuContainer = menuContainer;
this.menuIcons = menuIcons;
this.parentOptions = parentOptions;
this.currentOptions = currentOptions;
this.closeSubMenu = closeSubMenu;
this.focusedItem = undefined;
this.items = [];
this.triggerKeys = {
keys: [3 /* KeyCode.Enter */, 10 /* KeyCode.Space */],
keyDown: true
};
this.parentData = {
parent: this
};
this._onDidCancel = this._register(new (_get__("event_1").Emitter)());
this.mnemonics = new Map();
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.KEY_DOWN, e => {
const event = new (_get__("keyboardEvent_1").StandardKeyboardEvent)(e);
let eventHandled = true;
if (event.equals(16 /* KeyCode.UpArrow */)) {
this.focusPrevious();
} else if (event.equals(18 /* KeyCode.DownArrow */)) {
this.focusNext();
} else if (event.equals(9 /* KeyCode.Escape */)) {
this.cancel();
} else if (this.isTriggerKeyEvent(event)) {
// Staying out of the else branch even if not triggered
if (this.triggerKeys && this.triggerKeys.keyDown) {
this.doTrigger(event);
}
} else {
eventHandled = false;
}
if (eventHandled) {
event.preventDefault();
event.stopPropagation();
}
}));
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.KEY_UP, e => {
const event = new (_get__("keyboardEvent_1").StandardKeyboardEvent)(e);
// Run action on Enter/Space
if (this.isTriggerKeyEvent(event)) {
if (this.triggerKeys && !this.triggerKeys.keyDown) {
this.doTrigger(event);
}
event.preventDefault();
event.stopPropagation();
// Recompute focused item
} else if (event.equals(2 /* KeyCode.Tab */) || event.equals(1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */)) {
this.updateFocusedItem();
}
}));
if (this.currentOptions.enableMnemonics) {
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.KEY_DOWN, e => {
const key = _get__("keyCodes_1").KeyCodeUtils.fromString(e.key);
if (this.mnemonics.has(key)) {
const items = this.mnemonics.get(key);
if (items.length === 1) {
if (items[0] instanceof _get__("submenu_1").CETSubMenu) {
this.focusItemByElement(items[0].element);
}
items[0].onClick(e);
}
if (items.length > 1) {
const item = items.shift();
if (item) {
this.focusItemByElement(item.element);
items.push(item);
}
this.mnemonics.set(key, items);
}
}
}));
}
if (_get__("platform_1").isLinux) {
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.KEY_DOWN, e => {
const event = new (_get__("keyboardEvent_1").StandardKeyboardEvent)(e);
if (event.equals(14 /* KeyCode.Home */) || event.equals(11 /* KeyCode.PageUp */)) {
this.focusedItem = this.items.length - 1;
this.focusNext();
_get__("dom_1").EventHelper.stop(e, true);
} else if (event.equals(13 /* KeyCode.End */) || event.equals(12 /* KeyCode.PageDown */)) {
this.focusedItem = 0;
this.focusPrevious();
_get__("dom_1").EventHelper.stop(e, true);
}
}));
}
if (_get__("platform_1").isFreeBSD) {
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.KEY_DOWN, e => {
const event = new (_get__("keyboardEvent_1").StandardKeyboardEvent)(e);
if (event.equals(14 /* KeyCode.Home */) || event.equals(11 /* KeyCode.PageUp */)) {
this.focusedItem = this.items.length - 1;
this.focusNext();
_get__("dom_1").EventHelper.stop(e, true);
} else if (event.equals(13 /* KeyCode.End */) || event.equals(12 /* KeyCode.PageDown */)) {
this.focusedItem = 0;
this.focusPrevious();
_get__("dom_1").EventHelper.stop(e, true);
}
}));
}
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.MOUSE_OUT, e => {
const relatedTarget = e.relatedTarget;
if (!(0, _get__("dom_1").isAncestor)(relatedTarget, this.menuContainer)) {
this.focusedItem = undefined;
this.updateFocus();
e.stopPropagation();
}
}));
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.MOUSE_UP, e => {
// Absorb clicks in menu dead space https://github.com/Microsoft/vscode/issues/63575
_get__("dom_1").EventHelper.stop(e, true);
}));
this._register((0, _get__("dom_1").addDisposableListener)(this.menuContainer, _get__("dom_1").EventType.MOUSE_OVER, e => {
let target = e.target;
if (!target || !(0, _get__("dom_1").isAncestor)(target, this.menuContainer) || target === this.menuContainer) {
return;
}
while (target.parentElement !== this.menuContainer && target.parentElement !== null) {
target = target.parentElement;
}
if ((0, _get__("dom_1").hasClass)(target, 'cet-action-item')) {
const lastFocusedItem = this.focusedItem;
this.setFocusedItem(target);
if (lastFocusedItem !== this.focusedItem) {
this.updateFocus();
}
}
}));
if (this.currentOptions.ariaLabel) {
this.menuContainer.setAttribute('aria-label', this.currentOptions.ariaLabel);
}
}
trigger(index) {
if (index <= this.items.length && index >= 0) {
const item = this.items[index];
if (item instanceof _get__("submenu_1").CETSubMenu) {
this.focus(index);
}
}
}
createMenu(menuItems) {
if (!menuItems) return;
menuItems.forEach(menuItem => {
if (!menuItem) return;
const itemElement = (0, _get__("dom_1").$)('li.cet-action-item', {
role: 'presentation'
});
// Prevent native context menu on actions
this._register((0, _get__("dom_1").addDisposableListener)(itemElement, _get__("dom_1").EventType.CONTEXT_MENU, e => {
e.preventDefault();
e.stopPropagation();
}));
let item;
if (menuItem.type === 'separator') {
item = new (_get__("separator_1").CETSeparator)(menuItem, this.menuIcons, this.parentOptions, this.currentOptions);
} else if (menuItem.type === 'submenu' || menuItem.submenu) {
const submenuItems = menuItem.submenu.items;
item = new (_get__("submenu_1").CETSubMenu)(menuItem, this.menuIcons, submenuItems, this.parentData, this.parentOptions, this.currentOptions, this.closeSubMenu);
if (this.currentOptions.enableMnemonics) {
const mnemonic = item.mnemonic;
if (mnemonic && item.isEnabled()) {
let actionItems = [];
if (this.mnemonics.has(mnemonic)) {
actionItems = this.mnemonics.get(mnemonic);
}
actionItems.push(item);
this.mnemonics.set(mnemonic, actionItems);
}
}
} else {
item = new (_get__("item_1").CETMenuItem)(menuItem, this.menuIcons, this.parentOptions, this.currentOptions, this.items, this.closeSubMenu);
if (this.currentOptions.enableMnemonics) {
const mnemonic = item.mnemonic;
if (mnemonic && item.isEnabled()) {
let actionItems = [];
if (this.mnemonics.has(mnemonic)) {
actionItems = this.mnemonics.get(mnemonic);
}
actionItems.push(item);
this.mnemonics.set(mnemonic, actionItems);
}
}
}
item.render(itemElement);
this.items.push(item);
(0, _get__("dom_1").append)(this.menuContainer, itemElement);
});
}
isTriggerKeyEvent(event) {
let ret = false;
if (this.triggerKeys) {
this.triggerKeys.keys.forEach(keyCode => {
ret = ret || event.equals(keyCode);
});
}
return ret;
}
updateFocusedItem() {
for (let i = 0; i < this.menuContainer.children.length; i++) {
const elem = this.menuContainer.children[i];
if ((0, _get__("dom_1").isAncestor)(document.activeElement, elem)) {
this.focusedItem = i;
break;
}
}
}
focus(arg) {
let selectFirst = false;
let index;
if (arg === undefined) {
selectFirst = true;
} else if (typeof arg === 'number') {
index = arg;
} else if (typeof arg === 'boolean') {
selectFirst = arg;
}
if (selectFirst && typeof this.focusedItem === 'undefined') {
// Focus the first enabled item
this.focusedItem = this.items.length - 1;
this.focusNext();
} else {
if (index !== undefined) {
this.focusedItem = index;
}
this.updateFocus();
}
}
focusNext() {
if (typeof this.focusedItem === 'undefined') {
this.focusedItem = this.items.length - 1;
}
const startIndex = this.focusedItem;
let item;
do {
this.focusedItem = (this.focusedItem + 1) % this.items.length;
item = this.items[this.focusedItem];
} while (this.focusedItem !== startIndex && !item.isEnabled() || item.isSeparator());
if (this.focusedItem === startIndex && !item.isEnabled() || item.isSeparator()) {
this.focusedItem = undefined;
}
this.updateFocus();
}
focusPrevious() {
if (typeof this.focusedItem === 'undefined') {
this.focusedItem = 0;
}
const startIndex = this.focusedItem;
let item;
do {
this.focusedItem = this.focusedItem - 1;
if (this.focusedItem < 0) {
this.focusedItem = this.items.length - 1;
}
item = this.items[this.focusedItem];
} while (this.focusedItem !== startIndex && !item.isEnabled() || item.isSeparator());
if (this.focusedItem === startIndex && !item.isEnabled() || item.isSeparator()) {
this.focusedItem = undefined;
}
this.updateFocus();
}
updateFocus() {
if (typeof this.focusedItem === 'undefined') {
this.menuContainer.focus();
}
for (let i = 0; i < this.items.length; i++) {
const item = this.items[i];
if (i === this.focusedItem) {
if (item.isEnabled()) {
item.focus();
} else {
this.menuContainer.focus();
}
} else {
item.blur();
}
}
}
doTrigger(event) {
if (typeof this.focusedItem === 'undefined') {
return; // nothing to focus
}
// trigger action
const item = this.items[this.focusedItem];
if (item instanceof _get__("item_1").CETMenuItem) {
item.onClick(event);
}
}
cancel() {
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur(); // remove focus from focused action
}
this._onDidCancel.fire();
}
focusItemByElement(element) {
const lastFocusedItem = this.focusedItem;
if (element) this.setFocusedItem(element);
if (lastFocusedItem !== this.focusedItem) {
this.updateFocus();
}
}
setFocusedItem(element) {
this.focusedItem = Array.prototype.findIndex.call(this.container.children, elem => elem === element);
}
applyStyle(style) {
const container = this.menuContainer;
if (style?.backgroundColor) {
let transparency = this.parentOptions?.menuTransparency;
if (transparency < 0) transparency = 0;
if (transparency > 1) transparency = 1;
const rgba = style.backgroundColor?.rgba;
container.style.backgroundColor = `rgb(${rgba.r} ${rgba.g} ${rgba.b} / ${1 - transparency})`;
}
if (this.items) {
this.items.forEach(item => {
if (item instanceof _get__("item_1").CETMenuItem || item instanceof _get__("separator_1").CETSeparator) {
item.updateStyle(style);
}
});
}
}
get container() {
return this.menuContainer;
}
get onDidCancel() {
return this._onDidCancel.event;
}
dispose() {
(0, _get__("lifecycle_1").dispose)(this.items);
this.items = [];
(0, _get__("dom_1").removeNode)(this.container);
super.dispose();
}
}
exports.CETMenu = _get__("CETMenu");
function _getGlobalObject() {
try {
if (!!global) {
return global;
}
} catch (e) {
try {
if (!!window) {
return window;
}
} catch (e) {
return this;
}
}
}
;
var _RewireModuleId__ = null;
function _getRewireModuleId__() {
if (_RewireModuleId__ === null) {
let globalVariable = _getGlobalObject();
if (!globalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__) {
globalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__ = 0;
}
_RewireModuleId__ = __$$GLOBAL_REWIRE_NEXT_MODULE_ID__++;
}
return _RewireModuleId__;
}
function _getRewireRegistry__() {
let theGlobalVariable = _getGlobalObject();
if (!theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__) {
theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = Object.create(null);
}
return theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__;
}
function _getRewiredData__() {
let moduleId = _getRewireModuleId__();
let registry = _getRewireRegistry__();
let rewireData = registry[moduleId];
if (!rewireData) {
registry[moduleId] = Object.create(null);
rewireData = registry[moduleId];
}
return rewireData;
}
(function registerResetAll() {
let theGlobalVariable = _getGlobalObject();
if (!theGlobalVariable['__rewire_reset_all__']) {
theGlobalVariable['__rewire_reset_all__'] = function () {
theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = Object.create(null);
};
}
})();
var INTENTIONAL_UNDEFINED = '__INTENTIONAL_UNDEFINED__';
let _RewireAPI__ = {};
(function () {
function addPropertyToAPIObject(name, value) {
Object.defineProperty(_RewireAPI__, name, {
value: value,
enumerable: false,
configurable: true
});
}
addPropertyToAPIObject('__get__', _get__);
addPropertyToAPIObject('__GetDependency__', _get__);
addPropertyToAPIObject('__Rewire__', _set__);
addPropertyToAPIObject('__set__', _set__);
addPropertyToAPIObject('__reset__', _reset__);
addPropertyToAPIObject('__ResetDependency__', _reset__);
addPropertyToAPIObject('__with__', _with__);
})();
function _get__(variableName) {
let rewireData = _getRewiredData__();
if (rewireData[variableName] === undefined) {
return _get_original__(variableName);
} else {
var value = rewireData[variableName];
if (value === INTENTIONAL_UNDEFINED) {
return undefined;
} else {
return value;
}
}
}
function _get_original__(variableName) {
switch (variableName) {
case "Direction":
return Direction;
case "event_1":
return event_1;
case "dom_1":
return dom_1;
case "keyboardEvent_1":
return keyboardEvent_1;
case "keyCodes_1":
return keyCodes_1;
case "submenu_1":
return submenu_1;
case "platform_1":
return platform_1;
case "separator_1":
return separator_1;
case "item_1":
return item_1;
case "lifecycle_1":
return lifecycle_1;
case "CETMenu":
return CETMenu;
}
return undefined;
}
function _assign__(variableName, value) {
let rewireData = _getRewiredData__();
if (rewireData[variableName] === undefined) {
return _set_original__(variableName, value);
} else {
return rewireData[variableName] = value;
}
}
function _set_original__(variableName, _value) {
switch (variableName) {
case "Direction":
return Direction = _value;
}
return undefined;
}
function _update_operation__(operation, variableName, prefix) {
var oldValue = _get__(variableName);
var newValue = operation === '++' ? oldValue + 1 : oldValue - 1;
_assign__(variableName, newValue);
return prefix ? newValue : oldValue;
}
function _set__(variableName, value) {
let rewireData = _getRewiredData__();
if (typeof variableName === 'object') {
Object.keys(variableName).forEach(function (name) {
rewireData[name] = variableName[name];
});
return function () {
Object.keys(variableName).forEach(function (name) {
_reset__(variableName);
});
};
} else {
if (value === undefined) {
rewireData[variableName] = INTENTIONAL_UNDEFINED;
} else {
rewireData[variableName] = value;
}
return function () {
_reset__(variableName);
};
}
}
function _reset__(variableName) {
let rewireData = _getRewiredData__();
delete rewireData[variableName];
if (Object.keys(rewireData).length == 0) {
delete _getRewireRegistry__()[_getRewireModuleId__];
}
;
}
function _with__(object) {
let rewireData = _getRewiredData__();
var rewiredVariableNames = Object.keys(object);
var previousValues = {};
function reset() {
rewiredVariableNames.forEach(function (variableName) {
rewireData[variableName] = previousValues[variableName];
});
}
return function (callback) {
rewiredVariableNames.forEach(function (variableName) {
previousValues[variableName] = rewireData[variableName];
rewireData[variableName] = object[variableName];
});
let result = callback();
if (!!result && typeof result.then == 'function') {
result.then(reset).catch(reset);
} else {
reset();
}
return result;
};
}
let _typeOfOriginalExport = typeof module.exports;
function addNonEnumerableProperty(name, value) {
Object.defineProperty(module.exports, name, {
value: value,
enumerable: false,
configurable: true
});
}
if ((_typeOfOriginalExport === 'object' || _typeOfOriginalExport === 'function') && Object.isExtensible(module.exports)) {
addNonEnumerableProperty('__get__', _get__);
addNonEnumerableProperty('__GetDependency__', _get__);
addNonEnumerableProperty('__Rewire__', _set__);
addNonEnumerableProperty('__set__', _set__);
addNonEnumerableProperty('__reset__', _reset__);
addNonEnumerableProperty('__ResetDependency__', _reset__);
addNonEnumerableProperty('__with__', _with__);
addNonEnumerableProperty('__RewireAPI__', _RewireAPI__);
}