import { insertArtSelectButton } from '../../applications/artSelect.js';
|
|
import { showArtSelect } from '../../token-variants.mjs';
|
|
import { TVA_CONFIG } from '../settings.js';
|
|
import { SEARCH_TYPE, updateActorImage } from '../utils.js';
|
|
import { registerHook, unregisterHook } from './hooks.js';
|
|
|
|
const feature_id = 'ArtSelect';
|
|
|
|
export function registerArtSelectButtonHooks() {
|
|
// Insert right-click listeners to open up ArtSelect forms from various contexts
|
|
if (TVA_CONFIG.permissions.portrait_right_click[game.user.role]) {
|
|
registerHook(feature_id, 'renderActorSheet', _modActorSheet);
|
|
registerHook(feature_id, 'renderItemSheet', _modItemSheet);
|
|
registerHook(feature_id, 'renderItemActionSheet', _modItemSheet);
|
|
registerHook(feature_id, 'renderJournalSheet', _modJournalSheet);
|
|
registerHook(feature_id, 'renderRollTableConfig', _modRollTableSheet);
|
|
} else {
|
|
[
|
|
'renderActorSheet',
|
|
'renderItemSheet',
|
|
'renderItemActionSheet',
|
|
'renderJournalSheet',
|
|
'renderRollTableConfig',
|
|
].forEach((name) => unregisterHook(feature_id, name));
|
|
}
|
|
|
|
// Insert buttons
|
|
if (TVA_CONFIG.permissions.image_path_button[game.user.role]) {
|
|
registerHook(feature_id, 'renderTileConfig', _modTileConfig);
|
|
registerHook(feature_id, 'renderMeasuredTemplateConfig', _modTemplateConfig);
|
|
registerHook(feature_id, 'renderTokenConfig', _modTokenConfig);
|
|
registerHook(feature_id, 'renderDrawingConfig', _modDrawingConfig);
|
|
registerHook(feature_id, 'renderNoteConfig', _modNoteConfig);
|
|
registerHook(feature_id, 'renderSceneConfig', _modSceneConfig);
|
|
registerHook(feature_id, 'renderMacroConfig', _modMacroConfig);
|
|
registerHook(feature_id, 'renderActiveEffectConfig', _modActiveEffectConfig);
|
|
} else {
|
|
[
|
|
'renderTileConfig',
|
|
'renderMeasuredTemplateConfig',
|
|
'renderTokenConfig',
|
|
'renderDrawingConfig',
|
|
'renderNoteConfig',
|
|
'renderSceneConfig',
|
|
`renderActiveEffectConfig`,
|
|
].forEach((name) => unregisterHook(feature_id, name));
|
|
}
|
|
}
|
|
|
|
function _modTokenConfig(config, html) {
|
|
insertArtSelectButton(html, 'texture.src', {
|
|
search: config.object.name,
|
|
searchType: SEARCH_TYPE.TOKEN,
|
|
});
|
|
}
|
|
|
|
function _modTemplateConfig(config, html) {
|
|
insertArtSelectButton(html, 'texture', { search: 'Template', searchType: SEARCH_TYPE.TILE });
|
|
}
|
|
|
|
function _modDrawingConfig(config, html) {
|
|
insertArtSelectButton(html, 'texture', {
|
|
search: 'Drawing',
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Drawing') ? 'Drawing' : SEARCH_TYPE.TILE,
|
|
});
|
|
}
|
|
|
|
function _modNoteConfig(config, html) {
|
|
insertArtSelectButton(html, 'icon.custom', {
|
|
search: 'Note',
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Note') ? 'Note' : SEARCH_TYPE.ITEM,
|
|
});
|
|
}
|
|
|
|
function _modSceneConfig(config, html) {
|
|
insertArtSelectButton(html, 'background.src', {
|
|
search: config.object.name,
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Scene') ? 'Scene' : SEARCH_TYPE.TILE,
|
|
});
|
|
insertArtSelectButton(html, 'foreground', {
|
|
search: config.object.name,
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Scene') ? 'Scene' : SEARCH_TYPE.TILE,
|
|
});
|
|
insertArtSelectButton(html, 'fogOverlay', {
|
|
search: config.object.name,
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Fog') ? 'Fog' : SEARCH_TYPE.TILE,
|
|
});
|
|
}
|
|
|
|
function _modTileConfig(tileConfig, html) {
|
|
insertArtSelectButton(html, 'texture.src', {
|
|
search: tileConfig.object.getFlag('token-variants', 'tileName') || 'Tile',
|
|
searchType: SEARCH_TYPE.TILE,
|
|
});
|
|
}
|
|
|
|
function _modActiveEffectConfig(effectConfig, html) {
|
|
const inserted = insertArtSelectButton(html, 'icon', {
|
|
search: effectConfig.object.name || 'Active Effect',
|
|
searchType: TVA_CONFIG.customImageCategories.includes('Active Effect') ? 'Active Effect' : SEARCH_TYPE.ITEM,
|
|
});
|
|
if (!inserted) {
|
|
const img = $(html).find('.effect-icon');
|
|
img.on('contextmenu', () => {
|
|
showArtSelect(effectConfig.object?.name ?? 'Active Effect', {
|
|
searchType: SEARCH_TYPE.ITEM,
|
|
callback: (imgSrc) => img.attr('src', imgSrc),
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function _modItemSheet(itemSheet, html, options) {
|
|
$(html)
|
|
.find('img.profile, .profile-img, [data-edit="img"]')
|
|
.on('contextmenu', () => {
|
|
const item = itemSheet.object;
|
|
if (!item) return;
|
|
showArtSelect(item.name, {
|
|
searchType: SEARCH_TYPE.ITEM,
|
|
callback: (imgSrc) => item.update({ img: imgSrc }),
|
|
});
|
|
});
|
|
}
|
|
|
|
function _modMacroConfig(macroConfig, html, options) {
|
|
const img = $(html).find('.sheet-header > img');
|
|
img.on('contextmenu', () => {
|
|
showArtSelect(macroConfig.object?.name ?? 'Macro', {
|
|
searchType: SEARCH_TYPE.MACRO,
|
|
callback: (imgSrc) => img.attr('src', imgSrc),
|
|
});
|
|
});
|
|
}
|
|
|
|
function _modJournalSheet(journalSheet, html, options) {
|
|
$(html)
|
|
.find('.header-button.entry-image')
|
|
.on('contextmenu', () => {
|
|
const journal = journalSheet.object;
|
|
if (!journal) return;
|
|
showArtSelect(journal.name, {
|
|
searchType: SEARCH_TYPE.JOURNAL,
|
|
callback: (imgSrc) => journal.update({ img: imgSrc }),
|
|
});
|
|
});
|
|
}
|
|
|
|
function _modRollTableSheet(sheet, html) {
|
|
$(html)
|
|
.find('.result-image')
|
|
.on('contextmenu', (event) => {
|
|
const table = sheet.object;
|
|
if (!table) return;
|
|
const img = $(event.target).closest('.result-image').find('img');
|
|
showArtSelect(table.name, {
|
|
searchType: TVA_CONFIG.customImageCategories.includes('RollTable') ? 'RollTable' : SEARCH_TYPE.ITEM,
|
|
callback: (imgSrc) => {
|
|
img.attr('src', imgSrc);
|
|
sheet._onSubmit(event);
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Adds right-click listener to Actor Sheet profile image to open up
|
|
* the 'Art Select' screen.
|
|
*/
|
|
function _modActorSheet(actorSheet, html, options) {
|
|
if (options.editable && TVA_CONFIG.permissions.portrait_right_click[game.user.role]) {
|
|
let profile = null;
|
|
let profileQueries = {
|
|
all: ['.profile', '.profile-img', '.profile-image'],
|
|
pf2e: ['.player-image', '.actor-icon', '.sheet-header img', '.actor-image'],
|
|
};
|
|
|
|
for (let query of profileQueries.all) {
|
|
profile = html[0].querySelector(query);
|
|
if (profile) break;
|
|
}
|
|
|
|
if (!profile && game.system.id in profileQueries) {
|
|
for (let query of profileQueries[game.system.id]) {
|
|
profile = html[0].querySelector(query);
|
|
if (profile) break;
|
|
}
|
|
}
|
|
|
|
if (!profile) {
|
|
console.warn('TVA |', game.i18n.localize('token-variants.notifications.warn.profile-image-not-found'));
|
|
return;
|
|
}
|
|
|
|
profile.addEventListener(
|
|
'contextmenu',
|
|
function (ev) {
|
|
showArtSelect(actorSheet.object.name, {
|
|
callback: (imgSrc, name) => updateActorImage(actorSheet.object, imgSrc),
|
|
searchType: SEARCH_TYPE.PORTRAIT,
|
|
object: actorSheet.object,
|
|
});
|
|
},
|
|
false
|
|
);
|
|
}
|
|
}
|