Draggable VN sprites. Fix layering

This commit is contained in:
Cohee
2023-06-04 16:32:45 +03:00
parent a273fcb593
commit 3cfec828ef
5 changed files with 24 additions and 7 deletions

View File

@ -427,6 +427,7 @@ export const event_types = {
GENERATION_STOPPED: 'generation_stopped', GENERATION_STOPPED: 'generation_stopped',
SETTINGS_UPDATED: 'settings_updated', SETTINGS_UPDATED: 'settings_updated',
GROUP_UPDATED: 'group_updated', GROUP_UPDATED: 'group_updated',
MOVABLE_PANELS_RESET: 'movable_panels_reset',
} }
export const eventSource = new EventEmitter(); export const eventSource = new EventEmitter();

View File

@ -450,7 +450,7 @@ dragElement(document.getElementById("WorldInfo"));
function dragElement(elmnt) { export function dragElement(elmnt) {
var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
if (document.getElementById(elmnt.id + "header")) { //ex: id="sheldheader" if (document.getElementById(elmnt.id + "header")) { //ex: id="sheldheader"
@ -504,7 +504,7 @@ function dragElement(elmnt) {
pos3 = e.clientX; //new mouse X pos3 = e.clientX; //new mouse X
pos4 = e.clientY; //new mouse Y pos4 = e.clientY; //new mouse Y
elmnt.setAttribute('data-dragged', 'true');
//fix over/underflows: //fix over/underflows:

View File

@ -1,5 +1,5 @@
import { callPopup, eventSource, event_types, getRequestHeaders, saveSettingsDebounced } from "../../../script.js"; import { callPopup, eventSource, event_types, getRequestHeaders, saveSettingsDebounced } from "../../../script.js";
import { deviceInfo } from "../../RossAscends-mods.js"; import { deviceInfo, dragElement } from "../../RossAscends-mods.js";
import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch } from "../../extensions.js"; import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch } from "../../extensions.js";
import { power_user } from "../../power-user.js"; import { power_user } from "../../power-user.js";
import { onlyUnique, debounce } from "../../utils.js"; import { onlyUnique, debounce } from "../../utils.js";
@ -143,8 +143,11 @@ async function visualNovelSetCharacterSprites(container, name, expression) {
expressionImage.toggleClass('hidden', noSprites); expressionImage.toggleClass('hidden', noSprites);
} else { } else {
const template = $('#expression-holder').clone(); const template = $('#expression-holder').clone();
template.attr('id', `expression-${avatar}`);
template.attr('data-avatar', avatar); template.attr('data-avatar', avatar);
template.find('.drag-grabber').attr('id', `expression-${avatar}header`);
$('#visual-novel-wrapper').append(template); $('#visual-novel-wrapper').append(template);
dragElement(template[0]);
template.toggleClass('hidden', noSprites); template.toggleClass('hidden', noSprites);
setImage(template.find('img'), defaultSpritePath || ''); setImage(template.find('img'), defaultSpritePath || '');
const fadeInPromise = new Promise(resolve => { const fadeInPromise = new Promise(resolve => {
@ -164,9 +167,9 @@ async function visualNovelUpdateLayers(container) {
const context = getContext(); const context = getContext();
const group = context.groups.find(x => x.id == context.groupId); const group = context.groups.find(x => x.id == context.groupId);
const members = group.members; const members = group.members;
const recentMessages = context.chat.map(x => x.original_avatar).filter(onlyUnique); const recentMessages = context.chat.map(x => x.original_avatar).filter(x => x).reverse().filter(onlyUnique);
const filteredMembers = members.filter(x => !group.disabled_members.includes(x)); const filteredMembers = members.filter(x => !group.disabled_members.includes(x));
const layerIndices = filteredMembers.slice().sort((a, b) => recentMessages.indexOf(a) - recentMessages.indexOf(b)); const layerIndices = filteredMembers.slice().sort((a, b) => recentMessages.indexOf(b) - recentMessages.indexOf(a));
const setLayerIndicesPromises = []; const setLayerIndicesPromises = [];
@ -201,6 +204,13 @@ async function visualNovelUpdateLayers(container) {
images.sort(sortFunction).each((index, current) => { images.sort(sortFunction).each((index, current) => {
const element = $(current); const element = $(current);
// skip repositioning of dragged elements
if (element.data('dragged')) {
currentPosition += imagesWidth[index];
return;
}
const avatar = element.data('avatar'); const avatar = element.data('avatar');
const layerIndex = layerIndices.indexOf(avatar); const layerIndex = layerIndices.indexOf(avatar);
element.css('z-index', layerIndex); element.css('z-index', layerIndex);
@ -765,5 +775,6 @@ async function onClickExpressionDelete(event) {
$('#visual-novel-wrapper').empty(); $('#visual-novel-wrapper').empty();
} }
}); });
eventSource.on(event_types.MOVABLE_PANELS_RESET, updateVisualNovelModeDebounced);
eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced); eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced);
})(); })();

View File

@ -27,9 +27,9 @@
visibility: hidden !important; visibility: hidden !important;
} }
#visual-novel-wrapper img.expression { /*#visual-novel-wrapper img.expression {
object-fit: cover; object-fit: cover;
} }*/
.expression-holder { .expression-holder {
min-width: 100px; min-width: 100px;

View File

@ -9,6 +9,8 @@ import {
getRequestHeaders, getRequestHeaders,
substituteParams, substituteParams,
updateVisibleDivs, updateVisibleDivs,
eventSource,
event_types,
} from "../script.js"; } from "../script.js";
import { favsToHotswap } from "./RossAscends-mods.js"; import { favsToHotswap } from "./RossAscends-mods.js";
import { import {
@ -836,6 +838,9 @@ function resetMovablePanels() {
document.getElementById("WorldInfo").style.height = ''; document.getElementById("WorldInfo").style.height = '';
document.getElementById("WorldInfo").style.width = ''; document.getElementById("WorldInfo").style.width = '';
document.getElementById("WorldInfo").style.margin = ''; document.getElementById("WorldInfo").style.margin = '';
$('*[data-dragged="true"]').removeAttr('data-dragged');
eventSource.emit(event_types.MOVABLE_PANELS_RESET);
} }
$(document).ready(() => { $(document).ready(() => {