Start of the layout new system
This commit is contained in:
		
							parent
							
								
									7cedfaf9bd
								
							
						
					
					
						commit
						b53bb321af
					
				| @ -32,10 +32,6 @@ public class GuiBox implements IGuiBox | ||||
| 		onChanged(); | ||||
| 	} | ||||
| 	 | ||||
| 	public static IGuiBox simple(float x, float y, float width, float height) { | ||||
| 		return new GuiBox(x, y, width, height); | ||||
| 	} | ||||
| 	 | ||||
| 	public static IGuiBox clone(IGuiBox box) { | ||||
| 		return new GuiBox(box.getMinX(), box.getMinY(), box.getWidth(), box.getHeight()); | ||||
| 	} | ||||
|  | ||||
| @ -16,8 +16,9 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL | ||||
| 	private static final int FLAG_VISIBLE = 1 << 2; | ||||
| 	private static final int FLAG_MANUAL_MANAGED = 1 << 3; | ||||
| 	private static final int FLAG_SCISSORED = 1 << 4; | ||||
| 	 | ||||
| 	IGuiBox box; | ||||
| 	Object constraints; // TODO implement | ||||
| 	Object animator; // TODO implement | ||||
| 	GuiComponent parent; | ||||
| 	List<GuiComponent> children = new ObjectArrayList<>(); | ||||
| 	InteractionContainer interactions = new InteractionContainer(this::isInteractable); | ||||
| @ -99,16 +100,35 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public IGuiBox getBox() { | ||||
| 		return box; | ||||
| 	public void onChanged(boolean repaint) { | ||||
| 		// TODO implement changes xD | ||||
| 		if(constraints != null) { | ||||
| 			// TODO implement constraints | ||||
| 		} | ||||
| 		if(animator != null) { | ||||
| 			// TODO implement animations; | ||||
| 		} | ||||
| 		box.onChanged(); | ||||
| 		notifyListeners(LISTENER_ON_CHANGE); | ||||
| 		if(repaint) repaint(); | ||||
| 		if(children.isEmpty()) return; | ||||
| 		for(GuiComponent comp : children) { | ||||
| 			comp.onChanged(repaint); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	protected void repaint() { | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public IGuiBox getBox() { return box; } | ||||
| 	 | ||||
| 	@Override | ||||
| 	public GuiComponent set(float x, float y) { | ||||
| 		if(box.getBaseX() != x || box.getBaseY() != y) { | ||||
| 			box.setXY(x, y); | ||||
| 			//TODO implement onChanged | ||||
| 			onChanged(false); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| @ -117,7 +137,7 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL | ||||
| 	public GuiComponent bounds(float width, float height) { | ||||
| 		if(box.getBaseWidth() != width || box.getBaseHeight() != height) { | ||||
| 			box.setBounds(width, height); | ||||
| 			//TODO implement onChanged | ||||
| 			onChanged(true); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| @ -126,7 +146,7 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL | ||||
| 	public GuiComponent resize(float width, float height) { | ||||
| 		if(width != 0F || height != 0F) { | ||||
| 			box.grow(width, height); | ||||
| 			//TODO implement onChanged | ||||
| 			onChanged(true); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| @ -135,34 +155,27 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL | ||||
| 	public GuiComponent move(float moveX, float moveY) { | ||||
| 		if(moveX != 0F || moveY != 0F) { | ||||
| 			box.move(moveX, moveY); | ||||
| 			onChanged(false); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	public final GuiComponent scale(float newScale) { | ||||
| 		if(newScale != box.getBaseScale()) { | ||||
| 			box.setScale(newScale); | ||||
| 			// TODO implement onChanged | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	private final boolean isInteractable() { | ||||
| 		return isFlagSet(FLAG_ENABLED | FLAG_VISIBLE); | ||||
| 	} | ||||
| 	 | ||||
| 	public final boolean isFocused() { | ||||
| 		return isFlagSet(FLAG_FOCUSED); | ||||
| 	} | ||||
| 	 | ||||
| 	public final boolean isEnabled() { | ||||
| 		return isFlagSet(FLAG_ENABLED); | ||||
| 	} | ||||
| 	 | ||||
| 	public final boolean isVisible() { | ||||
| 		return isFlagSet(FLAG_VISIBLE); | ||||
| 	} | ||||
| 	 | ||||
| 	public final boolean isManualManaged() { | ||||
| 		return isFlagSet(FLAG_MANUAL_MANAGED); | ||||
| 	} | ||||
| 	 | ||||
| 	public final boolean isScissored() { | ||||
| 		return isFlagSet(FLAG_SCISSORED); | ||||
| 	} | ||||
| 	//@formatter:off | ||||
| 	private final boolean isInteractable() { return isFlagSet(FLAG_ENABLED | FLAG_VISIBLE); } | ||||
| 	public final boolean isFocused() { return isFlagSet(FLAG_FOCUSED); } | ||||
| 	public final boolean isEnabled() { return isFlagSet(FLAG_ENABLED); } | ||||
| 	public final boolean isVisible() { return isFlagSet(FLAG_VISIBLE); } | ||||
| 	public final boolean isManualManaged() { return isFlagSet(FLAG_MANUAL_MANAGED); } | ||||
| 	public final boolean isScissored() { return isFlagSet(FLAG_SCISSORED); } | ||||
| 	//@formatter:on | ||||
| 	 | ||||
| 	public final void setFocused(boolean value) { | ||||
| 		setFlag(FLAG_FOCUSED, value); | ||||
|  | ||||
| @ -0,0 +1,56 @@ | ||||
| package speiger.src.coreengine.rendering.newGui.layout; | ||||
| 
 | ||||
| import speiger.src.coreengine.rendering.newGui.components.base.GuiComponent; | ||||
| import speiger.src.coreengine.rendering.newGui.layout.IConstraint.Target; | ||||
| 
 | ||||
| public class ConstraintContainer { | ||||
| 	private static final int CONSTRAINT_LENGTH = 4; | ||||
| 	IConstraint[] constraints = new IConstraint[CONSTRAINT_LENGTH];  | ||||
| 	 | ||||
| 	private ConstraintContainer() {} | ||||
| 	 | ||||
| 	public void apply(GuiComponent owner, GuiComponent parent) { | ||||
| 		for(int i = 0;i<4;i++) { | ||||
| 			if(constraints[i] == null) continue; | ||||
| 			constraints[i].apply(owner, parent, Target.by(i)); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public static Builder builder() { return new Builder(); } | ||||
| 	public Builder copy() { return new Builder(this); } | ||||
| 	 | ||||
| 	public static class Builder { | ||||
| 		ConstraintContainer container = new ConstraintContainer(); | ||||
| 		 | ||||
| 		private Builder() {} | ||||
| 		private Builder(ConstraintContainer container) { | ||||
| 			System.arraycopy(container.constraints, 0, this.container.constraints, 0, CONSTRAINT_LENGTH); | ||||
| 		} | ||||
| 		 | ||||
| 		public Builder x(IConstraint value) {  | ||||
| 			container.constraints[Target.X.ordinal()] = value; | ||||
| 			return this; | ||||
| 		}  | ||||
| 		 | ||||
| 		public Builder y(IConstraint value) {  | ||||
| 			container.constraints[Target.Y.ordinal()] = value; | ||||
| 			return this; | ||||
| 		}  | ||||
| 		 | ||||
| 		public Builder width(IConstraint value) {  | ||||
| 			container.constraints[Target.WIDTH.ordinal()] = value; | ||||
| 			return this; | ||||
| 		}  | ||||
| 		 | ||||
| 		public Builder height(IConstraint value) {  | ||||
| 			container.constraints[Target.HEIGHT.ordinal()] = value; | ||||
| 			return this; | ||||
| 		}  | ||||
| 		 | ||||
| 		public ConstraintContainer build() { | ||||
| 			var result = container; | ||||
| 			container = null; | ||||
| 			return result; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,30 @@ | ||||
| package speiger.src.coreengine.rendering.newGui.layout; | ||||
| 
 | ||||
| import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox; | ||||
| import speiger.src.coreengine.rendering.newGui.layout.IConstraint.ISimpleConstraint; | ||||
| 
 | ||||
| public class Constraints { | ||||
| 	public static record Pixels(float value, boolean inverted) implements ISimpleConstraint { | ||||
| 		 | ||||
| 		public static Pixels of(float value) { return new Pixels(value, false); } | ||||
| 		public static Pixels inverted(float value) { return new Pixels(value, true); } | ||||
| 		 | ||||
| 		@Override | ||||
| 		public void apply(IGuiBox owner, IGuiBox parent, Target target) { | ||||
| 			target.set(owner, inverted ? target.asArea().get(parent) - value : value); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public static record Parent(float padding, boolean inv) implements ISimpleConstraint { | ||||
| 		 | ||||
| 		public static Parent of() { return new Parent(0F, false); } | ||||
| 		public static Parent of(float padding) { return new Parent(padding, false); } | ||||
| 		public static Parent inverted() { return new Parent(0F, true); } | ||||
| 		public static Parent inverted(float padding) { return new Parent(padding, true); } | ||||
| 		 | ||||
| 		@Override | ||||
| 		public void apply(IGuiBox owner, IGuiBox parent, Target target) { | ||||
| 			//TODO implement | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,56 @@ | ||||
| package speiger.src.coreengine.rendering.newGui.layout; | ||||
| 
 | ||||
| import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox; | ||||
| import speiger.src.coreengine.rendering.newGui.components.base.GuiComponent; | ||||
| 
 | ||||
| public interface IConstraint { | ||||
| 	public void apply(GuiComponent owner, GuiComponent child, Target target); | ||||
| 	 | ||||
| 	public static interface ISimpleConstraint extends IConstraint { | ||||
| 		@Override | ||||
| 		default void apply(GuiComponent owner, GuiComponent parent, Target target) { apply(owner.getBox(), parent.getBox(), target); } | ||||
| 		public void apply(IGuiBox owner, IGuiBox parent, Target target); | ||||
| 	} | ||||
| 	 | ||||
| 	public static enum Target { | ||||
| 		X, | ||||
| 		Y, | ||||
| 		WIDTH, | ||||
| 		HEIGHT; | ||||
| 		 | ||||
| 		static final Target[] BY_INDEX = values(); | ||||
| 		 | ||||
| 		public static Target by(int index) { return BY_INDEX[index & 3]; } | ||||
| 		public static Target pos(boolean x) { return x ? X : Y; } | ||||
| 		public static Target bounds(boolean x) { return x ? WIDTH : HEIGHT; } | ||||
| 		public boolean isPosition() { return this == X || this == Y; } | ||||
| 		public Target asArea() { | ||||
| 			return switch(this) { | ||||
| 				case X -> WIDTH; | ||||
| 				case Y -> HEIGHT; | ||||
| 				default -> this; | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		public float get(GuiComponent comp) { return get(comp.getBox()); } | ||||
| 		public void set(GuiComponent comp, float value) { set(comp.getBox(), value); } | ||||
| 		 | ||||
| 		public float get(IGuiBox box) { | ||||
| 			return switch(this) { | ||||
| 				case X -> box.getMinX(); | ||||
| 				case Y -> box.getMinY(); | ||||
| 				case WIDTH -> box.getBaseWidth(); | ||||
| 				case HEIGHT -> box.getBaseHeight(); | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		public void set(IGuiBox box, float value) { | ||||
| 			switch(this) { | ||||
| 				case X -> box.setX(value); | ||||
| 				case Y -> box.setY(value); | ||||
| 				case WIDTH -> box.setWidth(value); | ||||
| 				case HEIGHT -> box.setHeight(value); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -46,7 +46,9 @@ public interface DataTag | ||||
| 	 | ||||
| 	public DataTag copy(); | ||||
| 	 | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	public default <T> T cast(){return (T)this;} | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	public default <T> T cast(Class<T> clz){return (T)this;} | ||||
| 	 | ||||
| 	public default String prettyPrint(){return prettyPrint(" ", 0);} | ||||
|  | ||||
| @ -1,37 +0,0 @@ | ||||
| package speiger.src.coreengine.utils.io.settings; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.function.Consumer; | ||||
| 
 | ||||
| import speiger.src.collections.objects.lists.ObjectArrayList; | ||||
| 
 | ||||
| public abstract class BaseSetting<T extends ISetting<T>> implements ISetting<T> | ||||
| { | ||||
| 	protected final String id; | ||||
| 	List<Consumer<T>> listeners = new ObjectArrayList<Consumer<T>>(); | ||||
| 	 | ||||
| 	public BaseSetting(String id) | ||||
| 	{ | ||||
| 		this.id = id; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public T addListener(Consumer<T> listener) | ||||
| 	{ | ||||
| 		listeners.add(listener); | ||||
| 		return (T)this; | ||||
| 	} | ||||
| 	 | ||||
| 	protected void notifyListeners() | ||||
| 	{ | ||||
| 		if(listeners.isEmpty()) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
| 		T value = (T)this; | ||||
| 		for(int i = 0,m=listeners.size();i<m;i++) | ||||
| 		{ | ||||
| 			listeners.get(i).accept(value); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -1,66 +0,0 @@ | ||||
| package speiger.src.coreengine.utils.io.settings; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| 
 | ||||
| import speiger.src.coreengine.utils.helpers.JsonUtil; | ||||
| 
 | ||||
| public class BooleanSetting extends BaseSetting<BooleanSetting> | ||||
| { | ||||
| 	final boolean defaultValue; | ||||
| 	boolean value; | ||||
| 	 | ||||
| 	public BooleanSetting(String id, boolean defaultValue) | ||||
| 	{ | ||||
| 		super(id); | ||||
| 		this.defaultValue = defaultValue; | ||||
| 		value = defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isDefault() | ||||
| 	{ | ||||
| 		return value == defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void setDefault() | ||||
| 	{ | ||||
| 		if(value != defaultValue) | ||||
| 		{ | ||||
| 			value = defaultValue; | ||||
| 			notifyListeners(); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public BooleanSetting setValue(boolean value) | ||||
| 	{ | ||||
| 		if(this.value != value) | ||||
| 		{ | ||||
| 			this.value = value; | ||||
| 			notifyListeners(); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	public boolean getDefaultValue() | ||||
| 	{ | ||||
| 		return defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	public boolean getValue() | ||||
| 	{ | ||||
| 		return value; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void write(JsonObject object) | ||||
| 	{ | ||||
| 		object.addProperty(id, value); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void read(JsonObject object) | ||||
| 	{ | ||||
| 		value = JsonUtil.getOrDefault(object, id, defaultValue); | ||||
| 	} | ||||
| } | ||||
| @ -1,16 +0,0 @@ | ||||
| package speiger.src.coreengine.utils.io.settings; | ||||
| 
 | ||||
| import java.util.function.Consumer; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| 
 | ||||
| public interface ISetting<T extends ISetting<T>> | ||||
| { | ||||
| 	public T addListener(Consumer<T> listener); | ||||
| 	 | ||||
| 	public boolean isDefault(); | ||||
| 	public void setDefault(); | ||||
| 	 | ||||
| 	public void write(JsonObject object); | ||||
| 	public void read(JsonObject object); | ||||
| } | ||||
| @ -1,66 +0,0 @@ | ||||
| package speiger.src.coreengine.utils.io.settings; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| 
 | ||||
| import speiger.src.coreengine.utils.helpers.JsonUtil; | ||||
| 
 | ||||
| public class IntSetting extends BaseSetting<IntSetting> | ||||
| { | ||||
| 	final int defaultValue; | ||||
| 	int value; | ||||
| 	 | ||||
| 	public IntSetting(String id, int defaultValue) | ||||
| 	{ | ||||
| 		super(id); | ||||
| 		this.defaultValue = defaultValue; | ||||
| 		value = defaultValue; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean isDefault() | ||||
| 	{ | ||||
| 		return value == defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void setDefault() | ||||
| 	{ | ||||
| 		if(value != defaultValue) | ||||
| 		{ | ||||
| 			value = defaultValue; | ||||
| 			notifyListeners(); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public int getValue() | ||||
| 	{ | ||||
| 		return value; | ||||
| 	} | ||||
| 	 | ||||
| 	public int getDefaultValue() | ||||
| 	{ | ||||
| 		return defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	public IntSetting setValue(int value) | ||||
| 	{ | ||||
| 		if(this.value != value) | ||||
| 		{ | ||||
| 			this.value = value; | ||||
| 			notifyListeners(); | ||||
| 		} | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void write(JsonObject object) | ||||
| 	{ | ||||
| 		object.addProperty(id, value); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void read(JsonObject object) | ||||
| 	{ | ||||
| 		value = JsonUtil.getOrDefault(object, id, defaultValue); | ||||
| 	} | ||||
| } | ||||
| @ -1,50 +0,0 @@ | ||||
| package speiger.src.coreengine.utils.io.settings; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileWriter; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| import com.google.gson.internal.Streams; | ||||
| import com.google.gson.stream.JsonWriter; | ||||
| 
 | ||||
| import speiger.src.coreengine.utils.helpers.JsonUtil; | ||||
| 
 | ||||
| public class Settings | ||||
| { | ||||
| 	File file; | ||||
| 	ISetting<?>[] settings; | ||||
| 	 | ||||
| 	public Settings(File path, ISetting<?>[] settings) | ||||
| 	{ | ||||
| 		file = path; | ||||
| 		this.settings = settings; | ||||
| 	} | ||||
| 	 | ||||
| 	public void load() | ||||
| 	{ | ||||
| 		JsonObject obj = JsonUtil.loadFile(file); | ||||
| 		for(int i = 0,m=settings.length;i<m;i++) | ||||
| 		{ | ||||
| 			settings[i].read(obj); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public void save() | ||||
| 	{ | ||||
| 		JsonObject obj = new JsonObject(); | ||||
| 		for(int i = 0,m=settings.length;i<m;i++) | ||||
| 		{ | ||||
| 			settings[i].write(obj); | ||||
| 		} | ||||
| 		try(JsonWriter writer = new JsonWriter(new FileWriter(file))) | ||||
| 		{ | ||||
| 			writer.setIndent(" "); | ||||
| 			Streams.write(obj, writer); | ||||
| 			writer.flush(); | ||||
| 		} | ||||
| 		catch(Exception e) | ||||
| 		{ | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user