Newer
Older
lostmynuts / shared / js / Engine / Dialogs / DialogLayer.js
Engine.DialogLayer = class extends Engine.Drawable
{

    constructor(name)
    {
        super();
        this.name = name;

        this.activeBlockers = 0;
        this.updateCallback = null;

        this.blockers = [];
    }


    resolutionChanged(width, height)
    {
        for (var i = 0; i < this.blockers.length; i++)
        {
            this.blockers[i].draw(EngineSettings.screenWidth, EngineSettings.screenHeight);
        }
    }

    addChild(child)
    {
        super.addChild(child);
        if (!child.isBlocker) this.updateBlockers();
    }

    addChildAt(child, index)
    {
        super.addChildAt(child, index);
        if (!child.isBlocker) this.updateBlockers();
    }

    removeChild(child)
    {
        super.removeChild(child);
        if (!child.isBlocker) this.updateBlockers();
    }

    removeChildAt(index)
    {
        var child = this.getChildAt(index);
        super.removeChildAt(index);
        if (!child.isBlocker) this.updateBlockers();
    }

    getTopDialog()
    {
        for (var i = this.children.length - 1; i >= 0; i--)
        {
            var drawableChild = this.getChildAt(i);
            if (drawableChild.isDialog) return drawableChild;
        }
        return null;
    }

    updateBlockers()
    {
        var len = this.blockers.length;
        this.bottomChildren = [];
        for (var i = this.children.length - 1; i >= 0; i--)
        {
            var child = this.getChildAt(i);
            if (child.isDialog && !child.alwaysOnBottom && child.blockerInfo != null)
            {
                var blockerInfo = child.blockerInfo;

                var found = false;
                for (var j = 0; j < this.blockers.length; j++)
                {
                    if (blockerInfo.equals(this.blockers[j].blockerInfo))
                    {
                        found = true;
                        if (!this.blockers[j].used)
                        {
                            var index = this.getChildIndex(this.blockers[j]);
                            if (index + 1 != i)
                            {
                                this.addChildAt(this.blockers[j], index < i ? i - 1 : i);
                            }
                            this.blockers[j].used = true;
                        }
                        break;
                    }
                }

                if (!found)
                {
                    var block = new Engine.DialogBlocker();
                    block.blockerInfo = new Engine.DialogBlockerInfo();
                    if (blockerInfo != null) 
                    {
                        block.blockerInfo.color = blockerInfo.color;
                        block.blockerInfo.alpha = blockerInfo.alpha;
                    }
                    block.drawFullScreen();
                    this.addChildAt(block, i);
                    block.used = true;
                    this.blockers.push(block);
                }

            }
            else if (child != null && child.alwaysOnBottom == true)
            {
                this.bottomChildren.push(child);
            }
        }

        for (var i = 0; i < this.bottomChildren.length; i++)
        {
            this.setChildIndex(this.bottomChildren[i], 0);
        }

        var count = 0;
        this.activeBlockers = 0;
        for (var i = 0; i < this.blockers.length; i++)
        {
            if (!this.blockers[i].used)
            {
                this.removeChild(this.blockers[i]);
                this.blockers[i].used = false;
                this.blockers.remove(this.blockers[i]);
                i--;
                count++;
            }
            else
            {
                this.activeBlockers++;
                this.blockers[i].used = false;
            }
        }

        

    }

}