mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Add CSS to apply label show/hide settings to QRs in context menus Add provision for QR set applied to one of its own buttons as "burger" menu
108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
import { SubMenu } from './SubMenu.js';
|
|
|
|
export class MenuItem {
|
|
/**@type {string}*/ icon;
|
|
/**@type {boolean}*/ showLabel;
|
|
/**@type {string}*/ label;
|
|
/**@type {string}*/ title;
|
|
/**@type {object}*/ value;
|
|
/**@type {function}*/ callback;
|
|
/**@type {MenuItem[]}*/ childList = [];
|
|
/**@type {SubMenu}*/ subMenu;
|
|
|
|
/**@type {HTMLElement}*/ root;
|
|
|
|
/**@type {function}*/ onExpand;
|
|
|
|
|
|
|
|
|
|
/**
|
|
*
|
|
* @param {?string} icon
|
|
* @param {?boolean} showLabel
|
|
* @param {string} label
|
|
* @param {?string} title Tooltip
|
|
* @param {object} value
|
|
* @param {function} callback
|
|
* @param {MenuItem[]} children
|
|
*/
|
|
constructor(icon, showLabel, label, title, value, callback, children = []) {
|
|
this.icon = icon;
|
|
this.showLabel = showLabel;
|
|
this.label = label;
|
|
this.title = title;
|
|
this.value = value;
|
|
this.callback = callback;
|
|
this.childList = children;
|
|
}
|
|
|
|
|
|
render() {
|
|
if (!this.root) {
|
|
const item = document.createElement('li'); {
|
|
this.root = item;
|
|
item.classList.add('list-group-item');
|
|
item.classList.add('ctx-item');
|
|
|
|
// if a title/tooltip is set, add it, otherwise use the QR content
|
|
// same as for the main QR list
|
|
item.title = this.title || this.value;
|
|
|
|
if (this.callback) {
|
|
item.addEventListener('click', (evt) => this.callback(evt, this));
|
|
}
|
|
const icon = document.createElement('div'); {
|
|
icon.classList.add('qr--button-icon');
|
|
icon.classList.add('fa-solid');
|
|
if (!this.icon) icon.classList.add('qr--hidden');
|
|
else icon.classList.add(this.icon);
|
|
item.append(icon);
|
|
}
|
|
const lbl = document.createElement('div'); {
|
|
lbl.classList.add('qr--button-label');
|
|
if (this.icon && !this.showLabel) lbl.classList.add('qr--hidden');
|
|
lbl.textContent = this.label;
|
|
item.append(lbl);
|
|
}
|
|
if (this.childList.length > 0) {
|
|
item.classList.add('ctx-has-children');
|
|
const sub = new SubMenu(this.childList);
|
|
this.subMenu = sub;
|
|
const trigger = document.createElement('div'); {
|
|
trigger.classList.add('ctx-expander');
|
|
trigger.textContent = '⋮';
|
|
trigger.addEventListener('click', (evt) => {
|
|
evt.stopPropagation();
|
|
this.toggle();
|
|
});
|
|
item.append(trigger);
|
|
}
|
|
item.addEventListener('mouseover', () => sub.show(item));
|
|
item.addEventListener('mouseleave', () => sub.hide());
|
|
|
|
}
|
|
}
|
|
}
|
|
return this.root;
|
|
}
|
|
|
|
|
|
expand() {
|
|
this.subMenu?.show(this.root);
|
|
if (this.onExpand) {
|
|
this.onExpand();
|
|
}
|
|
}
|
|
collapse() {
|
|
this.subMenu?.hide();
|
|
}
|
|
toggle() {
|
|
if (this.subMenu.isActive) {
|
|
this.expand();
|
|
} else {
|
|
this.collapse();
|
|
}
|
|
}
|
|
}
|