mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Display generated bg in the bg block. Add ability to copy chat bg to system list.
This commit is contained in:
@ -293,7 +293,7 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#bg_menu_content {
|
.bg_list {
|
||||||
width: unset;
|
width: unset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3243,10 +3243,10 @@
|
|||||||
Auto-select
|
Auto-select
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 data-i18n="System Backgrounds" class="justifyCenter">
|
<h3 data-i18n="System Backgrounds" class="wide100p textAlignCenter">
|
||||||
System Backgrounds
|
System Backgrounds
|
||||||
</h3>
|
</h3>
|
||||||
<div id="bg_menu_content">
|
<div id="bg_menu_content" class="bg_list">
|
||||||
<form id="form_bg_download" class="bg_example no-border no-shadow" action="javascript:void(null);" method="post" enctype="multipart/form-data">
|
<form id="form_bg_download" class="bg_example no-border no-shadow" action="javascript:void(null);" method="post" enctype="multipart/form-data">
|
||||||
<label class="input-file">
|
<label class="input-file">
|
||||||
<input type="file" id="add_bg_button" name="avatar" accept="image/png, image/jpeg, image/jpg, image/gif, image/bmp">
|
<input type="file" id="add_bg_button" name="avatar" accept="image/png, image/jpeg, image/jpg, image/gif, image/bmp">
|
||||||
@ -3254,6 +3254,14 @@
|
|||||||
</label>
|
</label>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<h3 data-i18n="Chat Backgrounds" class="wide100p textAlignCenter">
|
||||||
|
Chat Backgrounds
|
||||||
|
</h3>
|
||||||
|
<div id="bg_chat_hint" class="wide100p textAlignCenter">
|
||||||
|
Chat backgrounds generated with the <code><i class="fa-solid fa-paintbrush"></i> Stable Diffusion</code> extension will appear here.
|
||||||
|
</div>
|
||||||
|
<div id="bg_custom_content" class="bg_list">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -3894,6 +3902,7 @@
|
|||||||
|
|
||||||
<div id="background_template" class="template_element">
|
<div id="background_template" class="template_element">
|
||||||
<div class="bg_example flex-container" bgfile="" class="bg_example_img" title="">
|
<div class="bg_example flex-container" bgfile="" class="bg_example_img" title="">
|
||||||
|
<div title="Copy to system backgrounds" class="bg_button bg_example_copy fa-solid fa-file-arrow-up"></div>
|
||||||
<div title="Rename background" class="bg_button bg_example_edit fa-solid fa-pencil"></div>
|
<div title="Rename background" class="bg_button bg_example_edit fa-solid fa-pencil"></div>
|
||||||
<div title="Lock" class="bg_button bg_example_lock fa-solid fa-lock"></div>
|
<div title="Lock" class="bg_button bg_example_lock fa-solid fa-lock"></div>
|
||||||
<div title="Unlock" class="bg_button bg_example_unlock fa-solid fa-lock-open"></div>
|
<div title="Unlock" class="bg_button bg_example_unlock fa-solid fa-lock-open"></div>
|
||||||
|
@ -7721,6 +7721,7 @@ jQuery(async function () {
|
|||||||
$("#rm_button_selected_ch").children("h2").text('');
|
$("#rm_button_selected_ch").children("h2").text('');
|
||||||
select_rm_characters();
|
select_rm_characters();
|
||||||
sendSystemMessage(system_message_types.WELCOME);
|
sendSystemMessage(system_message_types.WELCOME);
|
||||||
|
eventSource.emit(event_types.CHAT_CHANGED, getCurrentChatId());
|
||||||
} else {
|
} else {
|
||||||
toastr.info("Please stop the message generation first.");
|
toastr.info("Please stop the message generation first.");
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,24 @@ import { saveMetadataDebounced } from "./extensions.js";
|
|||||||
import { registerSlashCommand } from "./slash-commands.js";
|
import { registerSlashCommand } from "./slash-commands.js";
|
||||||
import { stringFormat } from "./utils.js";
|
import { stringFormat } from "./utils.js";
|
||||||
|
|
||||||
const METADATA_KEY = 'custom_background';
|
const BG_METADATA_KEY = 'custom_background';
|
||||||
|
const LIST_METADATA_KEY = 'chat_backgrounds';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} background
|
* Sets the background for the current chat and adds it to the list of custom backgrounds.
|
||||||
|
* @param {{url: string, path:string}} backgroundInfo
|
||||||
*/
|
*/
|
||||||
function forceSetBackground(background) {
|
function forceSetBackground(backgroundInfo) {
|
||||||
saveBackgroundMetadata(background);
|
saveBackgroundMetadata(backgroundInfo.url);
|
||||||
setCustomBackground();
|
setCustomBackground();
|
||||||
|
|
||||||
|
const list = chat_metadata[LIST_METADATA_KEY] || [];
|
||||||
|
const bg = backgroundInfo.path;
|
||||||
|
list.push(bg);
|
||||||
|
chat_metadata[LIST_METADATA_KEY] = list;
|
||||||
|
saveMetadataDebounced();
|
||||||
|
getChatBackgroundsList();
|
||||||
|
highlightNewBackground(bg);
|
||||||
highlightLockedBackground();
|
highlightLockedBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,9 +32,27 @@ async function onChatChanged() {
|
|||||||
unsetCustomBackground();
|
unsetCustomBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getChatBackgroundsList();
|
||||||
highlightLockedBackground();
|
highlightLockedBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getChatBackgroundsList() {
|
||||||
|
const list = chat_metadata[LIST_METADATA_KEY];
|
||||||
|
const listEmpty = !Array.isArray(list) || list.length === 0;
|
||||||
|
|
||||||
|
$('#bg_custom_content').empty();
|
||||||
|
$('#bg_chat_hint').toggle(listEmpty);
|
||||||
|
|
||||||
|
if (listEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const bg of list) {
|
||||||
|
const template = getBackgroundFromTemplate(bg, true);
|
||||||
|
$('#bg_custom_content').append(template);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getBackgroundPath(fileUrl) {
|
function getBackgroundPath(fileUrl) {
|
||||||
return `backgrounds/${fileUrl}`;
|
return `backgrounds/${fileUrl}`;
|
||||||
}
|
}
|
||||||
@ -32,7 +60,7 @@ function getBackgroundPath(fileUrl) {
|
|||||||
function highlightLockedBackground() {
|
function highlightLockedBackground() {
|
||||||
$('.bg_example').removeClass('locked');
|
$('.bg_example').removeClass('locked');
|
||||||
|
|
||||||
const lockedBackground = chat_metadata[METADATA_KEY];
|
const lockedBackground = chat_metadata[BG_METADATA_KEY];
|
||||||
|
|
||||||
if (!lockedBackground) {
|
if (!lockedBackground) {
|
||||||
return;
|
return;
|
||||||
@ -71,21 +99,21 @@ function onUnlockBackgroundClick(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function hasCustomBackground() {
|
function hasCustomBackground() {
|
||||||
return chat_metadata[METADATA_KEY];
|
return chat_metadata[BG_METADATA_KEY];
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveBackgroundMetadata(file) {
|
function saveBackgroundMetadata(file) {
|
||||||
chat_metadata[METADATA_KEY] = file;
|
chat_metadata[BG_METADATA_KEY] = file;
|
||||||
saveMetadataDebounced();
|
saveMetadataDebounced();
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeBackgroundMetadata() {
|
function removeBackgroundMetadata() {
|
||||||
delete chat_metadata[METADATA_KEY];
|
delete chat_metadata[BG_METADATA_KEY];
|
||||||
saveMetadataDebounced();
|
saveMetadataDebounced();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCustomBackground() {
|
function setCustomBackground() {
|
||||||
const file = chat_metadata[METADATA_KEY];
|
const file = chat_metadata[BG_METADATA_KEY];
|
||||||
|
|
||||||
// bg already set
|
// bg already set
|
||||||
if (document.getElementById("bg_custom").style.backgroundImage == file) {
|
if (document.getElementById("bg_custom").style.backgroundImage == file) {
|
||||||
@ -100,6 +128,7 @@ function unsetCustomBackground() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onSelectBackgroundClick() {
|
function onSelectBackgroundClick() {
|
||||||
|
const isCustom = $(this).attr('custom') === 'true';
|
||||||
const relativeBgImage = getUrlParameter(this);
|
const relativeBgImage = getUrlParameter(this);
|
||||||
|
|
||||||
// if clicked on upload button
|
// if clicked on upload button
|
||||||
@ -107,15 +136,18 @@ function onSelectBackgroundClick() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasCustomBackground()) {
|
// Automatically lock the background if it's custom or other background is locked
|
||||||
|
if (hasCustomBackground() || isCustom) {
|
||||||
saveBackgroundMetadata(relativeBgImage);
|
saveBackgroundMetadata(relativeBgImage);
|
||||||
setCustomBackground();
|
setCustomBackground();
|
||||||
|
highlightLockedBackground();
|
||||||
|
} else {
|
||||||
|
highlightLockedBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
highlightLockedBackground();
|
|
||||||
const customBg = window.getComputedStyle(document.getElementById('bg_custom')).backgroundImage;
|
const customBg = window.getComputedStyle(document.getElementById('bg_custom')).backgroundImage;
|
||||||
|
|
||||||
// custom background is set. Do not override the layer below
|
// Custom background is set. Do not override the layer below
|
||||||
if (customBg !== 'none') {
|
if (customBg !== 'none') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -123,7 +155,7 @@ function onSelectBackgroundClick() {
|
|||||||
const bgFile = $(this).attr("bgfile");
|
const bgFile = $(this).attr("bgfile");
|
||||||
const backgroundUrl = getBackgroundPath(bgFile);
|
const backgroundUrl = getBackgroundPath(bgFile);
|
||||||
|
|
||||||
// fetching to browser memory to reduce flicker
|
// Fetching to browser memory to reduce flicker
|
||||||
fetch(backgroundUrl).then(() => {
|
fetch(backgroundUrl).then(() => {
|
||||||
$("#bg1").css("background-image", relativeBgImage);
|
$("#bg1").css("background-image", relativeBgImage);
|
||||||
setBackground(bgFile);
|
setBackground(bgFile);
|
||||||
@ -132,32 +164,80 @@ function onSelectBackgroundClick() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onRenameBackgroundClick(e) {
|
async function onCopyToSystemBackgroundClick(e) {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
const old_bg = $(this).closest('.bg_example').attr('bgfile');
|
const bgNames = await getNewBackgroundName(this);
|
||||||
|
|
||||||
if (!old_bg) {
|
if (!bgNames) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bgFile = await fetch(bgNames.oldBg);
|
||||||
|
|
||||||
|
if (!bgFile.ok) {
|
||||||
|
toastr.warning('Failed to copy background');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const blob = await bgFile.blob();
|
||||||
|
const file = new File([blob], bgNames.newBg);
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.set('avatar', file);
|
||||||
|
|
||||||
|
uploadBackground(formData);
|
||||||
|
|
||||||
|
const list = chat_metadata[LIST_METADATA_KEY] || [];
|
||||||
|
const index = list.indexOf(bgNames.oldBg);
|
||||||
|
list.splice(index, 1);
|
||||||
|
saveMetadataDebounced();
|
||||||
|
getChatBackgroundsList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the new background name from the user.
|
||||||
|
* @param {Element} referenceElement
|
||||||
|
* @returns {Promise<{oldBg: string, newBg: string}>}
|
||||||
|
* */
|
||||||
|
async function getNewBackgroundName(referenceElement) {
|
||||||
|
const exampleBlock = $(referenceElement).closest('.bg_example');
|
||||||
|
const isCustom = exampleBlock.attr('custom') === 'true';
|
||||||
|
const oldBg = exampleBlock.attr('bgfile');
|
||||||
|
|
||||||
|
if (!oldBg) {
|
||||||
console.debug('no bgfile');
|
console.debug('no bgfile');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileExtension = old_bg.split('.').pop();
|
const fileExtension = oldBg.split('.').pop();
|
||||||
const old_bg_extensionless = old_bg.replace(`.${fileExtension}`, '');
|
const fileNameBase = isCustom ? oldBg.split('/').pop() : oldBg;
|
||||||
const new_bg_extensionless = await callPopup('<h3>Enter new background name:</h3>', 'input', old_bg_extensionless);
|
const oldBgExtensionless = fileNameBase.replace(`.${fileExtension}`, '');
|
||||||
|
const newBgExtensionless = await callPopup('<h3>Enter new background name:</h3>', 'input', oldBgExtensionless);
|
||||||
|
|
||||||
if (!new_bg_extensionless) {
|
if (!newBgExtensionless) {
|
||||||
console.debug('no new_bg_extensionless');
|
console.debug('no new_bg_extensionless');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const new_bg = `${new_bg_extensionless}.${fileExtension}`;
|
const newBg = `${newBgExtensionless}.${fileExtension}`;
|
||||||
|
|
||||||
if (old_bg_extensionless === new_bg_extensionless) {
|
if (oldBgExtensionless === newBgExtensionless) {
|
||||||
console.debug('new_bg === old_bg');
|
console.debug('new_bg === old_bg');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = { old_bg, new_bg };
|
return { oldBg, newBg };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onRenameBackgroundClick(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
const bgNames = await getNewBackgroundName(this);
|
||||||
|
|
||||||
|
if (!bgNames) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { old_bg: bgNames.oldBg, new_bg: bgNames.newBg };
|
||||||
const response = await fetch('/renamebackground', {
|
const response = await fetch('/renamebackground', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: getRequestHeaders(),
|
headers: getRequestHeaders(),
|
||||||
@ -167,7 +247,7 @@ async function onRenameBackgroundClick(e) {
|
|||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
await getBackgrounds();
|
await getBackgrounds();
|
||||||
highlightNewBackground(new_bg);
|
highlightNewBackground(bgNames.newBg);
|
||||||
} else {
|
} else {
|
||||||
toastr.warning('Failed to rename background');
|
toastr.warning('Failed to rename background');
|
||||||
}
|
}
|
||||||
@ -177,28 +257,45 @@ async function onDeleteBackgroundClick(e) {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
const bgToDelete = $(this).closest('.bg_example');
|
const bgToDelete = $(this).closest('.bg_example');
|
||||||
const url = bgToDelete.data('url');
|
const url = bgToDelete.data('url');
|
||||||
|
const isCustom = bgToDelete.attr('custom') === 'true';
|
||||||
const confirm = await callPopup("<h3>Delete the background?</h3>", 'confirm');
|
const confirm = await callPopup("<h3>Delete the background?</h3>", 'confirm');
|
||||||
|
const bg = bgToDelete.attr('bgfile');
|
||||||
|
|
||||||
if (confirm) {
|
if (confirm) {
|
||||||
delBackground(bgToDelete.attr("bgfile"));
|
// If it's not custom, it's a built-in background. Delete it from the server
|
||||||
|
if (!isCustom) {
|
||||||
|
delBackground(bg);
|
||||||
|
} else {
|
||||||
|
const list = chat_metadata[LIST_METADATA_KEY] || [];
|
||||||
|
const index = list.indexOf(bg);
|
||||||
|
list.splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
const siblingSelector = '.bg_example:not(#form_bg_download)';
|
const siblingSelector = '.bg_example:not(#form_bg_download)';
|
||||||
const nextBg = bgToDelete.next(siblingSelector);
|
const nextBg = bgToDelete.next(siblingSelector);
|
||||||
const prevBg = bgToDelete.prev(siblingSelector);
|
const prevBg = bgToDelete.prev(siblingSelector);
|
||||||
|
const anyBg = $(siblingSelector);
|
||||||
|
|
||||||
if (nextBg.length > 0) {
|
if (nextBg.length > 0) {
|
||||||
nextBg.trigger('click');
|
nextBg.trigger('click');
|
||||||
} else {
|
} else if (prevBg.length > 0) {
|
||||||
prevBg.trigger('click');
|
prevBg.trigger('click');
|
||||||
|
} else {
|
||||||
|
$(anyBg[Math.floor(Math.random() * anyBg.length)]).trigger('click');
|
||||||
}
|
}
|
||||||
|
|
||||||
bgToDelete.remove();
|
bgToDelete.remove();
|
||||||
|
|
||||||
if (url === chat_metadata[METADATA_KEY]) {
|
if (url === chat_metadata[BG_METADATA_KEY]) {
|
||||||
removeBackgroundMetadata();
|
removeBackgroundMetadata();
|
||||||
unsetCustomBackground();
|
unsetCustomBackground();
|
||||||
highlightLockedBackground();
|
highlightLockedBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isCustom) {
|
||||||
|
getChatBackgroundsList();
|
||||||
|
saveMetadataDebounced();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,18 +356,20 @@ function getUrlParameter(block) {
|
|||||||
* Instantiates a background template
|
* Instantiates a background template
|
||||||
* @param {string} bg Path to background
|
* @param {string} bg Path to background
|
||||||
* @param {boolean} isCustom Whether the background is custom
|
* @param {boolean} isCustom Whether the background is custom
|
||||||
* @returns
|
* @returns {JQuery<HTMLElement>} Background template
|
||||||
*/
|
*/
|
||||||
function getBackgroundFromTemplate(bg, isCustom) {
|
function getBackgroundFromTemplate(bg, isCustom) {
|
||||||
const thumbPath = getThumbnailUrl('bg', bg);
|
|
||||||
const template = $('#background_template .bg_example').clone();
|
const template = $('#background_template .bg_example').clone();
|
||||||
const url = isCustom ? `url("${bg}")` : `url("${getBackgroundPath(bg)}")`;
|
const thumbPath = isCustom ? bg : getThumbnailUrl('bg', bg);
|
||||||
template.attr('title', bg);
|
const url = isCustom ? `url("${encodeURI(bg)}")` : `url("${getBackgroundPath(bg)}")`;
|
||||||
|
const title = isCustom ? bg.split('/').pop() : bg;
|
||||||
|
const friendlyTitle = title.slice(0, title.lastIndexOf('.'));
|
||||||
|
template.attr('title', title);
|
||||||
template.attr('bgfile', bg);
|
template.attr('bgfile', bg);
|
||||||
template.attr('custom', String(isCustom));
|
template.attr('custom', String(isCustom));
|
||||||
template.data('url', url);
|
template.data('url', url);
|
||||||
template.css('background-image', `url('${thumbPath}')`);
|
template.css('background-image', `url('${thumbPath}')`);
|
||||||
template.find('.BGSampleTitle').text(bg.slice(0, bg.lastIndexOf('.')));
|
template.find('.BGSampleTitle').text(friendlyTitle);
|
||||||
return template;
|
return template;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,12 +406,6 @@ async function delBackground(bg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onBackgroundUploadSelected() {
|
function onBackgroundUploadSelected() {
|
||||||
const input = this;
|
|
||||||
|
|
||||||
if (input.files && input.files[0]) {
|
|
||||||
const reader = new FileReader();
|
|
||||||
|
|
||||||
reader.onload = function (e) {
|
|
||||||
const form = $("#form_bg_download").get(0);
|
const form = $("#form_bg_download").get(0);
|
||||||
|
|
||||||
if (!(form instanceof HTMLFormElement)) {
|
if (!(form instanceof HTMLFormElement)) {
|
||||||
@ -321,35 +414,35 @@ function onBackgroundUploadSelected() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const formData = new FormData(form);
|
const formData = new FormData(form);
|
||||||
|
uploadBackground(formData);
|
||||||
|
form.reset();
|
||||||
|
}
|
||||||
|
|
||||||
//console.log(formData);
|
/**
|
||||||
|
* Uploads a background to the server
|
||||||
|
* @param {FormData} formData
|
||||||
|
*/
|
||||||
|
function uploadBackground(formData) {
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/downloadbackground",
|
url: "/downloadbackground",
|
||||||
data: formData,
|
data: formData,
|
||||||
beforeSend: function () {
|
beforeSend: function () {
|
||||||
|
|
||||||
},
|
},
|
||||||
cache: false,
|
cache: false,
|
||||||
contentType: false,
|
contentType: false,
|
||||||
processData: false,
|
processData: false,
|
||||||
success: async function (bg) {
|
success: async function (bg) {
|
||||||
form.reset();
|
|
||||||
setBackground(bg);
|
setBackground(bg);
|
||||||
$("#bg1").css("background-image", `url("${getBackgroundPath(bg)}"`);
|
$("#bg1").css("background-image", `url("${getBackgroundPath(bg)}"`);
|
||||||
await getBackgrounds();
|
await getBackgrounds();
|
||||||
highlightNewBackground(bg);
|
highlightNewBackground(bg);
|
||||||
},
|
},
|
||||||
error: function (jqXHR, exception) {
|
error: function (jqXHR, exception) {
|
||||||
form.reset();
|
|
||||||
console.log(exception);
|
console.log(exception);
|
||||||
console.log(jqXHR);
|
console.log(jqXHR);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
|
||||||
|
|
||||||
reader.readAsDataURL(input.files[0]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -378,11 +471,12 @@ function onBackgroundFilterInput() {
|
|||||||
export function initBackgrounds() {
|
export function initBackgrounds() {
|
||||||
eventSource.on(event_types.CHAT_CHANGED, onChatChanged);
|
eventSource.on(event_types.CHAT_CHANGED, onChatChanged);
|
||||||
eventSource.on(event_types.FORCE_SET_BACKGROUND, forceSetBackground);
|
eventSource.on(event_types.FORCE_SET_BACKGROUND, forceSetBackground);
|
||||||
$(document).on("click", ".bg_example", onSelectBackgroundClick);
|
$(document).on("click", '.bg_example', onSelectBackgroundClick);
|
||||||
$(document).on('click', '.bg_example_lock', onLockBackgroundClick);
|
$(document).on('click', '.bg_example_lock', onLockBackgroundClick);
|
||||||
$(document).on('click', '.bg_example_unlock', onUnlockBackgroundClick);
|
$(document).on('click', '.bg_example_unlock', onUnlockBackgroundClick);
|
||||||
$(document).on('click', '.bg_example_edit', onRenameBackgroundClick);
|
$(document).on('click', '.bg_example_edit', onRenameBackgroundClick);
|
||||||
$(document).on("click", ".bg_example_cross", onDeleteBackgroundClick);
|
$(document).on("click", '.bg_example_cross', onDeleteBackgroundClick);
|
||||||
|
$(document).on("click", '.bg_example_copy', onCopyToSystemBackgroundClick);
|
||||||
$('#auto_background').on("click", autoBackgroundCommand);
|
$('#auto_background').on("click", autoBackgroundCommand);
|
||||||
$("#add_bg_button").on('change', onBackgroundUploadSelected);
|
$("#add_bg_button").on('change', onBackgroundUploadSelected);
|
||||||
$("#bg-filter").on("input", onBackgroundFilterInput);
|
$("#bg-filter").on("input", onBackgroundFilterInput);
|
||||||
|
@ -1116,10 +1116,9 @@ async function generatePicture(_, trigger, message, callback) {
|
|||||||
extension_settings.sd.width = Math.round(extension_settings.sd.height * 1.8 / 64) * 64;
|
extension_settings.sd.width = Math.round(extension_settings.sd.height * 1.8 / 64) * 64;
|
||||||
}
|
}
|
||||||
const callbackOriginal = callback;
|
const callbackOriginal = callback;
|
||||||
callback = async function (prompt, base64Image) {
|
callback = async function (prompt, imagePath) {
|
||||||
const imagePath = base64Image;
|
const imgUrl = `url("${encodeURI(imagePath)}")`;
|
||||||
const imgUrl = `url("${encodeURI(base64Image)}")`;
|
eventSource.emit(event_types.FORCE_SET_BACKGROUND, { url: imgUrl, path: imagePath });
|
||||||
eventSource.emit(event_types.FORCE_SET_BACKGROUND, imgUrl);
|
|
||||||
|
|
||||||
if (typeof callbackOriginal === 'function') {
|
if (typeof callbackOriginal === 'function') {
|
||||||
callbackOriginal(prompt, imagePath);
|
callbackOriginal(prompt, imagePath);
|
||||||
|
@ -870,7 +870,7 @@ export async function saveBase64AsFile(base64Data, characterName, filename = "",
|
|||||||
// If the response is successful, get the saved image path from the server's response
|
// If the response is successful, get the saved image path from the server's response
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
return responseData.path;
|
return responseData.path.replace(/\\/g, '/'); // Replace backslashes with forward slashes
|
||||||
} else {
|
} else {
|
||||||
const errorData = await response.json();
|
const errorData = await response.json();
|
||||||
throw new Error(errorData.error || 'Failed to upload the image to the server');
|
throw new Error(errorData.error || 'Failed to upload the image to the server');
|
||||||
|
@ -1506,7 +1506,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
|
|||||||
z-index: 3001;
|
z-index: 3001;
|
||||||
}
|
}
|
||||||
|
|
||||||
#bg_menu_content {
|
.bg_list {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
width: calc(var(--sheldWidth) - 10px);
|
width: calc(var(--sheldWidth) - 10px);
|
||||||
@ -1543,6 +1543,14 @@ input[type=search]:focus::-webkit-search-cancel-button {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.bg_example:hover[custom="true"] .bg_example_edit {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg_example:hover[custom="false"] .bg_example_copy {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.BGSampleTitle {
|
.BGSampleTitle {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -1591,6 +1599,10 @@ input[type=search]:focus::-webkit-search-cancel-button {
|
|||||||
left: 10px;
|
left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.bg_example_copy {
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.bg_example_lock,
|
.bg_example_lock,
|
||||||
.bg_example_unlock {
|
.bg_example_unlock {
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
Reference in New Issue
Block a user