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/countdowns.mjs b/module/applications/countdowns.mjs index 8f7c1cbf..0eac145f 100644 --- a/module/applications/countdowns.mjs +++ b/module/applications/countdowns.mjs @@ -48,8 +48,8 @@ class Countdowns extends HandlebarsApplicationMixin(ApplicationV2) { super._attachPartListeners(partId, htmlElement, options); htmlElement.querySelectorAll('.mini-countdown-container').forEach(element => { - element.addEventListener('click', event => this.updateCountdownValue.bind(this)(event, true)); - element.addEventListener('contextmenu', event => this.updateCountdownValue.bind(this)(event, false)); + element.addEventListener('click', event => this.updateCountdownValue.bind(this)(event, false)); + element.addEventListener('contextmenu', event => this.updateCountdownValue.bind(this)(event, true)); }); } diff --git a/module/applications/sheets/character.mjs b/module/applications/sheets/character.mjs index c2fc28a6..468d9379 100644 --- a/module/applications/sheets/character.mjs +++ b/module/applications/sheets/character.mjs @@ -25,7 +25,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { toggleStress: this.toggleStress, toggleHope: this.toggleHope, toggleGold: this.toggleGold, - attackRoll: this.attackRoll, + toggleLoadoutView: this.toggleLoadoutView, useDomainCard: this.useDomainCard, removeCard: this.removeDomainCard, selectClass: this.selectClass, @@ -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', @@ -547,14 +547,10 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { await this.document.update({ [update]: newValue }); } - static async attackRoll(event, button) { - const weapon = await fromUuid(button.dataset.weapon); - if (!weapon) return; - - const wasUsed = await weapon.use(event); - if (wasUsed) { - Hooks.callAll(SYSTEM.HOOKS.characterAttack, {}); - } + static async toggleLoadoutView(_, button) { + const newAbilityView = !(button.dataset.value === 'true'); + await game.user.setFlag(SYSTEM.id, SYSTEM.FLAGS.displayDomainCardsAsList, newAbilityView); + this.render(); } static levelManagement() { @@ -644,10 +640,13 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { (await game.packs.get('daggerheart.communities'))?.render(true); } - static 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); - item.use({}); + const wasUsed = await item.use(event); + if (wasUsed && item.type === 'weapon') { + Hooks.callAll(SYSTEM.HOOKS.characterAttack, {}); + } } static async viewObject(element, button) {