reldens
Version:
Reldens - MMORPG Platform
86 lines (79 loc) • 3.05 kB
JavaScript
/**
*
* Reldens - UiFactory
*
* Factory class for creating standardized UI dialog boxes in Phaser scenes. Provides a unified
* interface for creating DOM-based dialogs with open/close buttons, event callbacks, depth
* management, and event emission for plugin hooks.
*
*/
const { GameConst } = require('../constants');
/**
* @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader
*/
class UiFactory
{
/**
* @param {ScenePreloader} uiScene
*/
constructor(uiScene)
{
this.uiScene = uiScene;
this.gameManager = this.uiScene.gameManager;
}
/**
* @param {string} uiCodeName
* @param {number} depth
* @param {boolean} defaultOpen
* @param {boolean} defaultClose
* @param {function(): void} [openCallback]
* @param {function(): void} [closeCallback]
*/
create(uiCodeName, depth, defaultOpen, defaultClose, openCallback, closeCallback)
{
// @TODO - BETA - Replace by UserInterface.
let {uiX, uiY} = this.uiScene.getUiConfig(uiCodeName);
let dialogBox = this.uiScene.add.dom(uiX, uiY).createFromCache(uiCodeName);
let openButton = dialogBox.getChildByProperty('id', uiCodeName+GameConst.UI_OPEN);
let closeButton = dialogBox.getChildByProperty('id', uiCodeName+GameConst.UI_CLOSE);
openButton?.addEventListener('click', () => {
// @TODO - BETA - Replace styles classes.
let dialogContainer = dialogBox.getChildByProperty('id', uiCodeName+'-ui');
if(defaultOpen){
if(dialogContainer){
dialogContainer.style.display = 'block';
}
openButton.style.display = 'none';
dialogBox.setDepth(depth);
}
if(openCallback && 'function' === typeof (openCallback)){
openCallback();
}
this.gameManager.events.emit(
'reldens.openUI',
{ui: this, openButton, dialogBox, dialogContainer, uiScene: this.uiScene}
);
});
closeButton?.addEventListener('click', () => {
let dialogContainer = dialogBox.getChildByProperty('id', uiCodeName+'-ui');
if(defaultClose){
if(dialogContainer){
dialogContainer.style.display = 'none';
}
dialogBox.setDepth(1);
if(openButton){
openButton.style.display = 'block';
}
}
if(closeCallback && 'function' === typeof (closeCallback)){
closeCallback();
}
this.gameManager.events.emit(
'reldens.closeUI',
{ui: this, closeButton, openButton, dialogBox, dialogContainer, uiScene: this.uiScene}
);
});
this.uiScene.elementsUi[uiCodeName] = dialogBox;
}
}
module.exports.UiFactory = UiFactory;