Skip to content

Instantly share code, notes, and snippets.

@peanutbother
Created April 6, 2020 13:08
Show Gist options
  • Save peanutbother/7c7ec39d54e9ed91effd899614d80175 to your computer and use it in GitHub Desktop.
Save peanutbother/7c7ec39d54e9ed91effd899614d80175 to your computer and use it in GitHub Desktop.
Bind UI to Model class
package com.myapp;
import com.myapp.util.UiLoader;
import org.mini2Dx.core.Graphics;
import org.mini2Dx.core.assets.AssetManager;
import org.mini2Dx.core.files.*;
import org.mini2Dx.core.game.GameContainer;
import org.mini2Dx.core.graphics.viewport.FitViewport;
import org.mini2Dx.core.graphics.viewport.Viewport;
import org.mini2Dx.ui.UiContainer;
import org.mini2Dx.ui.UiThemeLoader;
import org.mini2Dx.ui.style.UiTheme;
public class Game extends GameContainer {
public static final String GAME_IDENTIFIER = "com.myapp";
private UiContainer container;
private AssetManager assetManager;
@Override
public void initialise() {
FileHandleResolver fileHandleResolver = new FallbackFileHandleResolver(
new InternalFileHandleResolver(), new LocalFileHandleResolver(), new ExternalFileHandleResolver()
);
Viewport viewport = new FitViewport(true, getWidth(), getHeight());
assetManager = new AssetManager(fileHandleResolver);
assetManager.setAssetLoader(UiTheme.class, new UiThemeLoader(fileHandleResolver));
assetManager.load(UiTheme.DEFAULT_THEME_FILENAME, UiTheme.class);
container = new UiContainer(this, assetManager);
container.setViewport(viewport);
UiLoader uiLoader = new UiLoader(fileHandleResolver);
MyUiModel model = uiLoader.load("test.xml", MyUiModel.class);
if (model != null) {
model.initialize();
container.add(model.getContainer());
}
}
@Override
public void update(float delta) {
if (!assetManager.update()) return;
if (!UiContainer.isThemeApplied()) {
UiContainer.setTheme(assetManager.get(UiTheme.DEFAULT_THEME_FILENAME, UiTheme.class));
}
container.update(delta);
}
@Override
public void render(Graphics g) {
container.render(g);
}
@Override
public void onPause() {
}
@Override
public void onResume() {
}
}
package com.myapp;
import com.myapp.util.UiElement;
import com.myapp.util.UiModel;
import org.mini2Dx.ui.element.Container;
import org.mini2Dx.ui.element.TextButton;
public class MyUiModel extends UiModel {
@UiElement(id = "testContainer")
Container container;
@UiElement(id = "testButton")
TextButton button;
@Override
public void initialize() {
button.setText("IT WORKS!");
}
@Override
public Container getContainer() {
return container;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="https://github.com/mini2Dx/mini2Dx" id="testContainer">
<flex-row>
<text-button id="testButton" text="TestButton"/>
</flex-row>
</container>
package com.myapp.util;
import java.lang.annotation.*;
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UiElement {
String id();
}
package com.myapp.util;
import org.mini2Dx.core.exception.MdxException;
import org.mini2Dx.core.files.FileHandleResolver;
import org.mini2Dx.ui.element.UiElement;
import org.mini2Dx.ui.xml.UiXmlLoader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class UiLoader extends UiXmlLoader {
public UiLoader(FileHandleResolver fileHandleResolver) {
super(fileHandleResolver);
}
public <T extends UiModel> T load(String filename, Class<? extends UiModel> model) {
UiElement container;
try {
container = load(filename);
} catch (Exception e) {
throw new MdxException("Failed to load UI file: " + filename, e);
}
if (container != null) {
return populateModel(container, model);
} else {
throw new MdxException("Failed to populate Ui file" + filename, new Exception("container is null"));
}
}
private <T extends UiElement, M extends UiModel> M populateModel(T ui, Class<? extends UiModel> model) {
try {
var newInstance = model.getConstructor().newInstance();
var fields = model.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(com.myapp.util.UiElement.class)) {
String id = field.getAnnotation(com.myapp.util.UiElement.class).id();
UiElement element = ui.getElementById(id);
try {
field.set(newInstance, field.getType().cast(element));
} catch (IllegalAccessException ex) {
field.setAccessible(true);
field.set(newInstance, field.getType().cast(element));
field.setAccessible(false);
}
}
}
return (M) newInstance;
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
throw new MdxException("could not populate fields", e);
}
}
}
package com.myapp.util;
import org.mini2Dx.ui.element.Container;
public abstract class UiModel {
public abstract void initialize();
public abstract Container getContainer();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment