diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-09 21:30:12 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-09 21:30:12 +0800 |
| commit | 64bc9937d6ec04c6d66240a84b4fb345026c0b12 (patch) | |
| tree | 62e055c5cc64875300bdf69ac9a4400fb4b28dd9 /runtime/src | |
| parent | 69d386214f5d3471a3ef1e5533037cdc32648c57 (diff) | |
| download | RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.gz RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.bz2 RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.zip | |
Very primitive background rendering for JEI plugins
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'runtime/src')
11 files changed, 413 insertions, 226 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index f0cfe81b5..c668dc282 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -74,6 +74,7 @@ import net.minecraft.client.gui.screens.recipebook.GhostRecipe; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.TextComponent; @@ -337,7 +338,7 @@ public class RoughlyEnoughItemsCore { @ApiStatus.Internal public static <T extends REIPlugin> T registerPlugin(T plugin) { PLUGINS.add(plugin); - RoughlyEnoughItemsCore.LOGGER.debug("Registered plugin %s", plugin.getPluginName()); + RoughlyEnoughItemsCore.LOGGER.info("Registered plugin %s", plugin.getPluginName()); return plugin; } @@ -504,7 +505,7 @@ public class RoughlyEnoughItemsCore { } return InteractionResult.PASS; }); - ClientScreenInputEvent.KEY_RELEASED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { + ClientScreenInputEvent.MOUSE_RELEASED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { isLeftModePressed = false; if (shouldReturn(screen)) return InteractionResult.PASS; diff --git a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java index a54845f60..f5d5464a2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java @@ -482,11 +482,6 @@ public class FilteringScreen extends Screen { } } - @Override - public EntryStack<?> getCurrentEntry() { - return super.getCurrentEntry(); - } - public boolean isSelected() { return getSelection().intersects(getBounds()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index a63d38459..e44a56f18 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -23,25 +23,27 @@ package me.shedaniel.rei.gui; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.math.Matrix4f; import com.mojang.math.Vector4f; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.gui.drag.DraggableStack; +import me.shedaniel.rei.api.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.gui.drag.DraggableStackVisitor; +import me.shedaniel.rei.api.gui.drag.DraggingContext; import me.shedaniel.rei.api.gui.widgets.*; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.registry.category.CategoryRegistry; -import me.shedaniel.rei.api.registry.display.DisplayRegistry; import me.shedaniel.rei.api.registry.screen.ClickArea; import me.shedaniel.rei.api.registry.screen.DisplayBoundsProvider; import me.shedaniel.rei.api.registry.screen.OverlayDecider; @@ -60,7 +62,6 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; @@ -75,7 +76,6 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.Blocks; -import org.apache.logging.log4j.util.TriConsumer; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -83,7 +83,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.Collectors; @ApiStatus.Internal public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverlay { @@ -93,43 +92,11 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl private static final EntryListWidget ENTRY_LIST_WIDGET = new EntryListWidget(); private static FavoritesListWidget favoritesListWidget = null; private final List<Widget> widgets = Lists.newLinkedList(); - public boolean shouldReInit = false; - private int tooltipWidth; - private int tooltipHeight; - private List<FormattedCharSequence> tooltipLines; - public final TriConsumer<PoseStack, Point, Float> renderTooltipCallback = (matrices, mouse, aFloat) -> { - RenderSystem.disableRescaleNormal(); - RenderSystem.disableDepthTest(); - matrices.pushPose(); - matrices.translate(0, 0, 999); - int x = mouse.x; - int y = mouse.y; - this.fillGradient(matrices, x - 3, y - 4, x + tooltipWidth + 3, y - 3, -267386864, -267386864); - this.fillGradient(matrices, x - 3, y + tooltipHeight + 3, x + tooltipWidth + 3, y + tooltipHeight + 4, -267386864, -267386864); - this.fillGradient(matrices, x - 3, y - 3, x + tooltipWidth + 3, y + tooltipHeight + 3, -267386864, -267386864); - this.fillGradient(matrices, x - 4, y - 3, x - 3, y + tooltipHeight + 3, -267386864, -267386864); - this.fillGradient(matrices, x + tooltipWidth + 3, y - 3, x + tooltipWidth + 4, y + tooltipHeight + 3, -267386864, -267386864); - this.fillGradient(matrices, x - 3, y - 3 + 1, x - 3 + 1, y + tooltipHeight + 3 - 1, 1347420415, 1344798847); - this.fillGradient(matrices, x + tooltipWidth + 2, y - 3 + 1, x + tooltipWidth + 3, y + tooltipHeight + 3 - 1, 1347420415, 1344798847); - this.fillGradient(matrices, x - 3, y - 3, x + tooltipWidth + 3, y - 3 + 1, 1347420415, 1347420415); - this.fillGradient(matrices, x - 3, y + tooltipHeight + 2, x + tooltipWidth + 3, y + tooltipHeight + 3, 1344798847, 1344798847); - int currentY = y; - MultiBufferSource.BufferSource immediate = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); - Matrix4f matrix = matrices.last().pose(); - for (int lineIndex = 0; lineIndex < tooltipLines.size(); lineIndex++) { - font.drawInBatch(tooltipLines.get(lineIndex), x, currentY, -1, true, matrix, immediate, false, 0, 15728880); - currentY += lineIndex == 0 ? 12 : 10; - } - immediate.endBatch(); - matrices.popPose(); - RenderSystem.enableDepthTest(); - RenderSystem.enableRescaleNormal(); - }; + public boolean shouldReload = false; private Rectangle bounds; private Window window; private Button leftButton, rightButton; - @ApiStatus.Experimental - private Rectangle subsetsButtonBounds; + private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); @Nullable private ContainerScreenOverlay.OverlayMenu overlayMenu = null; @@ -208,7 +175,12 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl @Override public void queueReloadOverlay() { - shouldReInit = true; + shouldReload = true; + } + + @Override + public DraggingContext getDraggingContext() { + return draggingStack; } public void init(boolean useless) { @@ -216,7 +188,11 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } public void init() { - this.shouldReInit = false; + Iterable<DraggableStackProvider> stackProviders = (Iterable) Iterables.filter(widgets, widget -> widget instanceof DraggableStackProvider); + Iterable<DraggableStackVisitor> stackVisitors = (Iterable) Iterables.filter(widgets, widget -> widget instanceof DraggableStackVisitor); + draggingStack.set(DraggableStackProvider.from(() -> stackProviders), DraggableStackVisitor.from(() -> stackVisitors)); + + this.shouldReload = false; //Update Variables this.children().clear(); this.removeOverlayMenu(); @@ -224,8 +200,9 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl this.bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); widgets.add(ENTRY_LIST_WIDGET); if (ConfigObject.getInstance().isFavoritesEnabled()) { - if (favoritesListWidget == null) + if (favoritesListWidget == null) { favoritesListWidget = new FavoritesListWidget(); + } favoritesListWidget.favoritePanel.resetRows(); widgets.add(favoritesListWidget); } @@ -353,12 +330,12 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl helper.blit(matrices, weatherButton.getBounds().x + 3, weatherButton.getBounds().y + 3, getCurrentWeather().getId() * 14, 14, 14, 14); })); } - subsetsButtonBounds = getSubsetsButtonBounds(); + Rectangle subsetsButtonBounds = getSubsetsButtonBounds(); if (ConfigObject.getInstance().isSubsetsEnabled()) { widgets.add(InternalWidgets.wrapLateRenderable(InternalWidgets.wrapTranslate(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets")) .onClick(button -> { proceedOpenMenuOrElse(Menu.SUBSETS, () -> { - openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(new Point(this.subsetsButtonBounds.x, this.subsetsButtonBounds.getMaxY())), point -> true); + openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(new Point(subsetsButtonBounds.x, subsetsButtonBounds.getMaxY())), point -> true); }, menu -> { removeOverlayMenu(); }); @@ -397,6 +374,56 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl )); tmp.setZ(600); } + + widgets.add(draggingStack); + + if (Minecraft.getInstance().screen instanceof RecipeViewingScreen) { + widgets.add(new RecipeViewingScreenDraggable()); + } + } + + private static class RecipeViewingScreenDraggable extends Widget implements DraggableStackProvider{ + @Nullable + @Override + public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + for (Widget widget : ((RecipeViewingScreen) Minecraft.getInstance().screen).getWidgets()) { + if (widget instanceof EntryWidget) { + if (widget.containsMouse(mouseX, mouseY)) { + return new DraggableStack() { + EntryStack<?> stack = ((EntryWidget)widget).getCurrentEntry().copy().rewrap(); + + @Override + public EntryStack<?> getStack() { + return stack; + } + + @Override + public void drag() { + + } + + @Override + public void release(boolean accepted) { + if (!accepted) { + context.registerRenderBackToPosition(this, () -> new Point(((EntryWidget) widget).getBounds().x - 8, ((EntryWidget) widget).getBounds().y - 8)); + } + } + }; + } + } + } + return null; + } + + @Override + public void render(PoseStack poseStack, int i, int j, float f) { + + } + + @Override + public List<? extends GuiEventListener> children() { + return Collections.emptyList(); + } } private Rectangle getSubsetsButtonBounds() { @@ -513,7 +540,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (shouldReInit) { + if (shouldReload) { ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText(), true); init(); } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java b/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java new file mode 100644 index 000000000..6f464100e --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java @@ -0,0 +1,125 @@ +package me.shedaniel.rei.gui; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.api.gui.drag.DraggableStack; +import me.shedaniel.rei.api.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.gui.drag.DraggableStackVisitor; +import me.shedaniel.rei.api.gui.drag.DraggingContext; +import me.shedaniel.rei.api.gui.widgets.Widget; +import me.shedaniel.rei.gui.widget.LateRenderable; +import net.minecraft.client.gui.components.events.GuiEventListener; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; + +public class CurrentDraggingStack extends Widget implements LateRenderable, DraggingContext { + private DraggableStackProvider provider; + private DraggableStackVisitor visitor; + @Nullable + private DraggableEntry entry; + + public void set(DraggableStackProvider provider, DraggableStackVisitor visitor) { + this.provider = provider; + this.visitor = visitor; + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (entry != null && entry.dragging) { + if (!RoughlyEnoughItemsCore.isLeftModePressed) { + drop(); + return; + } + matrices.pushPose(); + matrices.translate(0, 0, 600); + entry.stack.render(matrices, new Rectangle(mouseX - 8, mouseY - 8, 16, 16), mouseX, mouseY, delta); + matrices.popPose(); + } + } + + @Override + public List<? extends GuiEventListener> children() { + return Collections.emptyList(); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + drop(); + DraggableStack hoveredStack = provider.getHoveredStack(this, mouseX, mouseY); + if (hoveredStack != null) { + entry = new DraggableEntry(hoveredStack, new Point(mouseX, mouseY)); + return true; + } + return false; + } + + @Override + public boolean mouseReleased(double d, double e, int i) { + return false; + } + + @Override + public boolean mouseDragged(double mouseX1, double mouseY1, int button, double mouseX2, double mouseY2) { + if (entry != null && !entry.dragging) { + Point startPoint = entry.start; + double xDistance = Math.abs(startPoint.x - mouseX1); + double yDistance = Math.abs(startPoint.y - mouseY1); + double requiredDistance = 4; + + if (xDistance * xDistance + yDistance * yDistance > requiredDistance * requiredDistance) { + entry.dragging = true; + entry.stack.drag(); + } + } + + return entry != null; + } + + private boolean drop() { + if (entry != null && entry.dragging) { + Optional<DraggableStackVisitor.Acceptor> acceptor = visitor.visitDraggedStack(entry.stack); + entry.stack.release(acceptor.isPresent()); + acceptor.ifPresent(a -> a.accept(entry.stack)); + entry = null; + return true; + } + + entry = null; + return false; + } + + @Override + @Nullable + public DraggableStack getCurrentStack() { + return entry != null && entry.dragging ? entry.stack : null; + } + + @Override + @Nullable + public Point getCurrentPosition() { + return isDraggingStack() ? PointHelper.ofMouse() : null; + } + + @Override + public void registerRenderBackToPosition(DraggableStack stack, Supplier<Point> position) { + + } + + private class DraggableEntry { + private final DraggableStack stack; + private final Point start; + private boolean dragging = false; + + private DraggableEntry(DraggableStack stack, Point start) { + this.stack = stack; + this.start = start; + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java index 1e676e405..4f3ed051e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java @@ -25,13 +25,13 @@ package me.shedaniel.rei.gui.credits; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.architectury.platform.Platform; import me.shedaniel.clothconfig2.impl.EasingMethod; import me.shedaniel.rei.api.ConfigObject; import me.shedaniel.rei.api.util.ImmutableLiteralText; import me.shedaniel.rei.gui.TransformingScreen; import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.TextCreditsItem; import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.TranslationCreditsItem; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -100,7 +100,7 @@ public class CreditsScreen extends Screen { ); }).collect(Collectors.toList()); int i = width - 80 - 6; - for (String line : String.format("§lRoughly Enough Items (v%s)\n§7Originally a fork for Almost Enough Items.\n\n§lLanguage Translation\n%s\n\n§lLicense\n§7Roughly Enough Items is licensed under MIT.", FabricLoader.getInstance().getModContainer("roughlyenoughitems").map(mod -> mod.getMetadata().getVersion().getFriendlyString()).orElse("Unknown"), "%translators%").split("\n")) + for (String line : String.format("§lRoughly Enough Items (v%s)\n§7Originally a fork for Almost Enough Items.\n\n§lLanguage Translation\n%s\n\n§lLicense\n§7Roughly Enough Items is licensed under MIT.", Platform.getMod("roughlyenoughitems").getVersion(), "%translators%").split("\n")) if (line.equalsIgnoreCase("%translators%")) { if (exception[0] != null) { entryListWidget.creditsAddEntry(new TextCreditsItem(new ImmutableLiteralText("Failed to get translators: " + exception[0].toString()))); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 4eba1f245..e89023651 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -44,6 +44,9 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.gui.config.EntryPanelOrdering; +import me.shedaniel.rei.api.gui.drag.DraggableStack; +import me.shedaniel.rei.api.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.gui.drag.DraggingContext; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.gui.widgets.Widget; import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds; @@ -79,6 +82,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -92,7 +96,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; @ApiStatus.Internal -public class EntryListWidget extends WidgetWithBounds { +public class EntryListWidget extends WidgetWithBounds implements DraggableStackProvider { static final Comparator<? super EntryStack<?>> ENTRY_NAME_COMPARER = Comparator.comparing(stack -> stack.asFormatStrippedText().getString()); static final Comparator<? super EntryStack<?>> ENTRY_GROUP_COMPARER = Comparator.comparingInt(stack -> { if (stack.getType() == VanillaEntryTypes.ITEM) { @@ -181,6 +185,33 @@ public class EntryListWidget extends WidgetWithBounds { } @Override + @Nullable + public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + for (EntryListEntry entry : entries) { + if (!entry.getCurrentEntry().isEmpty() && entry.containsMouse(mouseX, mouseY)) { + return new DraggableStack() { + EntryStack<?> stack = entry.getCurrentEntry().copy(); + + @Override + public EntryStack<?> getStack() { + return stack; + } + + @Override + public void drag() { + } + + @Override + public void release(boolean accepted) { + context.registerRenderBackToPosition(this, () -> new Point(entry.getBounds().x - 8, entry.getBounds().y - 8)); + } + }; + } + } + return null; + } + + @Override public boolean mouseScrolled(double double_1, double double_2, double double_3) { if (bounds.contains(double_1, double_2)) { if (Screen.hasControlDown()) { diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java index a98f55b2f..4c15dd4d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -244,7 +244,7 @@ public class EntryWidget extends Slot { return this; } - protected EntryStack<?> getCurrentEntry() { + public EntryStack<?> getCurrentEntry() { if (entryStacks.isEmpty()) return EntryStack.empty(); if (entryStacks.size() == 1) diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java index 1fa2abd3a..4fb4a62ce 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -37,23 +37,33 @@ import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWi import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.*; -import me.shedaniel.rei.api.gui.widgets.Widget; -import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.api.ingredient.entry.BatchEntryRenderer; +import me.shedaniel.rei.api.ConfigManager; +import me.shedaniel.rei.api.ConfigObject; +import me.shedaniel.rei.api.REIHelper; +import me.shedaniel.rei.api.REIOverlay; import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.favorites.FavoriteEntryType; import me.shedaniel.rei.api.favorites.FavoriteMenuEntry; +import me.shedaniel.rei.api.gui.drag.DraggableStack; +import me.shedaniel.rei.api.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.gui.drag.DraggableStackVisitor; +import me.shedaniel.rei.api.gui.drag.DraggingContext; +import me.shedaniel.rei.api.gui.widgets.Tooltip; +import me.shedaniel.rei.api.gui.widgets.Widget; +import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.api.ingredient.EntryStack; +import me.shedaniel.rei.api.ingredient.entry.BatchEntryRenderer; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.util.CollectionUtils; import me.shedaniel.rei.api.util.ImmutableLiteralText; -import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.MenuEntry; -import me.shedaniel.rei.impl.*; -import me.shedaniel.rei.api.util.CollectionUtils; +import me.shedaniel.rei.impl.Animator; +import me.shedaniel.rei.impl.ConfigManagerImpl; +import me.shedaniel.rei.impl.ConfigObjectImpl; +import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -77,7 +87,7 @@ import java.util.stream.Stream; import static me.shedaniel.rei.gui.widget.EntryListWidget.*; @ApiStatus.Internal -public class FavoritesListWidget extends WidgetWithBounds { +public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProvider, DraggableStackVisitor { protected final ScrollingContainer scrolling = new ScrollingContainer() { @Override public Rectangle getBounds() { @@ -102,7 +112,6 @@ public class FavoritesListWidget extends WidgetWithBounds { private final Int2ObjectMap<Entry> removedEntries = new Int2ObjectLinkedOpenHashMap<>(); private List<EntryListEntry> entriesList = Lists.newArrayList(); private List<Widget> children = Lists.newArrayList(); - private Entry lastTouchedEntry = null; public final AddFavoritePanel favoritePanel = new AddFavoritePanel(this); public final ToggleAddFavoritePanelButton favoritePanelButton = new ToggleAddFavoritePanelButton(this); @@ -143,25 +152,80 @@ public class FavoritesListWidget extends WidgetWithBounds { } @Override + @Nullable + public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + Function<Entry, DraggableStack> apply = entry -> new DraggableStack() { + private FavoriteEntry favoriteEntry = entry.getEntry(); + private EntryStack<?> stack = EntryStacks.of(favoriteEntry.getRenderer(false)).copy(); + + @Override + public EntryStack<?> getStack() { + return stack; + } + + @Override + public void drag() { + entries.remove(entry.hashIgnoreAmount()); + applyNewFavorites(entries.values().stream() + .map(Entry::getEntry) + .collect(Collectors.toList())); + } + + @Override + public void release(boolean accepted) { + if (!accepted) { + drop(entry, this, favoriteEntry); + } + } + }; + if (innerBounds.contains(mouseX, mouseY)) { + for (Entry entry : entries.values()) { + if (entry.getWidget().containsMouse(mouseX, mouseY)) { + return apply.apply(entry); + } + } + } + if (favoritePanel.bounds.contains(mouseX, mouseY)) { + for (AddFavoritePanel.Row row : favoritePanel.rows.get()) { + if (row instanceof AddFavoritePanel.SectionEntriesRow) { + for (AddFavoritePanel.SectionEntriesRow.SectionFavoriteWidget widget : ((AddFavoritePanel.SectionEntriesRow) row).widgets) { + if (widget.containsMouse(mouseX, mouseY)) { + Entry entry = new Entry(widget.entry.copy(), entrySize()); + entry.size.setAs(entrySize() * 100); + return apply.apply(entry); + } + } + } + } + } + return null; + } + + @Override + public Optional<Acceptor> visitDraggedStack(DraggableStack stack) { + if (innerBounds.contains(PointHelper.ofMouse())) { + return Optional.of(this::acceptDraggedStack); + } + return Optional.empty(); + } + + private void acceptDraggedStack(DraggableStack stack) { + FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack.getStack().copy()); + Entry entry = new Entry(favoriteEntry, entrySize()); + entry.size.setAs(entrySize() * 100); + drop(entry, stack, favoriteEntry); + } + + @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { if (fullBounds.isEmpty() || currentBounds.isEmpty()) return; int entrySize = entrySize(); boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); updateEntriesPosition(entry -> true); - if (lastTouchedEntry != null && lastTouchedEntry.dragged) { - lastTouchedEntry.x.setAs(mouseX - entrySize / 2); - lastTouchedEntry.y.setAs(mouseY - entrySize / 2 + (int) scrolling.scrollAmount); - - if (!RoughlyEnoughItemsCore.isLeftModePressed) - resetDraggedEntry(); - } for (Entry entry : entries.values()) { entry.update(delta); } - if (lastTouchedEntry != null && lastTouchedEntry.madeUp) { - lastTouchedEntry.update(delta); - } ObjectIterator<Entry> removedEntriesIterator = removedEntries.values().iterator(); while (removedEntriesIterator.hasNext()) { Entry removedEntry = removedEntriesIterator.next(); @@ -176,7 +240,6 @@ public class FavoritesListWidget extends WidgetWithBounds { ScissorsHandler.INSTANCE.scissor(currentBounds); Stream<EntryListEntry> entryStream = this.entriesList.stream() - .filter(entry -> lastTouchedEntry == null || entry != lastTouchedEntry.getWidget()) .filter(entry -> entry.getBounds().getMaxY() >= this.currentBounds.getY() && entry.getBounds().y <= this.currentBounds.getMaxY()); if (fastEntryRendering) { @@ -193,13 +256,6 @@ public class FavoritesListWidget extends WidgetWithBounds { ScissorsHandler.INSTANCE.removeLastScissor(); renderAddFavorite(matrices, mouseX, mouseY, delta); - - if (lastTouchedEntry != null) { - matrices.pushPose(); - matrices.translate(0, 0, 600); - lastTouchedEntry.widget.render(matrices, mouseX, mouseY, delta); - matrices.popPose(); - } } private void renderAddFavorite(PoseStack matrices, int mouseX, int mouseY, float delta) { @@ -209,15 +265,6 @@ public class FavoritesListWidget extends WidgetWithBounds { @Override public boolean mouseDragged(double mouseX, double mouseY, int int_1, double double_3, double double_4) { - if (lastTouchedEntry != null && !lastTouchedEntry.dragged) { - Point startPoint = lastTouchedEntry.startedDraggingPosition; - double xDistance = Math.abs(startPoint.x - mouseX); - double yDistance = Math.abs(startPoint.y - mouseY); - double requiredDistance = entrySize() * .4; - if (xDistance * xDistance + yDistance |
