aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2024-09-17 13:46:46 +0800
committershedaniel <daniel@shedaniel.me>2024-09-17 13:46:57 +0800
commitb8d0975527d86b79a1f9c160415baf8a6e6cf5cb (patch)
tree1101fc8b899598ac8e88362932eab01c95a3475c
parent428d5359f0aff3b9922c7a80058f5214cf7f8340 (diff)
downloadRoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.tar.gz
RoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.tar.bz2
RoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.zip
New Slot.withEntriesListener
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java42
3 files changed, 48 insertions, 7 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
index 02527dafd..c968e685f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java
@@ -25,10 +25,12 @@ package me.shedaniel.rei.api.client.gui.widgets;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.common.entry.EntryStack;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
+import java.util.function.Consumer;
public abstract class Slot extends WidgetWithBounds {
public static final byte UN_MARKED = 0;
@@ -133,6 +135,10 @@ public abstract class Slot extends WidgetWithBounds {
public abstract Slot entries(Collection<? extends EntryStack<?>> stacks);
+ @ApiStatus.Experimental
+ @ApiStatus.Internal
+ public abstract Slot withEntriesListener(Consumer<Slot> listener);
+
public abstract EntryStack<?> getCurrentEntry();
public abstract List<EntryStack<?>> getEntries();
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
index 58e745e34..874e94087 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
@@ -84,6 +84,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
@@ -271,6 +272,12 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
return this;
}
+ @Override
+ public Slot withEntriesListener(Consumer<Slot> listener) {
+ this.getCyclingEntries().addListener($ -> listener.accept(this));
+ return this;
+ }
+
public Slot entries(CyclingList<EntryStack<?>> stacks) {
this.getCyclingEntries().setBacking(stacks);
if (removeTagMatch) tagMatch = null;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java
index aeb557d45..50627c2a1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/util/OriginalRetainingCyclingList.java
@@ -26,16 +26,15 @@ package me.shedaniel.rei.impl.client.util;
import com.google.common.collect.Iterables;
import org.jetbrains.annotations.Nullable;
-import java.util.AbstractList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
+import java.util.function.Consumer;
import java.util.function.Supplier;
public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
private final Supplier<T> empty;
@Nullable
private CyclingList<T> backing = null;
+ private List<Consumer<CyclingList<T>>> listeners = List.of();
public OriginalRetainingCyclingList(Supplier<T> empty) {
this.empty = empty;
@@ -56,7 +55,9 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
@Override
public T previous() {
if (this.backing == null) return empty.get();
- return this.backing.previous();
+ T previous = this.backing.previous();
+ notifyListeners();
+ return previous;
}
@Override
@@ -72,7 +73,9 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
@Override
public T next() {
if (this.backing == null) return empty.get();
- return this.backing.next();
+ T next = this.backing.next();
+ notifyListeners();
+ return next;
}
@Override
@@ -86,11 +89,16 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
mutable.add(entry);
this.backing = mutable;
}
+
+ notifyListeners();
}
@Override
public void resetToStart() {
- if (this.backing != null) this.backing.resetToStart();
+ if (this.backing != null) {
+ this.backing.resetToStart();
+ notifyListeners();
+ };
}
@Override
@@ -118,6 +126,8 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
mutable.addAll(entries);
this.backing = mutable;
}
+
+ notifyListeners();
}
}
@@ -128,10 +138,13 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
} else {
this.backing = null;
}
+
+ notifyListeners();
}
public void setBacking(@Nullable CyclingList<T> backing) {
this.backing = backing;
+ notifyListeners();
}
private static <T> AbstractList<T> getListFromCollection(Collection<? extends T> entries) {
@@ -173,4 +186,19 @@ public class OriginalRetainingCyclingList<T> implements CyclingList.Mutable<T> {
if (this.backing == null) return CyclingList.of(this.empty);
return this.backing;
}
+
+ public void addListener(Consumer<CyclingList<T>> listener) {
+ if (this.listeners instanceof ArrayList<Consumer<CyclingList<T>>> list) {
+ list.add(listener);
+ } else {
+ this.listeners = new ArrayList<>(this.listeners);
+ this.listeners.add(listener);
+ }
+ }
+
+ private void notifyListeners() {
+ for (Consumer<CyclingList<T>> listener : this.listeners) {
+ listener.accept(this);
+ }
+ }
}