Add title tooltip to expression sprites Closes #2596

1ea2134936ac4b09c0863b618b79606bf45a619e

Wolfsblvt <wolfsblvt@gmail.com>

1 files changed, +14 -4Ignore whitespace
public/scripts/extensions/expressions/index.js+14 -4
@@ -196,6 +196,8 @@ async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, exp
196 }196 }
197197
198 const expressionImage = vnContainer.find(`.expression-holder[data-avatar="${avatar}"]`);198 const expressionImage = vnContainer.find(`.expression-holder[data-avatar="${avatar}"]`);
199 /** @type {JQuery<HTMLElement>} */
200 let img;
199201
200 const memberSpriteFolderName = getSpriteFolderName({ original_avatar: character.avatar }, character.name);202 const memberSpriteFolderName = getSpriteFolderName({ original_avatar: character.avatar }, character.name);
201203
@@ -212,7 +214,7 @@ async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, exp
212 await validateImages(memberSpriteFolderName, true);214 await validateImages(memberSpriteFolderName, true);
213 setExpressionOverrideHtml(true); // <= force clear expression override input215 setExpressionOverrideHtml(true); // <= force clear expression override input
214 const path = spriteFile?.imageSrc || '';216 const path = spriteFile?.imageSrc || '';
215 const img = expressionImage.find('img');217 img = expressionImage.find('img');
216 await setImage(img, path);218 await setImage(img, path);
217 }219 }
218 expressionImage.toggleClass('hidden', !spriteFile);220 expressionImage.toggleClass('hidden', !spriteFile);
@@ -224,13 +226,19 @@ async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, exp
224 $('#visual-novel-wrapper').append(template);226 $('#visual-novel-wrapper').append(template);
225 dragElement($(template[0]));227 dragElement($(template[0]));
226 template.toggleClass('hidden', !spriteFile);228 template.toggleClass('hidden', !spriteFile);
227 await setImage(template.find('img'), spriteFile?.imageSrc || '');229 img = template.find('img');
230 await setImage(img, spriteFile?.imageSrc || '');
228 const fadeInPromise = new Promise(resolve => {231 const fadeInPromise = new Promise(resolve => {
229 template.fadeIn(250, () => resolve());232 template.fadeIn(250, () => resolve());
230 });233 });
231 setSpritePromises.push(fadeInPromise);234 setSpritePromises.push(fadeInPromise);
232 }235 }
233236
237 img.attr('data-sprite-folder-name', spriteFolderName);
238 img.attr('data-expression', expression);
239 img.attr('data-sprite-filename', spriteFile?.fileName || null);
240 img.attr('title', expression);
241
234 if (spriteFile) console.info(`Expression set for group member ${character.name}`, { expression: spriteFile.expression, file: spriteFile.fileName });242 if (spriteFile) console.info(`Expression set for group member ${character.name}`, { expression: spriteFile.expression, file: spriteFile.fileName });
235 else if (expressionImage.length) console.info(`Expression unset for group member ${character.name} - No sprite found`, { expression: expression });243 else if (expressionImage.length) console.info(`Expression unset for group member ${character.name} - No sprite found`, { expression: expression });
236 else console.info(`Expression not available for group member ${character.name}`, { expression: expression });244 else console.info(`Expression not available for group member ${character.name}`, { expression: expression });
@@ -1395,6 +1403,7 @@ async function setExpression(spriteFolderName, expression, { force = false, over
1395 expressionClone.attr('data-sprite-folder-name', spriteFolderName);1403 expressionClone.attr('data-sprite-folder-name', spriteFolderName);
1396 expressionClone.attr('data-expression', expression);1404 expressionClone.attr('data-expression', expression);
1397 expressionClone.attr('data-sprite-filename', spriteFile.fileName);1405 expressionClone.attr('data-sprite-filename', spriteFile.fileName);
1406 expressionClone.attr('title', expression);
1398 //add invisible clone to html1407 //add invisible clone to html
1399 expressionClone.appendTo($('#expression-holder'));1408 expressionClone.appendTo($('#expression-holder'));
14001409
@@ -1454,9 +1463,8 @@ async function setExpression(spriteFolderName, expression, { force = false, over
1454 }1463 }
1455 else {1464 else {
1456 img.attr('data-sprite-folder-name', spriteFolderName);1465 img.attr('data-sprite-folder-name', spriteFolderName);
1457 img.attr('data-expression', expression);
14581466
1459 $(img).off('error');1467 img.off('error');
14601468
1461 if (extension_settings.expressions.showDefault && expression !== RESET_SPRITE_LABEL) {1469 if (extension_settings.expressions.showDefault && expression !== RESET_SPRITE_LABEL) {
1462 setDefaultEmojiForImage(img, expression);1470 setDefaultEmojiForImage(img, expression);
@@ -1484,6 +1492,7 @@ function setDefaultEmojiForImage(img, expression) {
1484 img.attr('src', defImgUrl);1492 img.attr('src', defImgUrl);
1485 img.attr('data-expression', expression);1493 img.attr('data-expression', expression);
1486 img.attr('data-sprite-filename', null);1494 img.attr('data-sprite-filename', null);
1495 img.attr('title', expression);
1487 img.addClass('default');1496 img.addClass('default');
1488}1497}
14891498
@@ -1496,6 +1505,7 @@ function setNoneForImage(img, expression) {
1496 img.attr('src', '');1505 img.attr('src', '');
1497 img.attr('data-expression', expression);1506 img.attr('data-expression', expression);
1498 img.attr('data-sprite-filename', null);1507 img.attr('data-sprite-filename', null);
1508 img.attr('title', expression);
1499 img.removeClass('default');1509 img.removeClass('default');
1500}1510}
15011511