import com.stevensacks.utils.ObservableClip; import com.stevensacks.galapagos.data.BranchIterator; import com.stevensacks.galapagos.assets.AbstractAsset; import com.stevensacks.galapagos.assets.AssetLoader; import com.stevensacks.galapagos.pages.PageLoader; import com.stevensacks.galapagos.pages.PageModel; import com.stevensacks.galapagos.Main; import mx.utils.Delegate; class com.stevensacks.galapagos.data.BranchLoader extends ObservableClass { private var iterator:BranchIterator; private var progressDelegate:Function; private var completeDelegate:Function; private var bytesLoaded:Number; private var percLoaded:Number; private var eachPerc:Number; private var loadedFiles:Number; private var totalFiles:Number; private var currentAsset:AbstractAsset; function BranchLoader() { super(); progressDelegate = Delegate.create(this, onProgress); completeDelegate = Delegate.create(this, onComplete); iterator = new BranchIterator(); } public function load(branch:String):Void { bytesLoaded = 0; percLoaded = 0; loadedFiles = 0; totalFiles = iterator.init(branch); eachPerc = 100 / totalFiles; loadNext(); } private function loadNext():Void { currentAsset = iterator.next(); if (currentAsset.branch != undefined) { loadPage(currentAsset); } else { loadAsset(currentAsset); } } private function loadPage(page:PageModel):Void { Main.getPageController().load(page); if (!page.loaded) { page.addEventListener("progress", progressDelegate); page.addEventListener("complete", completeDelegate); } else { next(); } } private function loadAsset(asset:AbstractAsset):Void { if (!asset.loaded) { asset.addEventListener("progress", progressDelegate); asset.addEventListener("complete", completeDelegate); Main.getAssetLoader().load(asset); } else { next(); } } private function onProgress(evt:Object):Void { bytesLoaded += evt.loaded; percLoaded = (loadedFiles * eachPerc) + Math.round((evt.perc * 100)); dispatchProgress(); } private function onComplete(evt:Object):Void { var asset:AbstractAsset = evt.asset; asset.removeEventListener("progress", progressDelegate); asset.removeEventListener("complete", completeDelegate); next(); } private function next():Void { if (++loadedFiles < totalFiles) { percLoaded = loadedFiles * eachPerc; dispatchProgress(); loadNext(); } else { dispatchComplete(); } } private function dispatchProgress():Void { dispatchEvent({type:"progress", loaded:bytesLoaded, perc:percLoaded, asset:currentAsset}); } private function dispatchComplete():Void { dispatchEvent({type:"complete"}); } }