aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java48
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableView.java38
2 files changed, 68 insertions, 18 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
index 7111b25..39a078b 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
@@ -1,7 +1,5 @@
package io.github.cottonmc.cotton.gui.widget.data;
-import org.jetbrains.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -18,7 +16,7 @@ import java.util.function.Supplier;
* @param <T> the contained value type
* @since 4.2.0
*/
-public final class ObservableProperty<T> implements Supplier<T> {
+public final class ObservableProperty<T> implements ObservableView<T> {
private Supplier<? extends T> value;
private final List<ChangeListener<? super T>> listeners = new ArrayList<>();
private boolean allowNull = true;
@@ -113,6 +111,33 @@ public final class ObservableProperty<T> implements Supplier<T> {
}
/**
+ * Returns a read-only view of this property.
+ * The result is not an instance of {@link ObservableProperty},
+ * and thus can't be mutated.
+ *
+ * @return an observable view of this property
+ */
+ public ObservableView<T> readOnly() {
+ // Missing delegates from Kotlin... :(
+ return new ObservableView<>() {
+ @Override
+ public T get() {
+ return ObservableProperty.this.get();
+ }
+
+ @Override
+ public void addListener(ChangeListener<? super T> listener) {
+ ObservableProperty.this.addListener(listener);
+ }
+
+ @Override
+ public void removeListener(ChangeListener<? super T> listener) {
+ ObservableProperty.this.removeListener(listener);
+ }
+ };
+ }
+
+ /**
* {@return the name of this property}
*/
public String getName() {
@@ -130,28 +155,15 @@ public final class ObservableProperty<T> implements Supplier<T> {
return this;
}
- /**
- * Adds a change listener to this observable property.
- *
- * @param listener the added listener
- */
+ @Override
public void addListener(ChangeListener<? super T> listener) {
Objects.requireNonNull(listener);
listeners.add(listener);
}
- /**
- * Removes a change listener from this observable property if present.
- *
- * @param listener the removed listener
- */
+ @Override
public void removeListener(ChangeListener<? super T> listener) {
Objects.requireNonNull(listener);
listeners.remove(listener);
}
-
- @FunctionalInterface
- public interface ChangeListener<T> {
- void onPropertyChange(ObservableProperty<? extends T> property, @Nullable T from, @Nullable T to);
- }
}
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableView.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableView.java
new file mode 100644
index 0000000..c3113b9
--- /dev/null
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableView.java
@@ -0,0 +1,38 @@
+package io.github.cottonmc.cotton.gui.widget.data;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.function.Supplier;
+
+public interface ObservableView<T> extends Supplier<T> {
+ /**
+ * Adds a change listener to this property view.
+ *
+ * @param listener the added listener
+ */
+ void addListener(ChangeListener<? super T> listener);
+
+ /**
+ * Removes a change listener from this property view if present.
+ *
+ * @param listener the removed listener
+ */
+ void removeListener(ChangeListener<? super T> listener);
+
+ /**
+ * A listener for changes in observable views and properties.
+ *
+ * @param <T> the value type listened to
+ */
+ @FunctionalInterface
+ interface ChangeListener<T> {
+ /**
+ * Handles a change in an observable property.
+ *
+ * @param property
+ * @param from
+ * @param to
+ */
+ void onPropertyChange(ObservableView<? extends T> property, @Nullable T from, @Nullable T to);
+ }
+}