From b8d0975527d86b79a1f9c160415baf8a6e6cf5cb Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 17 Sep 2024 13:46:46 +0800 Subject: New Slot.withEntriesListener --- .../rei/impl/client/gui/widget/EntryWidget.java | 7 ++++ .../client/util/OriginalRetainingCyclingList.java | 42 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) (limited to 'runtime/src') 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 listener) { + this.getCyclingEntries().addListener($ -> listener.accept(this)); + return this; + } + public Slot entries(CyclingList> 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 implements CyclingList.Mutable { private final Supplier empty; @Nullable private CyclingList backing = null; + private List>> listeners = List.of(); public OriginalRetainingCyclingList(Supplier empty) { this.empty = empty; @@ -56,7 +55,9 @@ public class OriginalRetainingCyclingList implements CyclingList.Mutable { @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 implements CyclingList.Mutable { @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 implements CyclingList.Mutable { 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 implements CyclingList.Mutable { mutable.addAll(entries); this.backing = mutable; } + + notifyListeners(); } } @@ -128,10 +138,13 @@ public class OriginalRetainingCyclingList implements CyclingList.Mutable { } else { this.backing = null; } + + notifyListeners(); } public void setBacking(@Nullable CyclingList backing) { this.backing = backing; + notifyListeners(); } private static AbstractList getListFromCollection(Collection entries) { @@ -173,4 +186,19 @@ public class OriginalRetainingCyclingList implements CyclingList.Mutable { if (this.backing == null) return CyclingList.of(this.empty); return this.backing; } + + public void addListener(Consumer> listener) { + if (this.listeners instanceof ArrayList>> list) { + list.add(listener); + } else { + this.listeners = new ArrayList<>(this.listeners); + this.listeners.add(listener); + } + } + + private void notifyListeners() { + for (Consumer> listener : this.listeners) { + listener.accept(this); + } + } } -- cgit