diff options
| author | shedaniel <daniel@shedaniel.me> | 2024-09-17 13:46:46 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-09-17 13:46:57 +0800 |
| commit | b8d0975527d86b79a1f9c160415baf8a6e6cf5cb (patch) | |
| tree | 1101fc8b899598ac8e88362932eab01c95a3475c | |
| parent | 428d5359f0aff3b9922c7a80058f5214cf7f8340 (diff) | |
| download | RoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.tar.gz RoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.tar.bz2 RoughlyEnoughItems-b8d0975527d86b79a1f9c160415baf8a6e6cf5cb.zip | |
New Slot.withEntriesListener
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); + } + } } |
