package stu.tnt.gdx.core.loader;
import java.util.Iterator;
import stu.tnt.gdx.core.ResourceContext;
import stu.tnt.gdx.core.eAdmin;
import stu.tnt.gdx.utils.ArrayDeque;
import com.badlogic.gdx.assets.AssetLoaderParameters;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectMap.Entry;
/** Cached data path before its loaded
*
* @FileName: Context.java
* @CreateOn: Sep 15, 2012 - 11:06:15 AM
* @Author: TrungNT */
public class Context implements ResourceContext {
public final String name;
final ObjectMap<String, Data> mDataMap = new ObjectMap<String, Data>();
final ArrayDeque<String> mUnloadedData = new ArrayDeque<String>();
boolean isDisposed = false;
protected final AssetManager assets;
public Context (String name, AssetManager assets) {
this.name = name;
this.assets = assets;
if (assets == eAdmin.econtext.manager) eAdmin.econtext.addContext(this);
}
/************************************************************* Data manage method *************************************************************/
/** Prepend an array of data to data list
*
* @param data data's array */
public <T> void load (String linkName, Class<T> clazz) {
mDataMap.put(linkName, new Data<T>(clazz, null));
mUnloadedData.add(linkName);
}
/** Prepend an array of data to data list
*
* @param data data's array */
public <T> void load (String linkName, Class<T> clazz, AssetLoaderParameters<T> param) {
mDataMap.put(linkName, new Data<T>(clazz, param));
mUnloadedData.add(linkName);
}
/** Make sure all resource associate with this context is loaded */
public void load () {
String tmp = null;
while (mUnloadedData.size() > 0) {
tmp = mUnloadedData.poll();
Data data = mDataMap.get(tmp);
if (data.param != null)
assets.load(tmp, data.clazz, data.param);
else
assets.load(tmp, data.clazz);
}
}
/** remove the given data
*
* @param data the data you want */
public void unload () {
// ============= unload all data =============
Iterator<String> dataName = mDataMap.keys();
while (dataName.hasNext())
assets.unload(dataName.next());
// ============= put to unloaded list =============
for (String s : mDataMap.keys())
if (!mUnloadedData.contains(s)) mUnloadedData.add(s);
}
public void unload (String... linkName) {
for (String s : linkName) {
if (assets.isLoaded(s, mDataMap.get(s).clazz)) {
mUnloadedData.add(s);
assets.unload(s);
}
}
}
/** unmanage given data */
public void remove (String... listName) {
for (String linkName : listName) {
mDataMap.remove(linkName);
mUnloadedData.remove(linkName);
assets.unload(linkName);
}
}
/** Ask for data is contaning in the list
*
* @param data the given data
* @return true if list contain data,otherwise false */
public boolean contain (String assetName) {
return mDataMap.containsKey(assetName);
}
public boolean isUnloaded (String assetName) {
return mUnloadedData.contains(assetName);
}
public boolean isLoaded (String assetName) {
return assets.isLoaded(assetName, mDataMap.get(assetName).clazz);
}
Data<?> getContextData (String assetName) {
return mDataMap.get(assetName);
}
/** Get the size of data list
*
* @return data list's size */
public int size () {
return mDataMap.size;
}
public int unloadedSize () {
return mUnloadedData.size();
}
/** If this art have 1 asset have not been loaded , it will be false
*
* @return true if all assets was loaded, false otherwise */
public boolean isTotallyLoaded () {
for (Entry<String, Data> entries : mDataMap.entries()) {
if (!assets.isLoaded(entries.key, entries.value.clazz)) return false;
}
return true;
}
public boolean isTotallyUnloaded () {
for (Entry<String, Data> entries : mDataMap.entries()) {
if (assets.isLoaded(entries.key, entries.value.clazz)) return false;
}
return true;
}
/** You must call this method constantly until all assets done loading */
public boolean update () {
return assets.update();
}
/** Get the current loading process on this art
*
* @return the progress (0 to 1) */
public float getProgress () {
return assets.getProgress();
}
public <T> T get (String name, Class<T> clazz) {
return assets.get(name, clazz);
}
public boolean isDisposed () {
return isDisposed;
}
public void clear () {
// ============= unload all data =============
Iterator<String> dataName = mDataMap.keys();
while (dataName.hasNext())
assets.unload(dataName.next());
// ============= clear data list =============
mUnloadedData.clear();
mDataMap.clear();
}
/** delete all data */
public void dispose () {
isDisposed = true;
if (assets == eAdmin.econtext.manager) eAdmin.econtext.removeContext(this);
// ============= unload all data =============
Iterator<String> dataName = mDataMap.keys();
while (dataName.hasNext())
assets.unload(dataName.next());
// ============= clear data list =============
mUnloadedData.clear();
mDataMap.clear();
}
}