Enable support for inflating references in Components

This commit is contained in:
2021-03-19 20:38:55 +01:00
parent 8f69ded142
commit 1191c6cdc3

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.gui.xml.inflater;
import com.bartlomiejpluta.base.api.game.context.Context; import com.bartlomiejpluta.base.api.game.context.Context;
import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.gui.base.GUI;
import com.bartlomiejpluta.base.api.game.gui.base.SizeMode; import com.bartlomiejpluta.base.api.game.gui.base.SizeMode;
import com.bartlomiejpluta.base.api.game.gui.base.Widget;
import com.bartlomiejpluta.base.api.game.gui.component.Component; import com.bartlomiejpluta.base.api.game.gui.component.Component;
import com.bartlomiejpluta.base.api.game.gui.window.Inflatable; import com.bartlomiejpluta.base.api.game.gui.window.Inflatable;
import com.bartlomiejpluta.base.api.game.gui.window.Ref; import com.bartlomiejpluta.base.api.game.gui.window.Ref;
@@ -142,33 +143,45 @@ public class DefaultInflater implements Inflater {
hasContent = true; hasContent = true;
} }
updateWindowRefs(window, refs); updateWidgetRefs(window, refs);
if (window instanceof Inflatable) { invokeInflatableHook(window);
((Inflatable) window).onInflate();
}
return window; return window;
} }
@SneakyThrows private void invokeInflatableHook(Widget widget) {
private void updateWindowRefs(Window window, Map<String, Component> refs) { if (widget instanceof Inflatable) {
var windowClass = window.getClass(); ((Inflatable) widget).onInflate();
for (var field : windowClass.getDeclaredFields()) {
if (field.isAnnotationPresent(Ref.class)) {
var ref = field.getAnnotation(Ref.class).value();
var referencedComponent = refs.get(ref);
if (referencedComponent == null) {
throw new AppException("The [%s] window is trying to reference component [%s] which does not exist", windowClass.getSimpleName(), ref);
}
field.setAccessible(true);
field.set(window, referencedComponent);
}
} }
} }
private Component inflateComponent(Node root, Context context, GUI gui) { private Component inflateComponent(Node root, Context context, GUI gui) {
return parseNode(root, new HashMap<>(), context, gui); var refs = new HashMap<String, Component>();
var component = parseNode(root, refs, context, gui);
updateWidgetRefs(component, refs);
invokeInflatableHook(component);
return component;
}
@SneakyThrows
private void updateWidgetRefs(Widget widget, Map<String, Component> refs) {
var widgetClass = widget.getClass();
for (var field : widgetClass.getDeclaredFields()) {
if (field.isAnnotationPresent(Ref.class)) {
var ref = field.getAnnotation(Ref.class).value();
var referencedComponent = refs.get(ref);
if (referencedComponent == null) {
throw new AppException("The [%s] widget is trying to reference component [%s] which does not exist", widgetClass.getSimpleName(), ref);
}
field.setAccessible(true);
field.set(widget, referencedComponent);
}
}
} }
@SneakyThrows @SneakyThrows