var GraphicViewerStatics = {}; GraphicViewerStatics.ItemHeight = 80; class GraphicViewerItem extends Engine.Drawable { constructor() { super(); this.updateTimer = new Engine.SimpleTimer(); this.graphic = new Engine.UniformScaleGraphic(GraphicViewerStatics.ItemHeight - 10, GraphicViewerStatics.ItemHeight - 30, 3); this.graphic.x = 5; this.graphic.y = 5; this.name = new Engine.DrawableText(); this.name.x = 5; this.name.y = GraphicViewerStatics.ItemHeight - 20; this.addChild(this.graphic); this.addChild(this.name); this.mouseEnabled = true; this.hitArea = new PIXI.Rectangle(0, 0, 200, GraphicViewerStatics.ItemHeight); this.onClick = null; this.events.onClick.addListener(this, this.clicked); } clicked() { if (this.onClick) this.onClick(this.graphicDef); } init(graphicDef) { this.clear(); this.graphicDef = graphicDef; this.updateTimer.start(0.3, this.update.bind(this)); this.name.setText((graphicDef.id == -1 ? "" : "(" + graphicDef.id + ") ") + graphicDef.name, "Verdana", 9); } update() { this.graphic.setGraphicByName(this.graphicDef.name); } clear() { this.updateTimer.stop(); this.graphic.clear(); } } class GraphicViewer extends Engine.Dialog { //public delegate void MessageBoxCallback(bool doSomething); constructor(parentClip /*Drawable*/) { super(parentClip); this.name = "GraphicViewer"; this.boxWidth = 1000; this.boxHeight = 600; this.callbackFunction = null; this.background = new ShardsStyleDialogBackground(); this.background.init(this.boxWidth, this.boxHeight, "Graphics", () => { this.closeClicked();} ); this.addChild(this.background); this.clickBackgroundToClose = true; this.dialogWidth = this.boxWidth; this.dialogHeight = this.boxHeight; this.scrollPool = new Engine.ObjectPool(GraphicViewerItem); this.graphicWindow = new Engine.ScrollWindow(); this.graphicWindow.displayItemSource = (data) => this.getGraphicScrollItem(data); this.graphicWindow.displayItemReturn = (item) => this.returnGraphicScrollItem(item); this.graphicWindow.x = 25; this.graphicWindow.y = 40; this.graphicWindow.layout(200, this.boxHeight - 50, 1); this.graphicWindow.scrollPane.onScroll.addListener(this, this.paneScrolled); this.addChild(this.graphicWindow); this.updateFilterTimer = new Engine.SimpleTimer(); this.filterHolder = document.createElement("div"); this.filterHolder.innerHTML = "<input type=text id=graphicFilter placeholder='Graphic Filter' style='width:100%'>"; this.filterText = getChildById(this.filterHolder, "graphicFilter"); this.filterText.onfocus = () => KeyboardManager.disable(); this.filterText.onblur = () => KeyboardManager.enable(); this.filterHolder.style.position = "absolute"; this.filterHolder.style.padding = "4px 4px 4px 4px"; this.filterHolder.style.backgroundColor = "#000000"; this.filterHolder.style.width = "400px"; this.graphicDefsToShow = []; this.scrollIndex = 0; this.scrollContinuePercent = 0.8; this.initScroll(true); this.filterText.onchange = () => this.filterChanged(); this.filterText.oninput = () => this.filterChanged(); this.graphic = new Engine.Drawable(); this.addChild(this.graphic); this.playButton = new Engine.DrawableButton("Button_SimpleGreen", "|>"); this.playButton.setDimensions(30, 30); this.playButton.onClick = () => this.clickedPlay(); this.nextSequenceButton = new Engine.DrawableButton("Button_SimpleGreen", ">>"); this.nextSequenceButton.setDimensions(30, 30); this.nextSequenceButton.onClick = () => this.clickedNextSequence(); this.prevSequenceButton = new Engine.DrawableButton("Button_SimpleGreen", "<<"); this.prevSequenceButton.setDimensions(30, 30); this.prevSequenceButton.onClick = () => this.clickedPrevSequence(); this.addChild(this.playButton); this.addChild(this.nextSequenceButton); this.addChild(this.prevSequenceButton); this.frameText = new Engine.DrawableText(); this.addChild(this.frameText); this.layout(this.boxWidth, this.boxHeight); this.showDef(null); } clickedPlay(forcePlayStop = undefined) { if (this.graphic.playing || forcePlayStop === false) { this.graphic.stop(); this.playButton.setButtonText("|>"); this.playButton.setDimensions(30, 30); this.playButton.enabled = this.graphic.numFrames > 1; } else if (!this.graphic.playing || forcePlayStop === true) { this.graphic.play(); this.playButton.setButtonText("||"); this.playButton.setDimensions(30, 30); } } clickedPrevSequence() { this.graphic.setSequence((this.graphic.sequence - 1 + this.graphics.numSequences) % this.graphic.numSequences); this.playButton.enabled = this.graphic.numFrames > 1; } clickedNextSequence() { this.graphic.setSequence((this.graphic.sequence + 1) % this.graphic.numSequences); this.playButton.enabled = this.graphic.numFrames > 1; } paneScrolled() { let scrollHeight = this.graphicWindow.scrollPane.getScrollHeight(); if (this.scrollIndex < this.graphicDefsToShow.length && this.graphicWindow.scrollPane.currentScrollAmount >= scrollHeight * this.scrollContinuePercent) { this.initScroll(false); this.graphicWindow.scrollPane.setScrollPercentFromScrollAmount(); this.graphicWindow.scrollBar.updateScrollPos(); this.graphicWindow.scrollBar.beginDragScroll(); this.scrollContinuePercent = 1 - (1 - this.scrollContinuePercent) * 0.9; } } initScroll(resetScroll) { if (resetScroll) { this.scrollContinuePercent = 0.8; this.graphicWindow.clear(); this.scrollIndex = 0; let filter = this.filterText.value.toLowerCase().trim(); let filterNum = 0; if (filter.length == 0) { filter = null; } else { filterNum = parseInt(filter); try { filter = new RegExp(filter, "gi"); } catch { filter = null; } } this.graphicDefsToShow = Object.values(Engine.GraphicFactoryInstance.graphicDataByName).sort((a, b) => a.id - b.id).filter( g => !filter || filter.test(g.name.toLowerCase()) || filterNum == g.id ); } let limit = Math.min(this.scrollIndex + 2500, this.graphicDefsToShow.length); for (let i = this.scrollIndex; i < limit; i++) { this.scrollIndex++; this.graphicWindow.addItem(this.graphicDefsToShow[i], 200, GraphicViewerStatics.ItemHeight); } } filterChanged() { this.updateFilterTimer.start(0.25, () => this.filterUpdated()); } filterUpdated() { this.initScroll(true); } positionFilter() { let loc = this.localToGlobal(new Vector2(300, 60)); this.filterHolder.style.left = loc.x + "px"; this.filterHolder.style.top = loc.y + "px"; } getGraphicScrollItem(graphicDef) { let item = this.scrollPool.getNextObject(); item.init(graphicDef); item.onClick = this.clickedItem.bind(this); return item; } clickedItem(graphicDef) { this.showDef(graphicDef); } showDef(graphicDef) { if (graphicDef) { this.graphic.loadFromGraphicName(graphicDef.name); this.graphic.setSequence(0); this.graphic.gotoAndStop(0); this.clickedPlay(false); this.prevSequenceButton.enabled = this.graphic.numSequences > 1; this.nextSequenceButton.enabled = this.graphic.numSequences > 1; } else { this.graphic.clearSprite(); this.playButton.setButtonText("|>"); this.playButton.setDimensions(30, 30); this.prevSequenceButton.enabled = false; this.nextSequenceButton.enabled = false; } } returnGraphicScrollItem(item) { item.clear(); this.scrollPool.returnObject(item); } closeClicked() { this.hide(); } show() { this.active = true; this.parentClip.addChild(this); this.layout(this.boxWidth, this.boxHeight); this.showDef(null); this.showDialog(); } update(timeElapsed) { super.update(timeElapsed); if (this.graphic.graphicData) { let id = this.graphic.graphicData.id; this.frameText.setText((id == -1 ? "" : "(" + id + ") ") + this.graphic.graphicData.name + "\nSeq " + this.graphic.sequence + " / " + this.graphic.numSequences + " Frame: " + this.graphic.frame + " / " + this.graphic.numFrames); } else { this.frameText.setText(""); } } finishSlide() { super.finishSlide(); document.body.appendChild(this.filterHolder); this.positionFilter(); } layout(width, height) { this.boxWidth = width; this.boxHeight = height; this.background.layout(this.boxWidth, this.boxHeight); this.graphic.y = height - 150; this.graphic.x = (width - 200) * 0.5 + 200; this.playButton.x = (width - 200) * 0.5 + 185; this.nextSequenceButton.x = this.playButton.x + 35; this.prevSequenceButton.x = this.playButton.x - 35; this.playButton.y = this.nextSequenceButton.y = this.prevSequenceButton.y = height - 50; this.frameText.x = 240; this.frameText.y = height - 60; } hide(instant /*bool*/) { super.hide(instant); document.body.removeChild(this.filterHolder); } }