diff --git a/module.js b/module.js index 97e67e8..0802b86 100644 --- a/module.js +++ b/module.js @@ -232,13 +232,9 @@ Hooks.once("ready", () => { if (adapter.users.isGM() && game.webrtc !== null) { roleRenderer.openStrip(); - // Story 3.2: Create StripOverlayLayer AFTER ScryingPoolStrip is created - // (ScryingPoolStrip is created lazily in roleRenderer.openStrip() above) - stripOverlayLayer = new StripOverlayLayer(adapter); - stripOverlayLayer.init(); - // Story 3.2: Create ConfirmationBar for preset apply feedback (GM only) - confirmationBar = new ConfirmationBar(adapter, visibilityManager, socketHandler, stripOverlayLayer); + // Pass roleRenderer to access ScryingPoolStrip.stripOverlayLayer (created lazily) + confirmationBar = new ConfirmationBar(adapter, visibilityManager, socketHandler, roleRenderer); confirmationBar.init(); } diff --git a/src/ui/RoleRenderer.js b/src/ui/RoleRenderer.js index b80d47e..08bc3d0 100644 --- a/src/ui/RoleRenderer.js +++ b/src/ui/RoleRenderer.js @@ -24,6 +24,14 @@ export class RoleRenderer { this._strip = null; } + /** + * Returns the ScryingPoolStrip instance (GM only). + * @returns {ScryingPoolStrip|null} The strip instance. + */ + get strip() { + return this._strip; + } + /** * Registers Hooks listeners. Must be called once during module ready. */ diff --git a/src/ui/gm/ConfirmationBar.js b/src/ui/gm/ConfirmationBar.js index 757ed9e..76ebdad 100644 --- a/src/ui/gm/ConfirmationBar.js +++ b/src/ui/gm/ConfirmationBar.js @@ -25,14 +25,30 @@ export class ConfirmationBar { * Injected VisibilityManager for reverting matrix on undo. * @param {import('../../core/SocketHandler.js').SocketHandler} socketHandler * Injected SocketHandler (for potential future use). - * @param {import('../shared/StripOverlayLayer.js').StripOverlayLayer} stripOverlayLayer - * Injected StripOverlayLayer for rendering. + * @param {import('./ScryingPoolStrip.js').ScryingPoolStrip|import('../shared/StripOverlayLayer.js').StripOverlayLayer} stripOverlayLayerOrStrip + * Injected ScryingPoolStrip (which provides stripOverlayLayer) or StripOverlayLayer directly. */ - constructor(adapter, visibilityManager, socketHandler, stripOverlayLayer) { + constructor(adapter, visibilityManager, socketHandler, stripOverlayLayerOrStrip) { this._adapter = adapter; this._visibilityManager = visibilityManager; this._socketHandler = socketHandler; - this._stripOverlayLayer = stripOverlayLayer; + + // Extract StripOverlayLayer from the provided source + // Can be: ScryingPoolStrip, RoleRenderer (with .strip), or StripOverlayLayer directly + let source = stripOverlayLayerOrStrip; + + // If it's a RoleRenderer, get the strip from it + if (source && source.strip && source.strip?.stripOverlayLayer) { + source = source.strip; + } + + // If it's a ScryingPoolStrip, get its stripOverlayLayer + if (source && source.stripOverlayLayer) { + this._stripOverlayLayer = source.stripOverlayLayer; + } else { + // Direct StripOverlayLayer + this._stripOverlayLayer = source; + } // State /** @type {object|null} */ diff --git a/src/ui/gm/ScryingPoolStrip.js b/src/ui/gm/ScryingPoolStrip.js index ede01e2..ad5f089 100644 --- a/src/ui/gm/ScryingPoolStrip.js +++ b/src/ui/gm/ScryingPoolStrip.js @@ -1,6 +1,7 @@ // @ts-nocheck /* global Application, directorsBoard */ import { generateOpId } from '../../utils/uuid.js'; +import { StripOverlayLayer } from '../shared/StripOverlayLayer.js'; /** * Canonical action labels — never use inline string literals. @@ -117,6 +118,20 @@ export class ScryingPoolStrip extends _AppBase { this._isExpanded = true; /** @type {ActionPopover|null} */ this._activePopover = null; + /** @type {StripOverlayLayer|null} */ + this._stripOverlayLayer = null; + } + + /** + * Returns the StripOverlayLayer instance, creating it lazily if needed. + * @returns {StripOverlayLayer} The overlay layer instance. + */ + get stripOverlayLayer() { + if (!this._stripOverlayLayer) { + this._stripOverlayLayer = new StripOverlayLayer(this._adapter); + this._stripOverlayLayer.init(); + } + return this._stripOverlayLayer; } /** @inheritdoc */