Fix expression sprite sorting, fade additional - Sort alphabetically, but keep the main expression file first - Fade additional sprite images if "allow multiple" is not chosen

84a8a2bc2b7dfe6dea5b198f45b834ad44c9556c

Wolfsblvt <wolfsblvt@gmail.com>

2 files changed, +27 -4Ignore whitespace
public/scripts/extensions/expressions/index.js+18 -4
@@ -1349,7 +1349,7 @@ function getExpressionImageData(sprite) {
1349 fileName: fileName,1349 fileName: fileName,
1350 title: fileNameWithoutExtension,1350 title: fileNameWithoutExtension,
1351 imageSrc: sprite.path,1351 imageSrc: sprite.path,
1352 type: fileNameWithoutExtension == sprite.label ? 'success' : 'additional',1352 type: 'success',
1353 isCustom: extension_settings.expressions.custom?.includes(sprite.label),1353 isCustom: extension_settings.expressions.custom?.includes(sprite.label),
1354 };1354 };
1355}1355}
@@ -1380,8 +1380,7 @@ async function drawSpritesList(character, labels, sprites) {
1380 const images = sprites1380 const images = sprites
1381 .filter(s => s.label === expression)1381 .filter(s => s.label === expression)
1382 .map(s => s.files)1382 .map(s => s.files)
1383 .flat()1383 .flat();
1384 .sort((a, b) => a.title.localeCompare(b.title));
13851384
1386 if (images.length === 0) {1385 if (images.length === 0) {
1387 const listItem = await getListItem(expression, {1386 const listItem = await getListItem(expression, {
@@ -1444,6 +1443,21 @@ async function getSpritesList(name) {
14441443
1445 return acc;1444 return acc;
1446 }, []);1445 }, []);
1446
1447 // Sort the sprites for each expression alphabetically, but keep the main expression file at the front
1448 for (const expression of grouped) {
1449 expression.files.sort((a, b) => {
1450 if (a.title === expression.label) return -1;
1451 if (b.title === expression.label) return 1;
1452 return a.title.localeCompare(b.title);
1453 });
1454
1455 // Mark all besides the first sprite as 'additional'
1456 for (let i = 1; i < expression.files.length; i++) {
1457 expression.files[i].type = 'additional';
1458 }
1459 }
1460
1447 return grouped;1461 return grouped;
1448 }1462 }
1449 catch (err) {1463 catch (err) {
@@ -1584,7 +1598,7 @@ async function setExpression(character, expression, force = false) {
1584 /** @type {Expression} */1598 /** @type {Expression} */
1585 const sprite = (spriteCache[character] && spriteCache[character].find(x => x.label === expression));1599 const sprite = (spriteCache[character] && spriteCache[character].find(x => x.label === expression));
1586 console.debug('checking for expression images to show..');1600 console.debug('checking for expression images to show..');
1587 if (sprite) {1601 if (sprite && sprite.files.length > 0) {
1588 console.debug('setting expression from character images folder');1602 console.debug('setting expression from character images folder');
15891603
1590 let spriteFile = sprite.files[0];1604 let spriteFile = sprite.files[0];
public/scripts/extensions/expressions/style.css+9 -0
@@ -204,3 +204,12 @@ img.expression.default {
204 align-items: baseline;204 align-items: baseline;
205 flex-direction: row;205 flex-direction: row;
206}206}
207
208#expressions_container:has(#expressions_allow_multiple:not(:checked)) #image_list .expression_list_item[data-expression-type="additional"] {
209 opacity: 0.3;
210 transition: opacity var(--animation-duration) ease;
211}
212#expressions_container:has(#expressions_allow_multiple:not(:checked)) #image_list .expression_list_item[data-expression-type="additional"]:hover,
213#expressions_container:has(#expressions_allow_multiple:not(:checked)) #image_list .expression_list_item[data-expression-type="additional"]:focus {
214 opacity: unset;
215}