aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-11-07 21:07:54 +0800
committershedaniel <daniel@shedaniel.me>2021-11-07 22:26:03 +0800
commitba981379e97f53ffdea4db83666bd0e65c693f66 (patch)
tree56beab652df572f7e4ef27f34767a8ddba68675b /runtime
parent7879ac1cc61876bfa0578e34a96239830530a00b (diff)
downloadRoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.tar.gz
RoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.tar.bz2
RoughlyEnoughItems-ba981379e97f53ffdea4db83666bd0e65c693f66.zip
Introduce System Favorites
Diffstat (limited to 'runtime')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java16
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java1
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryStacksRegionWidget.java53
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java112
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryListEntry.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java25
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java24
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();
+ }
+ });
+ }
}