mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
164 lines
5.9 KiB
JavaScript
164 lines
5.9 KiB
JavaScript
import { animation_duration } from '../../../../../script.js';
|
|
import { dragElement } from '../../../../RossAscends-mods.js';
|
|
import { loadMovingUIState } from '../../../../power-user.js';
|
|
import { QuickReplySettings } from '../QuickReplySettings.js';
|
|
|
|
export class ButtonUi {
|
|
/** @type {QuickReplySettings} */ settings;
|
|
|
|
/**@type {HTMLElement}*/ dom;
|
|
/**@type {HTMLElement}*/ popoutDom;
|
|
|
|
|
|
|
|
|
|
constructor(/**@type {QuickReplySettings}*/settings) {
|
|
this.settings = settings;
|
|
}
|
|
|
|
|
|
|
|
|
|
render() {
|
|
if (this.settings.isPopout) {
|
|
return this.renderPopout();
|
|
}
|
|
return this.renderBar();
|
|
}
|
|
unrender() {
|
|
this.dom?.remove();
|
|
this.dom = null;
|
|
this.popoutDom?.remove();
|
|
this.popoutDom = null;
|
|
}
|
|
|
|
show() {
|
|
if (!this.settings.isEnabled) return;
|
|
if (this.settings.isPopout) {
|
|
document.body.append(this.render());
|
|
loadMovingUIState();
|
|
$(this.render()).fadeIn(animation_duration);
|
|
dragElement($(this.render()));
|
|
} else {
|
|
const sendForm = document.querySelector('#send_form');
|
|
if (sendForm.children.length > 0) {
|
|
sendForm.children[0].insertAdjacentElement('beforebegin', this.render());
|
|
} else {
|
|
sendForm.append(this.render());
|
|
}
|
|
}
|
|
}
|
|
hide() {
|
|
this.unrender();
|
|
}
|
|
refresh() {
|
|
this.hide();
|
|
this.show();
|
|
}
|
|
|
|
|
|
|
|
|
|
renderBar() {
|
|
if (!this.dom) {
|
|
let buttonHolder;
|
|
const root = document.createElement('div'); {
|
|
this.dom = root;
|
|
buttonHolder = root;
|
|
root.id = 'qr--bar';
|
|
root.classList.add('flex-container');
|
|
root.classList.add('flexGap5');
|
|
if (this.settings.showPopoutButton) {
|
|
root.classList.add('popoutVisible');
|
|
const popout = document.createElement('div'); {
|
|
popout.id = 'qr--popoutTrigger';
|
|
popout.classList.add('menu_button');
|
|
popout.classList.add('fa-solid');
|
|
popout.classList.add('fa-window-restore');
|
|
popout.addEventListener('click', ()=>{
|
|
this.settings.isPopout = true;
|
|
this.refresh();
|
|
this.settings.save();
|
|
});
|
|
root.append(popout);
|
|
}
|
|
}
|
|
if (this.settings.isCombined) {
|
|
const buttons = document.createElement('div'); {
|
|
buttonHolder = buttons;
|
|
buttons.classList.add('qr--buttons');
|
|
root.append(buttons);
|
|
}
|
|
}
|
|
[...this.settings.config.setList, ...(this.settings.chatConfig?.setList ?? [])]
|
|
.filter(link=>link.isVisible)
|
|
.forEach(link=>buttonHolder.append(link.set.render()))
|
|
;
|
|
}
|
|
}
|
|
return this.dom;
|
|
}
|
|
|
|
|
|
|
|
|
|
renderPopout() {
|
|
if (!this.popoutDom) {
|
|
let buttonHolder;
|
|
const root = document.createElement('div'); {
|
|
this.popoutDom = root;
|
|
root.id = 'qr--popout';
|
|
root.classList.add('qr--popout');
|
|
root.classList.add('draggable');
|
|
const head = document.createElement('div'); {
|
|
head.classList.add('qr--header');
|
|
root.append(head);
|
|
const controls = document.createElement('div'); {
|
|
controls.classList.add('qr--controls');
|
|
controls.classList.add('panelControlBar');
|
|
controls.classList.add('flex-container');
|
|
const drag = document.createElement('div'); {
|
|
drag.id = 'qr--popoutheader';
|
|
drag.classList.add('fa-solid');
|
|
drag.classList.add('fa-grip');
|
|
drag.classList.add('drag-grabber');
|
|
drag.classList.add('hoverglow');
|
|
controls.append(drag);
|
|
}
|
|
const close = document.createElement('div'); {
|
|
close.classList.add('qr--close');
|
|
close.classList.add('fa-solid');
|
|
close.classList.add('fa-circle-xmark');
|
|
close.classList.add('hoverglow');
|
|
close.addEventListener('click', ()=>{
|
|
this.settings.isPopout = false;
|
|
this.refresh();
|
|
this.settings.save();
|
|
});
|
|
controls.append(close);
|
|
}
|
|
head.append(controls);
|
|
}
|
|
}
|
|
const body = document.createElement('div'); {
|
|
buttonHolder = body;
|
|
body.classList.add('qr--body');
|
|
if (this.settings.isCombined) {
|
|
const buttons = document.createElement('div'); {
|
|
buttonHolder = buttons;
|
|
buttons.classList.add('qr--buttons');
|
|
body.append(buttons);
|
|
}
|
|
}
|
|
[...this.settings.config.setList, ...(this.settings.chatConfig?.setList ?? [])]
|
|
.filter(link=>link.isVisible)
|
|
.forEach(link=>buttonHolder.append(link.set.render()))
|
|
;
|
|
root.append(body);
|
|
}
|
|
}
|
|
}
|
|
return this.popoutDom;
|
|
}
|
|
}
|