Newer
Older
lostmynuts / shared / js / Engine / Dialogs / PrettyMessageBox.js
@Mark Mark on 29 Jan 2021 4 KB More game structure
class PrettyMessageBox extends Engine.Dialog
{
    //public delegate void MessageBoxCallback(bool doSomething);
    constructor(parentClip /*Drawable*/)
    {
        super(parentClip);

        this.okButton = new Engine.DrawableButton("Button_SimpleGreen", "OK");
        this.cancelButton = new Engine.DrawableButton("Button_SimpleRed", "Cancel");
        this.text = new Engine.DrawableText();
        this.scrollText = new ScrollingTextBox();
        this.boxWidth = 380;
        this.boxHeight = 200;
        this.fixedBoxWidth = 380;
        this.fixedBoxHeight = 200;
        this.callbackFunction = null;
        
        this.background = new Engine.Drawable("BGStandard");
        
        this.text.textAreaWidth = this.boxWidth * 0.75;
        this.text.textAreaHeight = this.boxHeight * 0.75;
        
        this.name = "MessageBox";
        this.background.setNineRect(0.4, 0.4, 0.6, 0.6);
        this.background.width = this.boxWidth;
        this.background.height = this.boxHeight;
        
        this.backgroundBounds = new Engine.Drawable();
        this.backgroundBounds.setAsBox(this.backgroundBounds.graphics, this.boxWidth, this.boxHeight, new Color(0, 0, 0, 127), 1);
        
        this.addChild(this.background);
        this.addChild(this.text);
        
        this.okButton.setWidth(100);
        this.cancelButton.setWidth(100);
        
        var space = (this.boxWidth - this.okButton.width - this.cancelButton.width) / 3;
        
        this.okButton.y = this.boxHeight - (this.okButton.height * 1.5);
        this.okButton.x = space;
        
        this.cancelButton.y = this.okButton.y;
        this.cancelButton.x = this.okButton.x + this.okButton.width + space;
        
        this.addChild(this.okButton);
        this.addChild(this.cancelButton);
        
        this.cancelButton.onClick = () => this.clickedCancel();
        this.okButton.onClick = () => this.clickedOK();
        
        this.dialogWidth = this.boxWidth;
        this.dialogHeight = this.boxHeight;
    }

    clickedCancel()
    {
        if (this.callbackFunction != null) this.callbackFunction(false);
        this.hide();
    }

    clickedOK()
    {
        if (this.callbackFunction != null) this.callbackFunction(true);
        this.hide();
    }

    show(message /*String*/, okText /*String*/, closeText /*String*/, callbackFunction /*Action<bool>*/)
    {
        this.active = true;
        this.callbackFunction = callbackFunction;
        this.parentClip.addChild(this);
        
        this.boxWidth = this.fixedBoxWidth;
        this.boxHeight = this.fixedBoxHeight;
        
        this.background.width = this.boxWidth;
        this.background.height = this.boxHeight;
        
        this.addChild(this.text);
        this.removeChild(this.scrollText);

        this.text.textAreaWidth = this.background.width * 0.75;
        this.text.setText(message, "Arial", 14);
        
        this.okButton.setButtonText(okText);
        this.cancelButton.setButtonText(closeText);
        
        if (closeText == "") this.removeChild(this.cancelButton);
        else this.addChild(this.cancelButton);
        
        if (okText == "") this.removeChild(this.okButton);
        else this.addChild(this.okButton);
                
        this.layout();
        this.showDialog();
    }

    layout()
    {
        //Rect texDims = text.getRect();
        //text.SetTint(Color.blue);
        this.text.x = (this.boxWidth - this.text.width) * 0.5;
        this.text.y = 30;
        
        this.scrollText.x = 10;
        this.scrollText.y = this.text.y;

        var space = (this.boxWidth - this.okButton.width - this.cancelButton.width) * 0.33;
        this.okButton.x = space;
        if (!this.cancelButton.hasParent) this.okButton.x = (this.boxWidth * 0.5 - this.okButton.width * 0.5);
        this.okButton.y = this.boxHeight - (this.okButton.height * 1.5);

        this.cancelButton.x = this.okButton.x + this.okButton.width + space;
        if (!this.okButton.hasParent) this.cancelButton.x = this.boxWidth * 0.5 - this.cancelButton.width * 0.5;
        this.cancelButton.y = this.boxHeight - (this.cancelButton.height * 1.5);

        this.dialogWidth = this.boxWidth;
        this.dialogHeight = this.boxHeight;

        // autosize the box on default view
        if (this.text.y + this.text.height > this.okButton.y)
        {
            this.background.height = this.text.y + this.text.height + this.okButton.height * 2;
            this.dialogHeight = this.background.height;
            this.okButton.y = this.background.height - (this.okButton.height * 1.5);
            this.cancelButton.y = this.okButton.y;
        }
    }
}