diff --git a/module/Apps/ActorSheets/HeroSkillsCardV1.mjs b/module/Apps/ActorSheets/HeroSkillsCardV1.mjs index 9cd0016..36e8ed3 100644 --- a/module/Apps/ActorSheets/HeroSkillsCardV1.mjs +++ b/module/Apps/ActorSheets/HeroSkillsCardV1.mjs @@ -44,12 +44,12 @@ export class HeroSkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin // #region Lifecycle async _onFirstRender(context, options) { await super._onFirstRender(context, options); - HeroSkillsCardV1._createPopoverListeners.bind(this)(); }; async _onRender(context, options) { await super._onRender(context, options); HeroSkillsCardV1._onRender.bind(this)(context, options); + HeroSkillsCardV1._createPopoverListeners.bind(this)(); }; static async _onRender(_context, options) { @@ -84,13 +84,20 @@ export class HeroSkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin /** @type {Map} */ #popoverManagers = new Map(); + /** @type {Map} */ + #hookIDs = new Map(); /** @this {HeroSkillsCardV1} */ static async _createPopoverListeners() { const ammoInfoIcon = this.element.querySelector(`.ammo-info-icon`); + this.#popoverManagers.set( `.ammo-info-icon`, - new PopoverEventManager(ammoInfoIcon, AmmoTracker, { lockable: true }), + new PopoverEventManager(ammoInfoIcon, AmmoTracker), ); + + this.#hookIDs.set(Hooks.on(`get${AmmoTracker.name}Options`, (opts) => { + opts.ammo = this.actor.itemTypes.ammo; + }), `get${AmmoTracker.name}Options`); }; async _preparePartContext(partId, ctx, opts) { @@ -193,6 +200,9 @@ export class HeroSkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin manager.destroy(); }; this.#popoverManagers.clear(); + for (const [id, hook] of this.#hookIDs.entries()) { + Hooks.off(hook, id); + } super._tearDown(options); }; // #endregion diff --git a/module/utils/PopoverEventManager.mjs b/module/utils/PopoverEventManager.mjs index b4b9751..4bb8cf1 100644 --- a/module/utils/PopoverEventManager.mjs +++ b/module/utils/PopoverEventManager.mjs @@ -1,5 +1,4 @@ import { getTooltipDelay } from "../consts.mjs"; -import { Logger } from "./Logger.mjs"; export class PopoverEventManager { #options; @@ -64,16 +63,22 @@ export class PopoverEventManager { #frameless; #framed; + #construct(options) { + const valid = Hooks.call(`get${this.#class.name}Options`, options); + if (!valid) { return }; + return new this.#class(options); + }; + #clickHandler() { // Cleanup for the frameless lifecycle this.stopOpen(); + this.stopClose(); this.#frameless?.close({ force: true }); if (!this.#framed) { - const app = new this.#class({ popover: { ...this.#options, framed: true } }); - this.#framed = app; + this.#framed = this.#construct({ popover: { ...this.#options, framed: true } }); } - this.#framed.render({ force: true }); + this.#framed?.render({ force: true }); }; #pointerEnterHandler(event) { @@ -104,14 +109,14 @@ export class PopoverEventManager { return; } - this.#frameless = new this.#class({ + this.#frameless = this.#construct({ popover: { ...this.#options, framed: false, x, y, }, }); - this.#frameless.render({ force: true }); + this.#frameless?.render({ force: true }); }, getTooltipDelay(), );