diff --git a/nui-core/build.gradle b/nui-core/build.gradle new file mode 100644 index 0000000000..2b8b7cbf1a --- /dev/null +++ b/nui-core/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +apply from: "$rootDir/gradle/common.gradle" + +dependencies { + api group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.3' + api group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.3' + + api ('org.joml:joml') { + version { + require jomlVersion + } + } + + api ('org.terasology.joml-ext:joml-geometry') { + version { + require geomVersion + } + } + + implementation group: 'com.google.guava', name: 'guava', version: '23.0' +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/UICore.java b/nui-core/src/main/java/org/terasology/nui/core/UICore.java new file mode 100644 index 0000000000..b6189e5b98 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/UICore.java @@ -0,0 +1,4 @@ +package org.terasology.nui.core; + +public class UICore { +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/UIPaintable.java b/nui-core/src/main/java/org/terasology/nui/core/UIPaintable.java new file mode 100644 index 0000000000..2375f41636 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/UIPaintable.java @@ -0,0 +1,4 @@ +package org.terasology.nui.core; + +public interface UIPaintable { +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/UISlot.java b/nui-core/src/main/java/org/terasology/nui/core/UISlot.java new file mode 100644 index 0000000000..9b3102cbf4 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/UISlot.java @@ -0,0 +1,18 @@ +package org.terasology.nui.core; + +import org.terasology.nui.core.bind.BindingFunction; + +import java.lang.ref.WeakReference; + +public class UISlot { + private WeakReference reference; + private T handler; + + public UISlot(T handler) { + this.handler = handler; + } + + public Object invoke(Object[] entry) { + return null; + } +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/UIWidget.java b/nui-core/src/main/java/org/terasology/nui/core/UIWidget.java new file mode 100644 index 0000000000..2eda7d26e7 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/UIWidget.java @@ -0,0 +1,57 @@ +package org.terasology.nui.core; + +import org.joml.Vector2f; +import org.terasology.nui.core.bind.UIProperty; +import org.terasology.nui.core.bind.UISignal; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class UIWidget implements AutoCloseable { + private UIWidget parent; + private List children = new ArrayList<>(); + private boolean isFree = false; + + public final UISignal.UISignal0 destroy = new UISignal.UISignal0(); + + public final UIProperty z = new UIProperty<>(0.0f); + public final UIProperty pos = new UIProperty<>(new Vector2f()); + public final UIProperty size = new UIProperty<>(new Vector2f()); + + public UIWidget(UIWidget parent) { + this.parent = parent; + this.parent.children.add(this); + } + + public UIWidget(UIWidget parent, float z) { + this(parent); + this.z.set(z); + } + + public UIWidget(UIWidget parent, Vector2f pos) { + this(parent); + this.pos.set(pos); + } + + public UIWidget(UIWidget parent, Vector2f pos, Vector2f size) { + this(parent); + this.pos.set(pos); + this.size.set(size); + } + + public Collection children() { + return Collections.unmodifiableList(children); + } + + public boolean isDisposed() { + return isFree; + } + + @Override + public void close() { + this.isFree = true; + destroy.send(); + } +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Binding.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Binding.java new file mode 100644 index 0000000000..2c2abd1330 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Binding.java @@ -0,0 +1,10 @@ +package org.terasology.nui.core.bind; + +import org.terasology.nui.core.UIWidget; + +public class Binding { + public static void bind(UIWidget wid1, UISignal.UISignal1 signal, UIWidget wid2, UISlot.UISlot1 slot) { + BindingPair pair = new BindingPair(wid1, wid2); + signal.register(pair, slot); + } +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/BindingFunction.java b/nui-core/src/main/java/org/terasology/nui/core/bind/BindingFunction.java new file mode 100644 index 0000000000..ac453c44e8 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/BindingFunction.java @@ -0,0 +1,4 @@ +package org.terasology.nui.core.bind; + +public interface BindingFunction { +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/BindingPair.java b/nui-core/src/main/java/org/terasology/nui/core/bind/BindingPair.java new file mode 100644 index 0000000000..f5660cb594 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/BindingPair.java @@ -0,0 +1,15 @@ +package org.terasology.nui.core.bind; + +import org.terasology.nui.core.UIWidget; + +import java.lang.ref.WeakReference; + +public class BindingPair { + private WeakReference wid1; + private WeakReference wid2; + + public BindingPair(UIWidget w1, UIWidget w2) { + this.wid1 = new WeakReference<>(w1); + this.wid2 = new WeakReference<>(w2); + } +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function0.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function0.java new file mode 100644 index 0000000000..23c6116aad --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function0.java @@ -0,0 +1,7 @@ +package org.terasology.nui.core.bind; + + +@FunctionalInterface +public interface Function0 extends BindingFunction { + void apply(); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function1.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function1.java new file mode 100644 index 0000000000..717037b16f --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function1.java @@ -0,0 +1,6 @@ +package org.terasology.nui.core.bind; + +@FunctionalInterface +public interface Function1 extends BindingFunction { + void apply(T1 t1); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function2.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function2.java new file mode 100644 index 0000000000..9b70de7998 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function2.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function2 extends BindingFunction { + void apply(T1 t1, T2 t2); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function3.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function3.java new file mode 100644 index 0000000000..41cb663739 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function3.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function3 extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function4.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function4.java new file mode 100644 index 0000000000..f5b124f0f7 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function4.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function4extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3, T4 t4); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function5.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function5.java new file mode 100644 index 0000000000..5f7f8db999 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function5.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function5 extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function6.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function6.java new file mode 100644 index 0000000000..9c273d1dc7 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function6.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function6 extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function7.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function7.java new file mode 100644 index 0000000000..f02669ce56 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function7.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function7extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/Function8.java b/nui-core/src/main/java/org/terasology/nui/core/bind/Function8.java new file mode 100644 index 0000000000..f36018c5d5 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/Function8.java @@ -0,0 +1,5 @@ +package org.terasology.nui.core.bind; + +public interface Function8 extends BindingFunction { + void apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8); +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/UIProperty.java b/nui-core/src/main/java/org/terasology/nui/core/bind/UIProperty.java new file mode 100644 index 0000000000..e8085569d0 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/UIProperty.java @@ -0,0 +1,19 @@ +package org.terasology.nui.core.bind; + +public class UIProperty { + private T1 value; + public final UISignal.UISignal1 propertyChanged = new UISignal.UISignal1(); + + public UIProperty(T1 initial) { + this.value = initial; + } + + public void set(T1 value) { + propertyChanged.send(value); + this.value = value; + } + + public T1 get() { + return value; + } +} diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/UISignal.java b/nui-core/src/main/java/org/terasology/nui/core/bind/UISignal.java new file mode 100644 index 0000000000..8d8f55f074 --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/UISignal.java @@ -0,0 +1,65 @@ +package org.terasology.nui.core.bind; + +import com.google.common.collect.Multimap; +import org.terasology.nui.core.UIWidget; + +import java.lang.ref.WeakReference; + +public class UISignal { + + public static class UISignal0 extends UISignal { + public Multimap bindings; + + public UISignal0() { + } + + protected boolean register(BindingPair pair, UISlot.UISlot0 slot) { + bindings.put(pair, slot); + return true; + } + + public void send() { + for (BindingPair pair : bindings.keys()) { + for (UISlot.UISlot0 slot : bindings.get(pair)) { + slot.invoke(); + } + } + } + } + + public static class UISignal1 extends UISignal { + public Multimap> bindings; + + public UISignal1() { + } + + protected boolean register(BindingPair pair, UISlot.UISlot1 slot) { + bindings.put(pair, slot); + return true; + } + + public void send(T1 handler) { + for (BindingPair pair : bindings.keys()) { + for (UISlot.UISlot1 slot : bindings.get(pair)) { + slot.invoke(handler); + } + } + } + } + + public static class UISignal2 extends UISignal { + private WeakReference reference; + + public UISignal2() { + } + + + public void send(T1 t1, T2 t2) { + + } + } + + +} + + diff --git a/nui-core/src/main/java/org/terasology/nui/core/bind/UISlot.java b/nui-core/src/main/java/org/terasology/nui/core/bind/UISlot.java new file mode 100644 index 0000000000..a34428273d --- /dev/null +++ b/nui-core/src/main/java/org/terasology/nui/core/bind/UISlot.java @@ -0,0 +1,26 @@ +package org.terasology.nui.core.bind; + +public class UISlot { + + public static class UISlot0 extends UISlot { + private Function0 binding; + public UISlot0(Function0 binding) { + this.binding = binding; + } + + public void invoke() { + binding.apply(); + } + } + + public static class UISlot1 extends UISlot { + private Function1 binding; + public UISlot1(Function1 binding) { + this.binding = binding; + } + + public void invoke(T1 t1) { + binding.apply(t1); + } + } +} diff --git a/nui-core/src/test/java/org/terasology/nui/core/TestWidget.java b/nui-core/src/test/java/org/terasology/nui/core/TestWidget.java new file mode 100644 index 0000000000..038f41800d --- /dev/null +++ b/nui-core/src/test/java/org/terasology/nui/core/TestWidget.java @@ -0,0 +1,37 @@ +package org.terasology.nui.core; + + +import org.terasology.nui.core.bind.Binding; +import org.terasology.nui.core.bind.UISignal; +import org.terasology.nui.core.bind.UISlot; +import org.terasology.nui.core.bind.Function1; + +public class TestWidget extends UIWidget{ + private UISignal.UISignal1 a1 = new UISignal.UISignal1<>(); + private TestWidget2 widget2 = new TestWidget2(this); + + public class TestWidget2 extends UIWidget { + private int counter; + public final UISlot.UISlot1 consumer = new UISlot.UISlot1<>(new Function1() { + @Override + public void apply(Integer integer) { + counter += integer; + handle1(); + } + }); + + public void handle1() { + + } + + public TestWidget2(UIWidget parent) { + super(parent); + } + } + + public TestWidget(UIWidget parent) { + super(parent); + Binding.bind(this, a1, widget2, widget2.consumer); + a1.send(10); + } +} diff --git a/nui-guui/build.gradle b/nui-guui/build.gradle new file mode 100644 index 0000000000..2b8b7cbf1a --- /dev/null +++ b/nui-guui/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +apply from: "$rootDir/gradle/common.gradle" + +dependencies { + api group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.3' + api group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.3' + + api ('org.joml:joml') { + version { + require jomlVersion + } + } + + api ('org.terasology.joml-ext:joml-geometry') { + version { + require geomVersion + } + } + + implementation group: 'com.google.guava', name: 'guava', version: '23.0' +} diff --git a/settings.gradle b/settings.gradle index 4cea8bb38b..e3b0beba81 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = 'TeraNUI' -include 'nui-input', 'nui', 'nui-reflect', 'nui-libgdx' +include 'nui-input', 'nui', 'nui-reflect', 'nui-libgdx', 'nui-core'