From 992afd4d9401a28f307d766c9b3f785031957e71 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sat, 28 Jun 2025 12:59:11 +0200 Subject: [PATCH] Added DHContextMenu to pass on the event from clicking a contextmenuitem --- daggerheart.mjs | 1 + module/applications/_module.mjs | 1 + module/applications/contextMenu.mjs | 24 ++++++++++++++++++++++++ module/applications/sheets/character.mjs | 8 ++++---- 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 module/applications/contextMenu.mjs diff --git a/daggerheart.mjs b/daggerheart.mjs index 99eceed5..239b307d 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -112,6 +112,7 @@ Hooks.once('init', () => { CONFIG.Token.rulerClass = DhpTokenRuler; CONFIG.ui.resources = Resources; + CONFIG.ux.ContextMenu = applications.DhContextMenu; game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent); diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index 85a7d7ed..c9f5ddc6 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -13,5 +13,6 @@ export { default as DhpArmor } from './sheets/items/armor.mjs'; export { default as DhpChatMessage } from './chatMessage.mjs'; export { default as DhpEnvironment } from './sheets/environment.mjs'; export { default as DhActiveEffectConfig } from './sheets/activeEffectConfig.mjs'; +export { default as DhContextMenu } from './contextMenu.mjs'; export * as api from './sheets/api/_modules.mjs'; diff --git a/module/applications/contextMenu.mjs b/module/applications/contextMenu.mjs new file mode 100644 index 00000000..68c6fee4 --- /dev/null +++ b/module/applications/contextMenu.mjs @@ -0,0 +1,24 @@ +export default class DhContextMenu extends ContextMenu { + constructor(container, selector, menuItems, options) { + super(container, selector, menuItems, options); + + /** @deprecated since v13 until v15 */ + this.#jQuery = options.jQuery; + } + + #jQuery; + + activateListeners(menu) { + menu.addEventListener('click', this.#onClickItem.bind(this)); + } + + #onClickItem(event) { + event.preventDefault(); + event.stopPropagation(); + const element = event.target.closest('.context-item'); + if (!element) return; + const item = this.menuItems.find(i => i.element === element); + item?.callback(this.#jQuery ? $(this.target) : this.target, event); + this.close(); + } +} diff --git a/module/applications/sheets/character.mjs b/module/applications/sheets/character.mjs index d6974a42..468d9379 100644 --- a/module/applications/sheets/character.mjs +++ b/module/applications/sheets/character.mjs @@ -222,7 +222,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { useItem: { name: 'DAGGERHEART.Sheets.PC.ContextMenu.UseItem', icon: '', - callback: this.constructor.useItem.bind(this) + callback: (element, event) => this.constructor.useItem.bind(this)(event, element) }, equip: { name: 'DAGGERHEART.Sheets.PC.ContextMenu.Equip', @@ -640,10 +640,10 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { (await game.packs.get('daggerheart.communities'))?.render(true); } - static async useItem(element, button) { - const id = (button ?? element).closest('a').id, + static async useItem(event, button) { + const id = button.closest('a').id, item = this.document.items.get(id); - const wasUsed = await item.use({}); + const wasUsed = await item.use(event); if (wasUsed && item.type === 'weapon') { Hooks.callAll(SYSTEM.HOOKS.characterAttack, {}); }