var DrawableButtonStatics = {}; DrawableButtonStatics.MinClickRegionPosition = {"CENTER": 0, "LEFT_ALIGN": 1, "Right_ALIGN": 2} Engine.DrawableButton = class extends Engine.Drawable { constructor(graphicName, text) { super(); if (graphicName === undefined) graphicName = ""; if (text === undefined) text = ""; this.onClick = null; this._isTwoStateToggle = false; this._isToggle = false; this._toggled = false; this.mousedOver = false; this.disabledFrame = 0; this.normalFrame = 1; this.hoverFrame = 2; this.toggledStateNormalFrame = 3; this.toggledStateHoverFrame = 4; this._bySequence = false; this.matchTextSize = true; this.constrainText = false; this.minAutoWidth = 60; this._enabled = true; this.desiredFrame = 1; this.clickRegionDebugClip; this.showClickRegionDebug = false; this._minimumClickRegionSize = 40; this.clickRegionPosition = DrawableButtonStatics.MinClickRegionPosition.CENTER; this.sized = false; this.textOffsetX = 0; this.textOffsetY = -2; this.shadowOffsetX = 1; this.shadowOffsetY = 1; this.showClickHighlight = true; this.fadeTime = 0.5; this.highlightFadeTween = new Engine.SimpleTween(); this._text = new Engine.DrawableText; this._text.setDropShadow(); this.backgroundHighlight = new Engine.Drawable(); this.backgroundHighlight.additive = true; this.background = new Engine.Drawable(); this.backgroundDelight = new Engine.Drawable(); this.backgroundDelight.x = 2; this.backgroundDelight.alpha = 0.4; this.dulled = false; // this.background.interactive = true; // this.background.on('pointertap', (event) => { this.clicked(event); } ); // this.background.on('pointerover', (event) => { this.mouseOver(event); } ); // this.background.on('pointerout', (event) => { this.mouseOut(event); } ); // this.background.on('pointerdown', (event) => { this.mouseDown(event); } ); // this.background.on('pointerup', (event) => { this.mouseUp(event); } ); this.background.mouseEnabled = true; this.background.events.onClick.addListener(this, this.clicked); this.background.events.onMouseOver.addListener(this, this.mouseOver); this.background.events.onMouseOut.addListener(this, this.mouseOut); this.background.events.onMouseDown.addListener(this, this.mouseDown); this.background.events.onMouseUp.addListener(this, this.mouseUp); this.iconIsSet = false; this.iconInset = 3; this._iconOffsetX = 0; this._iconOffsetY = 0; this.icon = null; this.repeatOnHold = false; this.repeatOnHoldTime = 0.5; this.repeatOnHoldRatePerSecond = 4; this.clickAndHoldTimer = 0; if (graphicName && graphicName != "") { this.init(graphicName, text); } } get text() { return this._text; } get isTwoStateToggle() { return this._isTwoStateToggle; } set isTwoStateToggle(value) { this._isTwoStateToggle = value; if (this._isTwoStateToggle) this._isToggle = false; this._toggled = false; this.calculateFrame(); } get isToggle() { return this._isToggle; } set isToggle(value) { this._isToggle = value; if (this._isToggle) this._isTwoStateToggle = false; this._toggled = false; this.calculateFrame(); } get toggled(){ return this._toggled; } set toggled(value) { this._toggled = value; this.calculateFrame(); } get bySequence() { return this._bySequence; } set bySequence(value) { this._bySequence = value; this.calculateFrame(); } calculateFrame() { var frame; if (this.enabled) { if (this.isTwoStateToggle) { frame = this.toggled ? this.toggledStateNormalFrame : this.normalFrame; if (this.mousedOver) frame = this.toggled ? this.toggledStateHoverFrame : this.hoverFrame; } else { frame = this.normalFrame; if (this.isToggle && !this.toggled) frame = this.disabledFrame; if (this.mousedOver) frame = this.hoverFrame; } } else { frame = this.disabledFrame; if (this.isToggle && this.toggled) frame = this.normalFrame; } if (!this.bySequence) { if (frame != this.background.frame) this.background.gotoAndStop(frame); } else { if (frame != this.background.sequence) this.background.setSequence(frame); } } get enabled() { return this._enabled; } set enabled(value) { this._enabled = value; this.calculateFrame(); } init(bgGraphicName, text, font, fontSize) { if (text === undefined) text = ""; if (font === undefined) font = "Tiamat"; if (fontSize === undefined) fontSize = 14; this.name = "Button_" + text; this.background.onGraphicLoaded.setListener(this, (graphic) => { this.background_OnGraphicLoaded(graphic); }); this.background.setGraphicDataByName(bgGraphicName); this.setButtonText(text, font, fontSize); this.addChild(this.background); this.addChild(this._text); this.calculateFrame(); } setBackgroundGraphic(bgGraphicName) { this.background.loadFromGraphicName(bgGraphicName); } background_OnGraphicLoaded(drawable) { this.resizeClickRegion(); } get minimumClickRegionSize() { return this._minimumClickRegionSize; } set minimumClickRegionSize(value) { this._minimumClickRegionSize = value; this.resizeClickRegion(); } resizeClickRegion() { if (this.clickRegionDebugClip != null && this.clickRegionDebugClip.parent != null) { this.clickRegionDebugClip.parent.removeChild(this.clickRegionDebugClip); } var clickRect = this.background.getLocalBounds(); if (clickRect.width < this.minimumClickRegionSize) { var difx = this.minimumClickRegionSize - Math.floor(clickRect.width); if (this.clickRegionPosition == DrawableButtonStatics.MinClickRegionPosition.CENTER) { var ratio = (clickRect.left / clickRect.width); if (Math.abs(clickRect.left) < 5) ratio = -0.5; var leftDif = Math.floor(ratio * difx); clickRect.x += leftDif; // difx / 2; } else if (this.clickRegionPosition == DrawableButtonStatics.MinClickRegionPosition.LEFT_ALIGN) { // DO NOTHING } else if (this.clickRegionPosition == DrawableButtonStatics.MinClickRegionPosition.RIGHT_ALIGN) { clickRect.x -= difx; } clickRect.width = this.minimumClickRegionSize; } if (clickRect.height < this.minimumClickRegionSize) { var dify = this.minimumClickRegionSize - Math.floor(clickRect.height); var ratio = (clickRect.top / clickRect.height); if (Math.abs(clickRect.top) < 5) ratio = -0.5; var topDif = Math.floor(ratio * dify); clickRect.y += topDif;// dify / 2; clickRect.height = this.minimumClickRegionSize; } this.background.hitArea = clickRect; this.fixHighlight(); if (this.showClickRegionDebug) { if (this.clickRegionDebugClip == null) this.clickRegionDebugClip = new PIXI.Graphics(); this.background.addChild(this.clickRegionDebugClip); this.clickRegionDebugClip.x = clickRect.x; this.clickRegionDebugClip.y = clickRect.y; this.clickRegionDebugClip.clear(); this.clickRegionDebugClip.beginFill(0xFFFFFF, 0.5); this.clickRegionDebugClip.drawRect(0, 0, Math.floor(clickRect.width), Math.floor(clickRect.height)); } } fixHighlight() { if (this.backgroundHighlight.graphicName != this.background.graphicName) { this.backgroundHighlight.setGraphicDataByName(this.background.graphicName); } if (this.sized) { this.backgroundHighlight.setNineRect(); this.backgroundHighlight.additive = true; this.backgroundHighlight.width = this.background.width; this.backgroundHighlight.height = this.background.height; } } setButtonText(text, font, fontSize, align) { if (font === undefined) font = "Tiamat"; if (fontSize === undefined) fontSize = 14; if (align === undefined) this._text.setText(text, font, fontSize); else this._text.setText(text, font, fontSize, align); var textWidth = this.constrainText ? this._text.textAreaWidth : this._text.width; this._text.x = this.textOffsetX + (this.background.width - textWidth) / 2; this._text.y = this.textOffsetY + (this.background.height - this._text.height) / 2; if (text && text.length > 0 && this.matchTextSize) { this.setWidth(Math.floor(Math.max(this.minAutoWidth, this._text.width + 10))); } this._text.x = Math.floor(this._text.x); this._text.y = Math.floor(this._text.y); } setDimensions(width, height) { if (width === undefined) width = -1; if (height === undefined) height = -1; this.setWidth(width); this.setHeight(height); } setWidth(width) { this.sized = true; this.background.setNineRect(); this.background.width = width; this.backgroundDelight.setAsBox(this.backgroundDelight.graphics, Math.floor(this.background.width) - 3, Math.floor(this.background.height) - 3, Colors.grey, 1); //this.background.cacheAsBitmap = true; var textWidth = this._text.width; this._text.x = this.textOffsetX + (this.background.width - textWidth) / 2; this._text.y = this.textOffsetY + (this.background.height - this._text.height) / 2; if (this.iconIsSet) { this.setIconSize(Math.floor(this.background.width), Math.floor(this.background.height), this.iconInset); } this.resizeClickRegion(); //this._text.x = Math.floor(this._text.x); //this._text.y = Math.floor(this._text.y); } setHeight(height) { this.sized = true; this.background.setNineRect(); this.background.height = height; this.backgroundDelight.setAsBox(this.backgroundDelight.graphics, Math.floor(this.background.width) - 3, Math.floor(this.background.height) - 3, Colors.grey, 1); this._text.x = this.textOffsetX + (this.background.width - this._text.width) / 2; this._text.y = this.textOffsetY + (this.background.height - this._text.height) / 2; if (this.iconIsSet) { this.setIconSize(Math.floor(this.background.width), Math.floor(this.background.height), this.iconInset); } this.resizeClickRegion(); //this._text.x = Math.floor(this._text.x); //this._text.y = Math.floor(this._text.y); } get width() { return this.background.width; } get height() { return this.background.height; } // ============= Icon Stuff ========================== get iconOffsetX() { return this._iconOffsetX; } set iconOffsetX(value) { this._iconOffsetX = value; this.icon.x = this.iconInset + value; } get iconOffsetY() { return this._iconOffsetY; } set iconOffsetY(value) { this._iconOffsetY = value; this.icon.y = this.iconInset + value; } setIcon(icon, inset) { if (inset === undefined) inset = 3; if (this.icon == null) this.icon = new Engine.UniformScaleGraphic(); this.iconInset = inset; if (Number.isInteger(icon)) { this.icon.setGraphicByID(icon); } else { this.icon.setGraphicByName(icon); } this.setIconInternal(); } setIconInternal() { this.setIconSize(Math.floor(this.background.width), Math.floor(this.background.height), this.iconInset); this.addChild(this.icon); this.icon.greyscale = !this.enabled; this.iconIsSet = true; } removeIcon() { if (this.icon == null) return; this.removeChild(this.icon); this.iconIsSet = false; } setIconSize(width, height, inset) { if (this.icon == null) return; this.icon.setSize(width - inset * 2, height - inset * 2); this.icon.x = inset + this.iconOffsetX; this.icon.y = inset + this.iconOffsetY; } // ============= Highlight stuff ========================== showHighlight() { if (this.highlightFadeTween.active) this.highlightFadeTween.stop(); this.backgroundHighlight.gotoAndStop(this.background.frame); this.backgroundHighlight.alpha = 1; this.addChildAt(this.backgroundHighlight, this.getChildIndex(this.background) + 1); } fadeHighlight() { this.highlightFadeTween.init( (a) => { this.backgroundHighlight.alpha = a;}, Engine.SimpleTween.easeLinear, 1, 0, this.fadeTime); this.highlightFadeTween.onFinish = () => { this.highlightFaded(); }; } highlightFaded() { this.removeChild(this.backgroundHighlight); } // ============= Dull stuff ========================== showDelight() { if (this.dulled) return; this.dulled = true; if (this.backgroundHighlight.hasParent) { this.addChildAt(this.backgroundDelight, this.getChildIndex(this.backgroundHighlight) + 1); } else { this.addChildAt(this.backgroundDelight, this.getChildIndex(this.background) + 1); } } hideDelight() { if (!this.dulled) return; this.dulled = false; this.removeChild(this.backgroundDelight); } ///============== Mouse Events ============================= clicked(d) { if (!this.enabled) return; if (this.isToggle || this.isTwoStateToggle) { this.toggled = !this.toggled; this.mousedOver = false; this.calculateFrame(); } if (this.onClick != null) this.onClick(); //Engine.SoundPlayerInstance.playSound(13, 0.5); 13 is baaad } mouseOver(d) { this.mousedOver = true; this.calculateFrame(); if (this.enabled) Engine.SoundPlayerInstance.playSound(15, 0.5); } mouseDown(d) { if (this.enabled && this.showClickHighlight) { Engine.Mouse.addEventListener("mouseup", this, this.globalMouseUp); this.showHighlight(); if (this.repeatOnHold) this.startClickAndHold(); } } mouseUp(d) { //this.fadeHighlight(); //this.globalMouseUp(); } globalMouseUp(v) { Engine.Mouse.removeEventListener("mouseup", this); this.fadeHighlight(); if (this.repeatOnHold) this.stopClickAndHold(); } mouseOut(d) { this.mousedOver = false; this.calculateFrame(); } startClickAndHold() { this.clickAndHoldTimer = 1 / this.repeatOnHoldRatePerSecond; Engine.EnterFrameManagerInstance.add(this, this.updateClickAndHold); } updateClickAndHold(dt) { this.clickAndHoldTimer += dt; if (this.clickAndHoldTimer > this.repeatOnHoldTime + (1 / this.repeatOnHoldRatePerSecond)) { this.clicked(null); this.clickAndHoldTimer = this.repeatOnHoldTime; } } stopClickAndHold() { Engine.EnterFrameManagerInstance.remove(this); } }