Created
April 6, 2020 13:08
-
-
Save peanutbother/7c7ec39d54e9ed91effd899614d80175 to your computer and use it in GitHub Desktop.
Bind UI to Model class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() { | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.myapp.util; | |
import java.lang.annotation.*; | |
@Documented | |
@Inherited | |
@Target(ElementType.FIELD) | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface UiElement { | |
String id(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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