diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-11-07 21:07:54 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-11-07 22:26:03 +0800 |
| commit | ba981379e97f53ffdea4db83666bd0e65c693f66 (patch) | |
| tree | 56beab652df572f7e4ef27f34767a8ddba68675b /runtime | |
| parent | 7879ac1cc61876bfa0578e34a96239830530a00b (diff) | |
| download | RoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.tar.gz RoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.tar.bz2 RoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.zip | |
Introduce System Favorites
Diffstat (limited to 'runtime')
8 files changed, 224 insertions, 16 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index fb5787276..99886055d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -25,15 +25,20 @@ package me.shedaniel.rei.impl.client.favorites; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.favorites.SystemFavoriteEntryProvider; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.apache.commons.lang3.mutable.MutableLong; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -45,6 +50,7 @@ import java.util.Map; @ApiStatus.Internal public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry { private final BiMap<ResourceLocation, FavoriteEntryType<?>> registry = HashBiMap.create(); + private final List<Triple<SystemFavoriteEntryProvider<?>, MutableLong, List<FavoriteEntry>>> systemFavorites = Lists.newArrayList(); private final Map<Component, FavoriteEntryType.Section> sections = Maps.newLinkedHashMap(); @Override @@ -84,8 +90,18 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry } @Override + public <A extends FavoriteEntry> void registerSystemFavorites(SystemFavoriteEntryProvider<A> provider) { + this.systemFavorites.add(Triple.of(provider, new MutableLong(-1), new ArrayList<>())); + } + + public List<Triple<SystemFavoriteEntryProvider<?>, MutableLong, List<FavoriteEntry>>> getSystemProviders() { + return this.systemFavorites; + } + + @Override public void startReload() { this.registry.clear(); + this.systemFavorites.clear(); this.sections.clear(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java index f992145bc..5cf28663e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java @@ -420,6 +420,7 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg } FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != null) { + favoritesListWidget.getSystemRegion().updateEntriesPosition(entry -> true); favoritesListWidget.getRegion().updateEntriesPosition(entry -> true); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryStacksRegionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryStacksRegionWidget.java index f403ef6fe..bf7bbc97a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryStacksRegionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryStacksRegionWidget.java @@ -39,6 +39,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitorWidget; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.Widget; @@ -56,6 +57,7 @@ import net.minecraft.util.Tuple; import net.minecraft.util.Unit; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; @@ -67,8 +69,8 @@ import java.util.stream.Stream; import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.entrySize; import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.notSteppingOnExclusionZones; -public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWithBounds implements DraggableStackVisitorWidget { - private final RegionListener<T> listener; +public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget { + public final RegionListener<T> listener; protected int blockedCount; private Rectangle bounds = new Rectangle(), innerBounds; protected final ScrollingContainer scrolling = new ScrollingContainer() { @@ -79,6 +81,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit @Override public int getMaxScrollHeight() { + if (innerBounds.width == 0) return 0; return Mth.ceil((entries.size() + blockedCount) / (innerBounds.width / (float) entrySize())) * entrySize(); } @@ -187,11 +190,12 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit return false; } + @Override @Nullable public DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY) { if (innerBounds.contains(mouseX, mouseY)) { for (RealRegionEntry<T> entry : entries.values()) { - if (entry.getWidget().containsMouse(mouseX, mouseY)) { + if (entry.getWidget().containsMouse(mouseX, mouseY) && listener.canBeDragged(entry)) { return new RegionDraggableStack<>(entry, null); } } @@ -222,9 +226,11 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit public boolean acceptDraggedStack(DraggingContext<Screen> context, DraggableStack stack) { return checkDraggedStacks(context, stack) .filter(entry -> innerBounds.contains(context.getCurrentPosition())) - .map(entry -> { - drop(entry); - return Unit.INSTANCE; + .flatMap(entry -> { + if (!drop(entry)) { + return Optional.empty(); + } + return Optional.of(Unit.INSTANCE); }).isPresent(); } @@ -258,6 +264,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit this.removedEntries.put(removedEntry.hashIgnoreAmount(), removedEntry); } + List<RealRegionEntry<T>> addedEntries = new ArrayList<>(); Int2ObjectMap<RealRegionEntry<T>> prevEntries = new Int2ObjectOpenHashMap<>(entries); this.entries.clear(); @@ -266,6 +273,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit if (realEntry == null) { realEntry = new RealRegionEntry<>(this, regionEntry, entrySize); + addedEntries.add(realEntry); } if (!ConfigObject.getInstance().isFavoritesAnimated()) realEntry.size.setAs(entrySize * 100); @@ -275,6 +283,20 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit applyNewEntriesList(); updateEntriesPosition(entry -> prevEntries.containsKey(entry.hashIgnoreAmount())); + + for (RealRegionEntry<T> removedEntry : removedEntries) { + this.listener.onRemove(removedEntry); + } + + for (RealRegionEntry<T> addedEntry : addedEntries) { + this.listener.onAdd(addedEntry); + } + + this.listener.onSetNewEntries(entriesList); + } + + public boolean isEmpty() { + return entries.isEmpty(); } public void applyNewEntriesList() { @@ -390,7 +412,11 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit return new Rectangle((int) (bounds.getCenterX() - width * (entrySize / 2f) - 3), bounds.y, width * entrySize, bounds.height); } - public void drop(RealRegionEntry<T> entry) { + public boolean drop(RealRegionEntry<T> entry) { + if (!listener.canAcceptDrop(entry)) { + return false; + } + DraggingContext<?> context = DraggingContext.getInstance(); double x = context.getCurrentPosition().x; double y = context.getCurrentPosition().y + scrolling.scrollAmount; @@ -402,7 +428,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit boolean contains = bounds.contains(PointHelper.ofMouse()); int newIndex = contains ? getReleaseIndex() : Math.max(0, Iterables.indexOf(entries.values(), e -> e == entry)); - if (entries.size() - 1 <= newIndex) { + if (entries.size() <= newIndex) { RealRegionEntry<T> remove = this.entries.remove(entry.hashIgnoreAmount()); if (remove != null) { remove.remove(); @@ -433,6 +459,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit setEntries(this.entries.values().stream() .map(RealRegionEntry::getEntry) .collect(Collectors.toList())); + return true; } public void remove(RealRegionEntry<T> entry) { @@ -445,7 +472,15 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit } public boolean has(RealRegionEntry<T> entry) { - int hash = entry.hashIgnoreAmount(); + return has(entry.getEntry()); + } + + public boolean has(T entry) { + int hash = entry.hashCode(); return entries.containsKey(hash) && !removedEntries.containsKey(hash); } + + public Rectangle getInnerBounds() { + return innerBounds; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index c98d689b3..771708dfb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -38,6 +38,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.favorites.SystemFavoriteEntryProvider; import me.shedaniel.rei.api.client.gui.AbstractContainerEventHandler; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; @@ -54,8 +55,10 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionDraggableStack; +import me.shedaniel.rei.impl.client.gui.widget.region.RegionEntryListEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionListener; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -64,12 +67,15 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; +import org.apache.commons.lang3.mutable.MutableLong; +import org.apache.commons.lang3.tuple.Triple; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.Predicate; import java.util.stream.Stream; @@ -79,11 +85,40 @@ import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.notSteppin @ApiStatus.Internal public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProviderWidget, OverlayListWidget, RegionListener<FavoriteEntry> { private Rectangle fullBounds; + private EntryStacksRegionWidget<FavoriteEntry> systemRegion = new EntryStacksRegionWidget<>(new RegionListener<FavoriteEntry>() { + @Override + @Nullable + public FavoriteEntry convertDraggableStack(DraggingContext<Screen> context, DraggableStack stack) { + return FavoriteEntry.fromEntryStack(stack.getStack().copy()); + } + + @Override + public boolean canAcceptDrop(RealRegionEntry<FavoriteEntry> entry) { + return false; + } + + @Override + @Nullable + public FavoriteEntry asFavorite(RealRegionEntry<FavoriteEntry> entry) { + return null; + } + + @Override + public boolean canBeDragged(RealRegionEntry<FavoriteEntry> entry) { + return RegionListener.super.canBeDragged(entry); + } + + @Override + public boolean removeOnDrag() { + return false; + } + }); private EntryStacksRegionWidget<FavoriteEntry> region = new EntryStacksRegionWidget<>(this); + private List<FavoriteEntry> lastSystemEntries = new ArrayList<>(); public final AddFavoritePanel favoritePanel = new AddFavoritePanel(this); public final ToggleAddFavoritePanelButton favoritePanelButton = new ToggleAddFavoritePanelButton(this); - private List<Widget> children = ImmutableList.of(favoritePanel, favoritePanelButton, region); + private List<Widget> children = ImmutableList.of(favoritePanel, favoritePanelButton, systemRegion, region); @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { @@ -111,6 +146,10 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt return region; } + public EntryStacksRegionWidget<FavoriteEntry> getSystemRegion() { + return systemRegion; + } + @Override public void onDrop(Stream<FavoriteEntry> entries) { if (ConfigObject.getInstance().isFavoritesEnabled()) { @@ -135,6 +174,8 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt public DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY) { DraggableStack stack = region.getHoveredStack(context, mouseX, mouseY); if (stack != null) return stack; + stack = systemRegion.getHoveredStack(context, mouseX, mouseY); + if (stack != null) return stack; if (favoritePanel.bounds.contains(mouseX, mouseY)) { for (AddFavoritePanel.Row row : favoritePanel.rows.get()) { if (row instanceof AddFavoritePanel.SectionEntriesRow entriesRow) { @@ -156,6 +197,8 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt Point mouse = PointHelper.ofMouse(); EntryStack<?> stack = region.getFocusedStack(); if (stack != null && !stack.isEmpty()) return stack; + stack = systemRegion.getFocusedStack(); + if (stack != null && !stack.isEmpty()) return stack; if (favoritePanel.bounds.contains(mouse)) { for (AddFavoritePanel.Row row : favoritePanel.rows.get()) { if (row instanceof AddFavoritePanel.SectionEntriesRow entriesRow) { @@ -180,13 +223,74 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (fullBounds.isEmpty()) return; + updateSystemRegion(); +// systemRegion.getBounds().setBounds(this.fullBounds.x + 1, this.fullBounds.y - 1 + 14, this.fullBounds.width - 1, Math.max(1, systemRegion.scrolling.getMaxScrollHeight())); + systemRegion.getBounds().setBounds(this.fullBounds.x, this.fullBounds.y + 1, this.fullBounds.width, Math.max(1, systemRegion.scrolling.getMaxScrollHeight())); + int systemHeight = systemRegion.getBounds().getHeight(); + if (systemHeight > 1 && !region.isEmpty()) { + Rectangle innerBounds = systemRegion.getInnerBounds(); +// font.draw(matrices, new TranslatableComponent("System Favorites").withStyle(ChatFormatting.UNDERLINE), innerBounds.x - 1 + 4, fullBounds.y - 1 + 4, 0xFFFFFFFF); + fillGradient(matrices, innerBounds.x + 1, this.fullBounds.y + systemHeight + 2, innerBounds.getMaxX() - 1, this.fullBounds.y + systemHeight + 3, 0xFF777777, 0xFF777777); +// fillGradient(matrices, innerBounds.x - 2, this.fullBounds.y - 1, innerBounds.getMaxX() + 2, this.fullBounds.y + systemHeight + 1 + 14, 0x34FFFFFF, 0x34FFFFFF); +// systemHeight += 4 + 14; + systemHeight += 4; + } if (favoritePanel.getBounds().height > 20) - region.getBounds().setBounds(this.fullBounds.x, this.fullBounds.y, this.fullBounds.width, this.fullBounds.height - (this.fullBounds.getMaxY() - this.favoritePanel.bounds.y) - 4); - else region.getBounds().setBounds(this.fullBounds); + region.getBounds().setBounds(this.fullBounds.x, this.fullBounds.y + systemHeight, this.fullBounds.width, this.fullBounds.height - systemHeight - (this.fullBounds.getMaxY() - this.favoritePanel.bounds.y) - 4); + else region.getBounds().setBounds(this.fullBounds.x, this.fullBounds.y + systemHeight, this.fullBounds.width, this.fullBounds.height - systemHeight); + systemRegion.render(matrices, mouseX, mouseY, delta); region.render(matrices, mouseX, mouseY, delta); renderAddFavorite(matrices, mouseX, mouseY, delta); } + private void updateSystemRegion() { + boolean updated = false; + List<Triple<SystemFavoriteEntryProvider<?>, MutableLong, List<FavoriteEntry>>> providers = ((FavoriteEntryTypeRegistryImpl) FavoriteEntryType.registry()).getSystemProviders(); + + for (Triple<SystemFavoriteEntryProvider<?>, MutableLong, List<FavoriteEntry>> pair : providers) { + SystemFavoriteEntryProvider<?> provider = pair.getLeft(); + MutableLong mutableLong = pair.getMiddle(); + List<FavoriteEntry> entries = pair.getRight(); + + if (mutableLong.getValue() == -1 || mutableLong.getValue() < System.currentTimeMillis()) { + mutableLong.setValue(System.currentTimeMillis() + provider.updateInterval()); + List<FavoriteEntry> provide = (List<FavoriteEntry>) provider.provide(); + if (!provide.equals(entries)) { + entries.clear(); + entries.addAll(provide); + updated = true; + } + } + } + + if (updated) { + lastSystemEntries = CollectionUtils.flatMap(providers, Triple::getRight); + setSystemRegionEntries(); + } + } + + private void setSystemRegionEntries() { + systemRegion.setEntries(CollectionUtils.filterToList(lastSystemEntries, entry -> { + if (region.has(entry)) return false; + if (DraggingContext.getInstance().isDraggingStack()) { + DraggableStack currentStack = DraggingContext.getInstance().getCurrentStack(); + if (currentStack instanceof RegionDraggableStack) { + RegionDraggableStack<?> stack = (RegionDraggableStack<?>) currentStack; + + if (stack.getEntry().region == region && Objects.equals(stack.getEntry().getEntry(), entry)) { + return false; + } + } + } + return true; + })); + } + + @Override + public void onSetNewEntries(List<RegionEntryListEntry<FavoriteEntry>> regionEntryListEntries) { + setSystemRegionEntries(); + } + private void renderAddFavorite(PoseStack matrices, int mouseX, int mouseY, float delta) { this.favoritePanel.render(matrices, mouseX, mouseY, delta); this.favoritePanelButton.render(matrices, mouseX, mouseY, delta); @@ -218,7 +322,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (region.mouseClicked(mouseX, mouseY, button)) + if (systemRegion.mouseClicked(mouseX, mouseY, button) || region.mouseClicked(mouseX, mouseY, button)) return true; for (Widget widget : children()) if (widget.mouseClicked(mouseX, mouseY, button)) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java index 06c3543c0..33238c38e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java @@ -48,7 +48,7 @@ public class RegionDraggableStack<T extends RegionEntry<T>> implements Draggable @Override public void drag() { - if (showcaseWidget == null) { + if (showcaseWidget == null && entry.region.listener.removeOnDrag()) { entry.region.remove(entry); } } @@ -60,7 +60,10 @@ public class RegionDraggableStack<T extends RegionEntry<T>> implements Draggable @Override public void release(boolean accepted) { if (!accepted) { - if (showcaseWidget != null) { + if (!entry.region.listener.removeOnDrag()) { + DraggingContext.getInstance().renderBackToPosition(this, DraggingContext.getInstance().getCurrentPosition(), + () -> new Point(entry.x.doubleValue(), entry.y.doubleValue())); + } else if (showcaseWidget != null) { DraggingContext.getInstance().renderBackToPosition(this, DraggingContext.getInstance().getCurrentPosition(), () -> new Point(showcaseWidget.getBounds().x, showcaseWidget.getBounds().y)); } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryListEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryListEntry.java index 2ebcc49ae..6cc5a3d01 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryListEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryListEntry.java @@ -53,7 +53,7 @@ public class RegionEntryListEntry<T extends RegionEntry<T>> extends EntryListEnt @Override protected FavoriteEntry asFavoriteEntry() { - return entry.getEntry().asFavorite(); + return entry.region.listener.asFavorite(entry); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java index 9009560c3..caff430b9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java @@ -24,11 +24,13 @@ package me.shedaniel.rei.impl.client.gui.widget.region; import me.shedaniel.rei.api.client.entry.region.RegionEntry; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.stream.Stream; public interface RegionListener<T extends RegionEntry<T>> { @@ -38,4 +40,27 @@ public interface RegionListener<T extends RegionEntry<T>> { default T convertDraggableStack(DraggingContext<Screen> context, DraggableStack stack) { return null; } + + default boolean canAcceptDrop(RealRegionEntry<T> entry) { + return true; + } + + @Nullable + default FavoriteEntry asFavorite(RealRegionEntry<T> entry) { + return entry.getEntry().asFavorite(); + } + + default boolean canBeDragged(RealRegionEntry<T> entry) { + return true; + } + + default boolean removeOnDrag() { + return true; + } + + default void onRemove(RealRegionEntry<T> entry) {} + + default void onAdd(RealRegionEntry<T> entry) {} + + default void onSetNewEntries(List<RegionEntryListEntry<T>> entries) {} } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java index f9eedfdce..28bbe66ca 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java @@ -23,6 +23,9 @@ package me.shedaniel.rei.plugin.test; +import com.google.common.collect.ImmutableList; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -30,10 +33,13 @@ import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; import me.shedaniel.rei.api.common.util.EntryStacks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.Minecraft; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.GameType; import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.TestOnly; @@ -76,4 +82,22 @@ public class REITestPlugin implements REIClientPlugin { tag.putInt("Whatever", random.nextInt(Integer.MAX_VALUE)); return stack; } + + @Override + public void registerFavorites(FavoriteEntryType.Registry registry) { + registry.registerSystemFavorites(() -> { + GameType mode = Minecraft.getInstance().gameMode.getPlayerMode(); + switch (mode) { + case SURVIVAL: + return ImmutableList.of(FavoriteEntry.fromEntryStack(EntryStacks.of(Items.STONE))); + case CREATIVE: + return ImmutableList.of(FavoriteEntry.fromEntryStack(EntryStacks.of(Items.PACKED_ICE))); + case ADVENTURE: + return ImmutableList.of(FavoriteEntry.fromEntryStack(EntryStacks.of(Items.ANVIL))); + case SPECTATOR: + default: + return ImmutableList.of(); + } + }); + } } |
