From 58f039ce969d5b2c63919b3ff5dca16d785b6c83 Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:27:46 +1000 Subject: [PATCH] Add extra features to the Temple Enricher and fix the mousewheel issues with the Template Manager (#1147) Co-authored-by: Chris Ryan --- module/documents/templateManager.mjs | 16 ++++--- module/enrichers/TemplateEnricher.mjs | 65 +++++++++++++++++++++------ 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/module/documents/templateManager.mjs b/module/documents/templateManager.mjs index c31b1baa..cf15c2e3 100644 --- a/module/documents/templateManager.mjs +++ b/module/documents/templateManager.mjs @@ -57,7 +57,10 @@ export default class DhTemplateManager { * @param {wheel Event} event */ #onMouseWheel(event) { - if (!event.shiftKey) return; + if (!this.#activePreview) { + return; + } + if (!event.shiftKey && !event.ctrlKey) return; event.stopPropagation(); event.preventDefault(); const { moveTime, object } = this.#activePreview; @@ -66,8 +69,10 @@ export default class DhTemplateManager { if (now - (moveTime || 0) <= 16) return; this.#activePreview.moveTime = now; + const multiplier = event.shiftKey ? 0.2 : 0.1; + object.document.updateSource({ - direction: object.document.direction + event.deltaY * 0.2 + direction: object.document.direction + event.deltaY * multiplier }); object.renderFlags.set({ refresh: true }); } @@ -77,12 +82,13 @@ export default class DhTemplateManager { * @param {contextmenu Event} event */ #cancelTemplate(event) { - const { mousemove, mousedown, contextmenu } = this.#activePreview.events; + const { mousemove, mousedown, contextmenu, wheel } = this.#activePreview.events; canvas.templates._onDragLeftCancel(event); canvas.stage.off('mousemove', mousemove); canvas.stage.off('mousedown', mousedown); canvas.app.view.removeEventListener('contextmenu', contextmenu); + canvas.app.view.removeEventListener('wheel', wheel); } /** @@ -91,9 +97,9 @@ export default class DhTemplateManager { */ #confirmTemplate(event) { event.stopPropagation(); + this.#cancelTemplate(event); canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [this.#activePreview.document.toObject()]); - - this.#cancelTemplate(event); + this.#activePreview = undefined; } } diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 35a3e231..15936b29 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -3,6 +3,8 @@ export default function DhTemplateEnricher(match, _options) { let type = null, range = null, + angle = CONFIG.MeasuredTemplate.defaults.angle, + direction = 0, inline = false; parts.forEach(part => { @@ -16,14 +18,24 @@ export default function DhTemplateEnricher(match, _options) { type = matchedType; break; case 'range': - const matchedRange = Object.values(CONFIG.DH.GENERAL.templateRanges).find( - x => x.id.toLowerCase() === split[1] || x.short === split[1] - ); - range = matchedRange?.id; + if (Number.isNaN(Number(split[1]))) { + const matchedRange = Object.values(CONFIG.DH.GENERAL.templateRanges).find( + x => x.id.toLowerCase() === split[1] || x.short === split[1] + ); + range = matchedRange?.id; + } else { + range = split[1]; + } break; case 'inline': inline = true; break; + case 'angle': + angle = split[1]; + break; + case 'direction': + direction = split[1]; + break; } } }); @@ -32,10 +44,32 @@ export default function DhTemplateEnricher(match, _options) { const label = game.i18n.localize(`DAGGERHEART.CONFIG.TemplateTypes.${type}`); + const rangeDisplay = Number.isNaN(Number(range)) ? game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.name`) : range; + + let angleDisplay = ''; + if (angle != CONFIG.MeasuredTemplate.defaults.angle) { + angleDisplay = 'angle:' + angle; + + } + let directionDisplay = ''; + if (direction != 0) { + directionDisplay = 'direction:' + direction; + } + + let extraDisplay = ''; + if (angleDisplay != '' && directionDisplay != '') { + extraDisplay = ' (' + angleDisplay + '|' + directionDisplay + ')'; + } else if (angleDisplay != '') { + extraDisplay = ' (' + angleDisplay + ')'; + } else if (directionDisplay != '') { + extraDisplay = ' (' + directionDisplay + ')'; + } + const templateElement = document.createElement('span'); templateElement.innerHTML = ` - `; @@ -45,21 +79,25 @@ export default function DhTemplateEnricher(match, _options) { export const renderMeasuredTemplate = async event => { const button = event.currentTarget, type = button.dataset.type, - range = button.dataset.range; + range = button.dataset.range, + angle = button.dataset.angle, + direction = button.dataset.direction; if (!type || !range || !game.canvas.scene) return; const usedType = type === 'inFront' ? 'cone' : type === 'emanation' ? 'circle' : type; - const angle = + const usedAngle = type === CONST.MEASURED_TEMPLATE_TYPES.CONE - ? CONFIG.MeasuredTemplate.defaults.angle + ? (angle ?? CONFIG.MeasuredTemplate.defaults.angle) : type === CONFIG.DH.GENERAL.templateTypes.INFRONT ? '180' : undefined; - const baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement[ - range - ]; + let baseDistance = range; + if (Number.isNaN(Number(range))) { + baseDistance = + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement[range]; + } const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance; const { width, height } = game.canvas.scene.dimensions; @@ -69,7 +107,8 @@ export const renderMeasuredTemplate = async event => { t: usedType, distance: distance, width: type === CONST.MEASURED_TEMPLATE_TYPES.RAY ? 5 : undefined, - angle: angle + angle: usedAngle, + direction: direction }; CONFIG.ux.TemplateManager.createPreview(data);