diff --git a/src/main/java/somehussar/gui/GuiEditable.java b/src/main/java/somehussar/gui/GuiEditable.java index 52a8d4067..6e0a826cf 100644 --- a/src/main/java/somehussar/gui/GuiEditable.java +++ b/src/main/java/somehussar/gui/GuiEditable.java @@ -1,5 +1,6 @@ package somehussar.gui; +import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -15,10 +16,31 @@ public @interface GuiEditable { * Higher value = higher priority. */ int order() default 0; + } @Retention(RetentionPolicy.RUNTIME) @interface Group { String value(); } + + @Retention(RetentionPolicy.RUNTIME) + @interface Size { + int labelWidth() default 60; + int fieldWidth() default 50; + + GuiEditable.Size DEFAULT_SIZE = new GuiEditable.Size() { + @Override + public int labelWidth() { + return 60; + } + + @Override + public int fieldWidth() { + return 50; + } + @Override public Class annotationType() { return GuiEditable.Size.class; } + }; + + } } diff --git a/src/main/java/somehussar/gui/GuiFieldHandler.java b/src/main/java/somehussar/gui/GuiFieldHandler.java index ba5356696..5cf39bda5 100644 --- a/src/main/java/somehussar/gui/GuiFieldHandler.java +++ b/src/main/java/somehussar/gui/GuiFieldHandler.java @@ -30,7 +30,7 @@ public final class GuiFieldHandler { return CACHE.computeIfAbsent(type, GuiFieldHandler::scanClass); } - + @SuppressWarnings({"RawUseOfParameterized"}) private static ClassMetadata scanClass(Class type) { if (!type.isAnnotationPresent(GuiEditable.class)) { return null; @@ -66,6 +66,9 @@ public final class GuiFieldHandler { if (fieldConfig == null) return null; if (Modifier.isFinal(field.getModifiers())) return null; + GuiEditable.Size size = field.getAnnotation(GuiEditable.Size.class); + if (size == null) size = GuiEditable.Size.DEFAULT_SIZE;; + field.setAccessible(true); EditableField.Builder builder = new EditableField.Builder() .name(fieldConfig.value()) @@ -73,7 +76,9 @@ public final class GuiFieldHandler { .getter(LOOKUP.unreflectGetter(field)) .setter(LOOKUP.unreflectSetter(field)) .constraints(buildConstraints(field)) - .order(fieldConfig.order()); + .order(fieldConfig.order()) + .size(size); + GuiEditable.Group group = field.getAnnotation(GuiEditable.Group.class); if (group != null) diff --git a/src/main/java/somehussar/gui/field/EditableField.java b/src/main/java/somehussar/gui/field/EditableField.java index c0ace4303..782416663 100644 --- a/src/main/java/somehussar/gui/field/EditableField.java +++ b/src/main/java/somehussar/gui/field/EditableField.java @@ -1,6 +1,7 @@ package somehussar.gui.field; import somehussar.gui.FieldConstraints; +import somehussar.gui.GuiEditable; import java.lang.invoke.MethodHandle; @@ -13,6 +14,7 @@ public final class EditableField { private final FieldConstraints constraints; private final int order; private final String group; + private final GuiEditable.Size size; public String getName() { return name; @@ -54,6 +56,7 @@ public final class EditableField { this.constraints = b.constraints; this.order = b.order; this.group = b.group; + this.size = b.size; } public static class Builder { @@ -64,6 +67,7 @@ public final class EditableField { private FieldConstraints constraints; private int order; private String group = null; + private GuiEditable.Size size; public Builder name(String v) { this.name = v; return this; } public Builder type(Class v) { this.type = v; return this; } @@ -72,10 +76,10 @@ public final class EditableField { public Builder constraints(FieldConstraints v) { this.constraints = v; return this; } public Builder order(int order) { this.order = order; return this; } public Builder group(String value) { this.group = value; return this; } + public Builder size(GuiEditable.Size size) { this.size = size; return this; } public EditableField build() { return new EditableField<>(this); } - } }