package io.newgrounds.swf; import openfl.events.Event; import io.newgrounds.swf.common.DropDown; import io.newgrounds.objects.Score; import io.newgrounds.objects.events.Result.ScoreBoardResult; import io.newgrounds.objects.events.Result.ScoreResult; import io.newgrounds.objects.events.Response; import io.newgrounds.swf.common.BaseAsset; import io.newgrounds.swf.common.Button; import io.newgrounds.components.ScoreBoardComponent.Period; import openfl.display.MovieClip; import openfl.text.TextField; class ScoreBrowser extends BaseAsset { public var prevButton (default, null):MovieClip; public var nextButton (default, null):MovieClip; public var reloadButton (default, null):MovieClip; public var listBox (default, null):MovieClip; public var loadingIcon (default, null):MovieClip; public var errorIcon (default, null):MovieClip; public var scoreContainer(default, null):MovieClip; public var titleField (default, null):TextField; public var pageField (default, null):TextField; public var period(get, set):Period; function get_period():Period { return _periodDropDown.value; } function set_period(value:Period):Period { return _periodDropDown.value = value; } public var title(get, set):String; function get_title():String { return titleField.text; } function set_title(value:String):String { return titleField.text = value; } public var tag(default, set):String; function set_tag(value:String):String { if (this.tag != value) { this.tag = value; delayReload(); } return value; } public var social(default, set):Bool; function set_social(value:Bool):Bool { if (this.social != value) { this.social = value; delayReload(); } return value; } public var boardId(default, set):Int; function set_boardId(value:Int):Int { _boardIDSet = true; if (this.boardId != value) { this.boardId = value; delayReload(); } return value; } public var page(default, set):Int; function set_page(value:Int):Int { if (this.page != value) { this.page = value; delayReload(); } return value; } var _scores:Array; var _limit:Int = 0; var _periodDropDown:DropDown; var _boardIDSet:Bool; public function new() { super(); } override function setDefaults():Void { super.setDefaults(); boardId = -1; _boardIDSet = false; scoreContainer.visible = false; loadingIcon.visible = false; reloadButton.visible = false; errorIcon.visible = false; errorIcon.addFrameScript(errorIcon.totalFrames - 1, errorIcon.stop); //TODO: prevent memory leaks? new Button(prevButton, onPrevClick); new Button(nextButton, onNextClick); new Button(reloadButton, reload); _periodDropDown = new DropDown(listBox, delayReload); _periodDropDown.addItem("Current day" , Period.DAY ); _periodDropDown.addItem("Current week" , Period.WEEK ); _periodDropDown.addItem("Current month", Period.MONTH); _periodDropDown.addItem("Current year" , Period.YEAR ); _periodDropDown.addItem("All time" , Period.ALL ); _periodDropDown.value = Period.ALL; _scores = new Array(); while(true) { var score:MovieClip = cast scoreContainer.getChildByName('score${_scores.length}'); if (score == null) break; new Button(score); _scores.push(score); } _limit = _scores.length; } override function onReady():Void { super.onReady(); if (boardId == -1 && !_boardIDSet) { #if ng_lite NG.core.calls.scoreBoard.getBoards() .addDataHandler(onBoardsRecieved) .queue(); #else if (NG.core.scoreBoards != null) onBoardsLoaded(); else NG.core.requestScoreBoards(onBoardsLoaded); #end } reload(); } #if ng_lite function onBoardsRecieved(response:Response):Void { if (response.success && response.result.success) { for (board in response.result.data.scoreboards) { NG.core.log('No boardId specified defaulting to ${board.name}'); boardId = board.id; return; } } } #else function onBoardsLoaded():Void { for (board in NG.core.scoreBoards) { NG.core.log('No boardId specified defaulting to ${board.name}'); boardId = board.id; return; } } #end /** Used internally to avoid multiple server requests from various property changes in a small time-frame. **/ function delayReload():Void { addEventListener(Event.EXIT_FRAME, onDelayComplete); } function onDelayComplete(e:Event):Void { reload(); } public function reload():Void { removeEventListener(Event.EXIT_FRAME, onDelayComplete); errorIcon.visible = false; scoreContainer.visible = false; pageField.text = 'page ${page + 1}'; if (_coreReady && boardId != -1 && _limit > 0 && period != null) { loadingIcon.visible = true; NG.core.calls.scoreBoard.getScores(boardId, _limit, _limit * page, period, social, tag) .addDataHandler(onScoresReceive) .send(); } } function onScoresReceive(response:Response):Void { loadingIcon.visible = false; if (response.success && response.result.success) { scoreContainer.visible = true; var i = _limit; while(i > 0) { i--; if (i < response.result.data.scores.length) drawScore(i, response.result.data.scores[i], _scores[i]); else drawScore(i, null, _scores[i]); } } else { errorIcon.visible = true; errorIcon.gotoAndPlay(1); reloadButton.visible = true; } } inline function drawScore(rank:Int, score:Score, asset:MovieClip):Void { if (score == null) asset.visible = false; else { asset.visible = true; cast (asset.getChildByName("nameField" ), TextField).text = score.user.name; cast (asset.getChildByName("scoreField"), TextField).text = score.formatted_value; cast (asset.getChildByName("rankField" ), TextField).text = Std.string(rank + 1); } } function onPrevClick():Void { if (page > 0) page--; } function onNextClick():Void { page++; } }