From e9187e728209167bd28bdf4120e6e1dc695d1ec7 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 16 Jun 2022 23:40:19 +0800 Subject: Render errors without hover for pinned displays --- .../gui/widget/favorites/history/DisplayEntry.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index b7540c87a..38072c498 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -164,18 +164,18 @@ public class DisplayEntry extends WidgetWithBounds { if (plusButton.containsMouse(Math.round(mouse.x()), Math.round(mouse.y()))) { result.tooltipRenderer.accept(new Point(mouseX, mouseY), Tooltip::queue); - - if (result.renderer != null) { - poses.pushPose(); - if (!stable || !target.equals(bounds)) { - poses.translate(0, 0, 600); - } - poses.translate(xOffset(), yOffset(), 0); - poses.scale(xScale(), yScale(), 1.0F); - - result.renderer.render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display); - poses.popPose(); + } + + if (result.renderer != null) { + poses.pushPose(); + if (!stable || !target.equals(bounds)) { + poses.translate(0, 0, 600); } + poses.translate(xOffset(), yOffset(), 0); + poses.scale(xScale(), yScale(), 1.0F); + + result.renderer.render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display); + poses.popPose(); } } else { poses.popPose(); -- cgit From f1fd1e6455be1a49d9c1d26a756cc1d22a1831cb Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 00:10:57 +0800 Subject: Add hotbar quick cheat + fix stacked cheating --- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 18 +++++++++++ .../rei/impl/client/ClientHelperImpl.java | 35 ++++++++++++++++++++++ .../client/gui/widget/DisplayedEntryWidget.java | 26 ++++++++++++++++ .../gui/widget/entrylist/EntryListWidget.java | 22 ++++++++++++-- 4 files changed, 99 insertions(+), 2 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 0fef1e488..80d868c28 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -47,6 +47,7 @@ import java.util.Collections; public class RoughlyEnoughItemsNetwork { public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item"); public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item"); + public static final ResourceLocation CREATE_ITEMS_HOTBAR_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_hotbar"); public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab"); public static final ResourceLocation CREATE_ITEMS_MESSAGE_PACKET = new ResourceLocation("roughlyenoughitems", "ci_msg"); public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items"); @@ -97,6 +98,23 @@ public class RoughlyEnoughItemsNetwork { menu.broadcastChanges(); NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); }); + NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_HOTBAR_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + ItemStack stack = buf.readItem(); + int hotbarSlotId = buf.readVarInt(); + if (hotbarSlotId >= 0 && hotbarSlotId < 9) { + AbstractContainerMenu menu = player.containerMenu; + player.getInventory().items.set(hotbarSlotId, stack.copy()); + menu.broadcastChanges(); + NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); + } else { + player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); + } + }); NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { ServerPlayer player = (ServerPlayer) context.getPlayer(); CategoryIdentifier category = CategoryIdentifier.of(packetByteBuf.readResourceLocation()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 6070fc06a..be826d6c9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -122,6 +122,10 @@ public class ClientHelperImpl implements ClientHelper { return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); } + public boolean canUseHotbarPackets() { + return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); + } + public boolean canDeleteItems() { return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); } @@ -225,6 +229,37 @@ public class ClientHelperImpl implements ClientHelper { } } + @Override + public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { + if (e.getType() != VanillaEntryTypes.ITEM) + return false; + EntryStack entry = (EntryStack) e; + if (Minecraft.getInstance().player == null) return false; + if (Minecraft.getInstance().player.getInventory() == null) return false; + if (Minecraft.getInstance().gameMode != null && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (menu.getCarried().isEmpty()) { + Minecraft.getInstance().player.getInventory().setItem(hotbarSlotId, stack.getValue().copy()); + Minecraft.getInstance().player.inventoryMenu.broadcastChanges(); + return true; + } + } + if (ClientHelperImpl.getInstance().canUseHotbarPackets()) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (!menu.getCarried().isEmpty()) { + return false; + } + try { + NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId)); + return true; + } catch (Exception exception) { + return false; + } + } else return false; + } + @ApiStatus.Internal public Long2LongMap _getInventoryItemsTypes() { EntryDefinition definition; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java index bd15c0da5..cf7f2f5b7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.world.item.ItemStack; @@ -100,4 +101,29 @@ public abstract class DisplayedEntryWidget extends EntryWidget { } return super.cancelDeleteItems(stack); } + + @Override + public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) { + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { + EntryStack entry = getCurrentEntry().copy(); + if (!entry.isEmpty()) { + if (entry.getType() != VanillaEntryTypes.ITEM) { + EntryStack cheatsAs = entry.cheatsAs(); + entry = cheatsAs.isEmpty() ? entry : cheatsAs; + } + if (entry.getValueType() == ItemStack.class) { + entry.castValue().setCount(entry.castValue().getMaxStackSize()); + + KeyMapping[] keyHotbarSlots = Minecraft.getInstance().options.keyHotbarSlots; + for (int i = 0; i < keyHotbarSlots.length; i++) { + if (keyHotbarSlots[i].matches(keyCode, scanCode)) { + return ClientHelper.getInstance().tryCheatingEntryTo(entry, i); + } + } + } + } + } + + return super.keyPressedIgnoreContains(keyCode, scanCode, modifiers); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index ff338307b..e52ca1cb8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -486,8 +486,26 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg if (containsChecked(mouseX, mouseY, false)) { LocalPlayer player = minecraft.player; if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && ClientHelperImpl.getInstance().canDeleteItems()) { - ClientHelper.getInstance().sendDeletePacket(); - return true; + EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); + if (stack.getType() != VanillaEntryTypes.ITEM) { + EntryStack cheatsAs = stack.cheatsAs(); + stack = cheatsAs.isEmpty() ? stack : cheatsAs; + } + boolean canDelete = true; + + for (Widget child : children()) { + if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget widget) { + if (widget.cancelDeleteItems(stack)) { + canDelete = false; + break; + } + } + } + + if (canDelete) { + ClientHelper.getInstance().sendDeletePacket(); + return true; + } } for (Widget widget : children()) if (widget.mouseReleased(mouseX, mouseY, button)) -- cgit From e91266f40fdb8bd38583c3aeb8dbb375def82272 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 00:14:01 +0800 Subject: Fix #387 --- .../rei/impl/client/gui/ScreenOverlayImpl.java | 80 +++++++++++----------- 1 file changed, 39 insertions(+), 41 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index e4b22622b..6f9e01570 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -302,58 +302,56 @@ public class ScreenOverlayImpl extends ScreenOverlay { final Rectangle configButtonArea = getConfigButtonArea(); UUID configButtonUuid = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f"); widgets.add(configButton = InternalWidgets.wrapLateRenderable( - Widgets.withTranslate( - InternalWidgets.concatWidgets( - Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE) - .onClick(button -> { - if (Screen.hasShiftDown() || Screen.hasControlDown()) { - ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating()); - return; - } - ConfigManager.getInstance().openConfigScreen(REIRuntime.getInstance().getPreviousScreen()); - }) - .onRender((matrices, button) -> { - if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && ClientHelperImpl.getInstance().hasOperatorPermission()) { - button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063); + + InternalWidgets.concatWidgets( + Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE) + .onClick(button -> { + if (Screen.hasShiftDown() || Screen.hasControlDown()) { + ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating()); + return; + } + ConfigManager.getInstance().openConfigScreen(REIRuntime.getInstance().getPreviousScreen()); + }) + .onRender((matrices, button) -> { + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && ClientHelperImpl.getInstance().hasOperatorPermission()) { + button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063); + } else { + button.removeTint(); + } + + boolean isOpened = isMenuOpened(configButtonUuid); + if (isOpened || !isAnyMenuOpened()) { + boolean inBounds = (isNotInExclusionZones(PointHelper.getMouseFloatingX(), PointHelper.getMouseFloatingY()) && button.containsMouse(PointHelper.ofMouse())) || isMenuInBounds(configButtonUuid); + if (isOpened != inBounds) { + if (inBounds) { + Menu menu = new Menu(button.getBounds(), provideConfigButtonMenu(), false); + openMenu(configButtonUuid, menu, button::containsMouse, point -> true); } else { - button.removeTint(); - } - - boolean isOpened = isMenuOpened(configButtonUuid); - if (isOpened || !isAnyMenuOpened()) { - boolean inBounds = (isNotInExclusionZones(PointHelper.getMouseFloatingX(), PointHelper.getMouseFloatingY()) && button.containsMouse(PointHelper.ofMouse())) || isMenuInBounds(configButtonUuid); - if (isOpened != inBounds) { - if (inBounds) { - Menu menu = new Menu(button.getBounds(), provideConfigButtonMenu(), false); - openMenu(configButtonUuid, menu, button::containsMouse, point -> true); - } else { - closeOverlayMenu(); - } - } + closeOverlayMenu(); } - }) - .focusable(false) - .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)), - Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { - helper.setBlitOffset(helper.getBlitOffset() + 1); - RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE); - helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14); - helper.setBlitOffset(helper.getBlitOffset() - 1); + } + } }) - ), - 0, 0, 600 + .focusable(false) + .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)), + Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + helper.setBlitOffset(helper.getBlitOffset() + 1); + RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE); + helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14); + helper.setBlitOffset(helper.getBlitOffset() - 1); + }) ) )); Rectangle subsetsButtonBounds = getSubsetsButtonBounds(); if (ConfigObject.getInstance().isSubsetsEnabled()) { - widgets.add(InternalWidgets.wrapLateRenderable(Widgets.withTranslate(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets")) + widgets.add(InternalWidgets.wrapLateRenderable(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(subsetsButtonBounds), point -> true, point -> true); }, menu -> { closeOverlayMenu(); }); - }), 0, 0, 600))); + }))); } if (!ConfigObject.getInstance().isEntryListWidgetScrolled()) { widgets.add(Widgets.createClickableLabel(new Point(bounds.x + ((bounds.width - 18) / 2), bounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), NarratorChatListener.NO_TITLE, label -> { @@ -375,7 +373,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { Rectangle area = getCraftableToggleArea(); ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE); - this.widgets.add(Widgets.withTranslate(InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets( + this.widgets.add(InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets( Widgets.createButton(area, NarratorChatListener.NO_TITLE) .focusable(false) .onClick(button -> { @@ -392,7 +390,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { itemRenderer.renderGuiItem(icon, (int) vector.x(), (int) vector.y()); itemRenderer.blitOffset = 0.0F; })) - ), 0, 0, 600)); + )); } widgets.add(draggingStack); -- cgit From 15b115f1675db77e7886330c920e0d9879553272 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 00:25:50 +0800 Subject: Close #910 --- .../client/gui/widget/DisplayTooltipComponent.java | 82 ++++++++++++++++++++++ .../rei/impl/client/gui/widget/EntryWidget.java | 7 ++ 2 files changed, 89 insertions(+) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java new file mode 100644 index 000000000..7afa419ed --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java @@ -0,0 +1,82 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.gui.widget; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.display.DisplaySpec; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.world.inventory.tooltip.TooltipComponent; + +import java.util.List; + +public class DisplayTooltipComponent implements TooltipComponent, ClientTooltipComponent { + private final Widget widget; + private final DisplaySpec display; + private final Rectangle bounds; + + public DisplayTooltipComponent(DisplaySpec display) { + Display internalDisplay = display.provideInternalDisplay(); + CategoryRegistry.CategoryConfiguration configuration = CategoryRegistry.getInstance().get((CategoryIdentifier) internalDisplay.getCategoryIdentifier()); + DisplayCategory category = configuration.getCategory(); + this.bounds = new Rectangle(0, 0, category.getDisplayWidth(internalDisplay), category.getDisplayHeight()); + List widgets = configuration.getView(internalDisplay).setupDisplay(internalDisplay, bounds); + + this.display = display; + this.widget = Widgets.concat(widgets); + } + + public DisplayTooltipComponent(DisplaySpec display, List widgets, Rectangle bounds) { + this.widget = Widgets.concat(widgets); + this.display = display; + this.bounds = bounds; + } + + @Override + public int getHeight() { + return bounds.height + 4; + } + + @Override + public int getWidth(Font font) { + return bounds.width + 4; + } + + @Override + public void renderImage(Font font, int x, int y, PoseStack matrices, ItemRenderer itemRenderer, int z) { + matrices.pushPose(); + matrices.translate(x + 2, y + 2, z); + matrices.translate(-this.bounds.getX(), -this.bounds.getY(), 0); + widget.render(matrices, -1000, -1000, 0); + matrices.popPose(); + } +} 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 e4d8acd40..68c914dd4 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 @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -62,6 +63,7 @@ import net.minecraft.client.Minecraft; 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.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.TextComponent; @@ -73,6 +75,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Supplier; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -100,6 +103,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { private long lastCheckTime = -1; private Display display; + private Supplier displayTooltipComponent; public EntryWidget(Point point) { this(new Rectangle(point.x - 1, point.y - 1, 18, 18)); @@ -310,6 +314,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); if (result.successful) { this.display = display; + this.displayTooltipComponent = Suppliers.memoize(() -> new DisplayTooltipComponent(display)); return result.successfulHandler; } } @@ -333,6 +338,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { } display = null; + displayTooltipComponent = null; lastCheckTime = -1; } @@ -411,6 +417,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (tooltip != null && getTransferHandler() != null && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { tooltip.add(new TranslatableComponent("text.auto_craft.move_items.tooltip").withStyle(ChatFormatting.YELLOW)); + tooltip.add((ClientTooltipComponent) displayTooltipComponent.get()); } if (tooltip != null) { -- cgit From d29999d83cc133e4d8479213b790d4ab85860ce0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 16:49:11 +0800 Subject: Fix #921 --- .../main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 6f9e01570..7d8918402 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -347,7 +347,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { widgets.add(InternalWidgets.wrapLateRenderable(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(subsetsButtonBounds), point -> true, point -> true); + openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(subsetsButtonBounds), point -> true, point -> ConfigObject.getInstance().isSubsetsEnabled()); }, menu -> { closeOverlayMenu(); }); -- cgit From f3d1fcf38f027c74acc0f7105b2521db48bf3372 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 17:10:42 +0800 Subject: Fix #864 --- .../rei/impl/client/config/ConfigManagerImpl.java | 12 ++ .../rei/impl/client/config/ConfigObjectImpl.java | 8 +- .../gui/widget/favorites/FavoritesListWidget.java | 3 +- .../gui/widget/favorites/history/DisplayEntry.java | 28 +++- .../favorites/history/DisplayHistoryManager.java | 141 +++++++++++++++++++++ .../favorites/history/DisplayHistoryWidget.java | 38 +++--- 6 files changed, 203 insertions(+), 27 deletions(-) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index a386028bf..1685e67ae 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -188,6 +188,18 @@ public class ConfigManagerImpl implements ConfigManager { } }); + // CompoundTag + builder.registerSerializer(CompoundTag.class, (value, marshaller) -> { + return marshaller.serialize(value.toString()); + }); + builder.registerDeserializer(String.class, CompoundTag.class, (value, marshaller) -> { + try { + return TagParser.parseTag(value); + } catch (CommandSyntaxException e) { + throw new DeserializationException(e); + } + }); + // EntryStackProvider builder.registerSerializer(EntryStackProvider.class, (stack, marshaller) -> { try { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index 0bfa01856..1ec1b4fb1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -39,6 +39,7 @@ import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.level.GameType; import org.jetbrains.annotations.ApiStatus; @@ -369,12 +370,16 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Override public List getFavoriteEntries() { return basics.favorites; - } + } public List getHiddenFavoriteEntries() { return basics.hiddenFavorites; } + public List getDisplayHistory() { + return basics.displayHistory; + } + @Override public List> getFilteredStackProviders() { return advanced.filtering.filteredStacks; @@ -531,6 +536,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { public static class Basics { @ConfigEntry.Gui.Excluded public List favorites = new ArrayList<>(); @ConfigEntry.Gui.Excluded public List hiddenFavorites = new ArrayList<>(); + @ConfigEntry.Gui.Excluded public List displayHistory = new ArrayList<>(); @Comment("Declares whether cheating mode is on.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private CheatingMode cheating = CheatingMode.OFF; private boolean favoritesEnabled = true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java index d77bd67d9..c2b9782b2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java @@ -53,6 +53,7 @@ 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.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.listeners.FavoritesRegionListener; import me.shedaniel.rei.impl.client.gui.widget.favorites.listeners.FavoritesSystemRegionListener; @@ -190,7 +191,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableCo boolean draggingDisplay = DraggingContext.getInstance().isDraggingComponent() && DraggingContext.getInstance().getDragged().get() instanceof Display; int topOffsetHeight = 0; - this.favoritesBounds = displayHistory.getEntries().isEmpty() && !draggingDisplay + this.favoritesBounds = DisplayHistoryManager.INSTANCE.getEntries(displayHistory).isEmpty() && !draggingDisplay ? fullBounds : RectangleUtils.excludeZones(this.fullBounds, Stream.of(displayHistory.createBounds(this.excludedBounds))); systemRegion.getBounds().setBounds(this.favoritesBounds.x, this.favoritesBounds.y + 1, this.favoritesBounds.width, Math.max(1, systemRegion.scrolling.getMaxScrollHeight())); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index 38072c498..d0ff40d6b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -43,26 +43,39 @@ import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.UUID; public class DisplayEntry extends WidgetWithBounds { private final LazyResettable> widgets = new LazyResettable<>(this::setupWidgets); private final DisplayHistoryWidget parent; private final Display display; private final Dimension size = new Dimension(1, 1); + private boolean hasInitialBounds; private final ValueAnimator bounds = ValueAnimator.ofFloatingRectangle(); private final Button plusButton; private double xOffset = 0; private boolean reachedStable = false; + private UUID uuid = UUID.randomUUID(); - public DisplayEntry(DisplayHistoryWidget parent, Display display, Rectangle initialBounds) { + public DisplayEntry(DisplayHistoryWidget parent, Display display, @Nullable Rectangle initialBounds) { this.display = display; this.parent = parent; - this.bounds.setAs(initialBounds.getFloatingBounds()); - this.plusButton = Widgets.createButton(new Rectangle(initialBounds.getMaxX() - 16, initialBounds.getMaxY() - 16, 10, 10), new TextComponent("+")); + this.hasInitialBounds = initialBounds != null; + if (this.hasInitialBounds) { + this.bounds.setAs(initialBounds.getFloatingBounds()); + this.plusButton = Widgets.createButton(new Rectangle(initialBounds.getMaxX() - 16, initialBounds.getMaxY() - 16, 10, 10), new TextComponent("+")); + } else { + this.plusButton = Widgets.createButton(new Rectangle(-1000, -1000, 10, 10), new TextComponent("+")); + } + } + + public UUID getUuid() { + return uuid; } public void markBoundsDirty() { @@ -85,10 +98,15 @@ public class DisplayEntry extends WidgetWithBounds { float x = parentBounds.getCenterX() - displayBounds.width / 2 * scale; float y = parentBounds.getCenterY() - displayBounds.height / 2 * scale; FloatingRectangle newBounds = new Rectangle(x, y, displayBounds.width * scale, displayBounds.height * scale).getFloatingBounds(); - if (this.size.width == 1 && this.size.height == 1) { - this.bounds.setTo(newBounds, 700); + if (hasInitialBounds) { + if (this.size.width == 1 && this.size.height == 1) { + this.bounds.setTo(newBounds, 700); + } else { + this.bounds.setAs(newBounds); + } } else { this.bounds.setAs(newBounds); + hasInitialBounds = true; } this.size.setSize(displayBounds.getSize()); return widgets; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java new file mode 100644 index 000000000..7f98c3122 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java @@ -0,0 +1,141 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.gui.widget.favorites.history; + +import com.google.common.collect.Iterables; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.common.InternalLogger; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class DisplayHistoryManager { + public static final DisplayHistoryManager INSTANCE = new DisplayHistoryManager(); + private Map entries = new LinkedHashMap<>(); + private long lastCheckTime = -1; + + public Collection getEntries(DisplayHistoryWidget parent) { + if ((lastCheckTime == -1 || Util.getMillis() - lastCheckTime > 4000) && !PluginManager.areAnyReloading()) { + updateEntries(parent); + lastCheckTime = Util.getMillis(); + } + + return Collections.unmodifiableCollection(entries.values()); + } + + private void updateEntries(DisplayHistoryWidget parent) { + List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + Map copy = new LinkedHashMap<>(entries); + entries.clear(); + for (CompoundTag tag : displayHistory) { + String uuid = tag.getString("DisplayHistoryUUID"); + + DisplayEntry entry = copy.get(uuid); + if (entry != null) { + entries.put(entry.getUuid().toString(), entry); + } else if (tag.getBoolean("DisplayHistoryContains")) { + try { + CategoryIdentifier categoryIdentifier = CategoryIdentifier.of(tag.getString("DisplayHistoryCategory")); + if (CategoryRegistry.getInstance().tryGet(categoryIdentifier).isPresent()) { + Display display = DisplaySerializerRegistry.getInstance().read(categoryIdentifier, tag.getCompound("DisplayHistoryData")); + DisplayEntry newEntry = new DisplayEntry(parent, display, null); + entries.put(newEntry.getUuid().toString(), newEntry); + } + } catch (Exception e) { + InternalLogger.getInstance().warn("Failed to read display history entry", e); + } + } + } + } + + public void removeEntry(DisplayEntry entry) { + this.entries.remove(entry.getUuid().toString()); + List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + displayHistory.removeIf(tag -> tag.getString("DisplayHistoryUUID").equals(entry.getUuid().toString())); + save(); + } + + public void addEntry(DisplayHistoryWidget parent, @Nullable Rectangle bounds, Display display) { + List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + Iterator iterator = this.entries.values().iterator(); + while (iterator.hasNext()) { + DisplayEntry entry = iterator.next(); + if (entry.getDisplay() == display) { + displayHistory.removeIf(tag -> tag.getString("DisplayHistoryUUID").equals(entry.getUuid().toString())); + iterator.remove(); + } + } + DisplayEntry newEntry = new DisplayEntry(parent, display, bounds); + Map copy = new LinkedHashMap<>(); + copy.put(newEntry.getUuid().toString(), newEntry); + copy.putAll(this.entries); + this.entries = copy; + while (entries.size() >= 10) { + DisplayEntry entry = Iterables.get(entries.values(), entries.size() - 1); + displayHistory.removeIf(tag -> tag.getString("DisplayHistoryUUID").equals(entry.getUuid().toString())); + this.entries.remove(entry.getUuid().toString()); + } + + CompoundTag compoundTag = new CompoundTag(); + compoundTag.putBoolean("DisplayHistoryContains", false); + compoundTag.putString("DisplayHistoryUUID", newEntry.getUuid().toString()); + compoundTag.putString("DisplayHistoryCategory", display.getCategoryIdentifier().toString()); + displayHistory.add(compoundTag); + + save(); + } + + private void save() { + List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + for (CompoundTag compoundTag : displayHistory) { + String uuid = compoundTag.getString("DisplayHistoryUUID"); + DisplayEntry entry = entries.get(uuid); + + if (entry != null) { + compoundTag.putBoolean("DisplayHistoryContains", false); + Display display = entry.getDisplay(); + boolean hasSerializer = DisplaySerializerRegistry.getInstance().hasSerializer(display.getCategoryIdentifier()); + + if (hasSerializer) { + try { + compoundTag.put("DisplayHistoryData", DisplaySerializerRegistry.getInstance().save(display, new CompoundTag())); + compoundTag.putBoolean("DisplayHistoryContains", true); + } catch (Exception e) { + InternalLogger.getInstance().warn("Failed to save display history entry", e); + } + } + } + } + + ConfigManagerImpl.getInstance().saveConfig(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java index d4d2cfb48..6c95663aa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java @@ -23,12 +23,10 @@ package me.shedaniel.rei.impl.client.gui.widget.favorites.history; -import com.google.common.collect.Iterables; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; import me.shedaniel.clothconfig2.ClothConfigInitializer; -import me.shedaniel.clothconfig2.api.ModifierKeyCode; import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.clothconfig2.api.animator.NumberAnimator; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; @@ -50,12 +48,11 @@ import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -65,7 +62,6 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC private final Rectangle bounds = new Rectangle(); private final NumberAnimator height; - private final List entries = new ArrayList<>(); private final NumberAnimator scroll = ValueAnimator.ofDouble(); public DisplayHistoryWidget(FavoritesListWidget parent) { @@ -85,13 +81,10 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC return bounds; } - public List getEntries() { - return entries; - } - @Override public void render(PoseStack poses, int mouseX, int mouseY, float delta) { Rectangle fullBounds = parent.excludedBounds; + List entries = new ArrayList<>(DisplayHistoryManager.INSTANCE.getEntries(this)); if (updateBounds(fullBounds)) { for (DisplayEntry entry : entries) { entry.markBoundsDirty(); @@ -212,7 +205,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC this.scroll.update(delta); if (this.scroll.target() >= 0 && this.scroll.target() <= getMaxScrollDist()) { - if (entries.size() > 1) { + if (DisplayHistoryManager.INSTANCE.getEntries(this).size() > 1) { int before = (int) (Math.floor(this.scroll.target() / getBounds().getWidth()) * getBounds().getWidth()); int after = (int) (Math.ceil(this.scroll.target() / getBounds().getWidth()) * getBounds().getWidth()); if (before <= this.scroll.target() && after >= this.scroll.target()) { @@ -229,6 +222,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC } public int getContentHeight() { + Collection entries = DisplayHistoryManager.INSTANCE.getEntries(this); if (entries.isEmpty()) return 0; return getBounds().getWidth() * entries.size(); } @@ -244,6 +238,8 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + Collection entries = DisplayHistoryManager.INSTANCE.getEntries(this); + if (containsMouse(mouseX, mouseY)) { for (DisplayEntry entry : entries) { if (!entry.isStable()) { @@ -266,7 +262,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - for (DisplayEntry entry : entries) { + for (DisplayEntry entry : DisplayHistoryManager.INSTANCE.getEntries(this)) { if (entry.mouseClicked(mouseX, mouseY, button)) { return true; } @@ -277,6 +273,8 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { + Collection entries = DisplayHistoryManager.INSTANCE.getEntries(this); + for (DisplayEntry entry : entries) { if (entry.mouseReleased(mouseX, mouseY, button)) { return true; @@ -290,7 +288,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC double xOffset = -this.scroll.value(); for (DisplayEntry entry : entries) { if (entry.isStable() && entry.getBounds().contains(mouse.x + xOffset, mouse.y)) { - entries.remove(entry); + DisplayHistoryManager.INSTANCE.removeEntry(entry); scroll.setAs(scroll.target() - getBounds().getWidth()); scroll.setTo(scroll.target() + getBounds().getWidth(), 800); DisplayCompositeWidget.DisplayDraggableComponent component = new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), @@ -308,6 +306,8 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + Collection entries = DisplayHistoryManager.INSTANCE.getEntries(this); + for (DisplayEntry entry : entries) { if (entry.keyPressed(keyCode, scanCode, modifiers)) { return true; @@ -321,7 +321,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC double xOffset = -this.scroll.value(); for (DisplayEntry entry : entries) { if (entry.isStable() && entry.getBounds().contains(mouse.x + xOffset, mouse.y)) { - entries.remove(entry); + DisplayHistoryManager.INSTANCE.removeEntry(entry); scroll.setAs(scroll.target() - getBounds().getWidth()); scroll.setTo(scroll.target() + getBounds().getWidth(), 800); DisplayCompositeWidget.DisplayDraggableComponent component = new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), @@ -350,14 +350,10 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC }) ? DraggedAcceptorResult.CONSUMED : DraggedAcceptorResult.PASS; } - public void addDisplay(Rectangle bounds, Display display) { - this.entries.removeIf(displayEntry -> displayEntry.getDisplay() == display); - this.entries.add(0, new DisplayEntry(this, display, bounds)); + public void addDisplay(@Nullable Rectangle bounds, Display display) { + DisplayHistoryManager.INSTANCE.addEntry(this, bounds, display); this.scroll.setAs(this.scroll.target() + getBounds().getWidth()); this.scroll.setTo(0, 800); - while (entries.size() >= 10) { - entries.remove(Iterables.get(entries, entries.size() - 1)); - } } @Override @@ -365,6 +361,8 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC public DraggableComponent getHovered(DraggingContext context, double mouseX, double mouseY) { if (containsMouse(mouseX, mouseY)) { double xOffset = -this.scroll.value(); + Collection entries = DisplayHistoryManager.INSTANCE.getEntries(this); + for (DisplayEntry entry : entries) { if (entry.isStable() && entry.getBounds().contains(mouseX + xOffset, mouseY)) { return new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), @@ -372,7 +370,7 @@ public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableC new Rectangle(0, 0, entry.getSize().width, entry.getSize().height)) { @Override public void drag() { - entries.remove(entry); + DisplayHistoryManager.INSTANCE.removeEntry(entry); scroll.setAs(scroll.target() - getBounds().getWidth()); scroll.setTo(scroll.target() + getBounds().getWidth(), 800); } -- cgit From d7ee88942e2085f9f5d4856c3de6de475b8b7733 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 17:57:45 +0800 Subject: Fix favorites panels queuing tooltips even when it is out of bounds --- .../gui/widget/favorites/panel/FavoritesPanel.java | 2 +- .../panel/rows/FavoritesPanelEmptyRow.java | 3 +- .../panel/rows/FavoritesPanelEntriesRow.java | 3 +- .../favorites/panel/rows/FavoritesPanelRow.java | 3 +- .../panel/rows/FavoritesPanelSectionRow.java | 53 +++++++++++----------- .../panel/rows/FavoritesPanelSeparatorRow.java | 3 +- 6 files changed, 36 insertions(+), 31 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java index 6271768e4..f23bb2c10 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java @@ -98,7 +98,7 @@ public class FavoritesPanel extends WidgetWithBounds { matrices.translate(0, -scroller.scrollAmount(), 0); int y = innerBounds.y; for (FavoritesPanelRow row : rows.get()) { - row.render(matrices, innerBounds.x, y, innerBounds.width, row.getRowHeight(), mouseX, mouseY + scroller.scrollAmountInt(), delta); + row.render(matrices, innerBounds, innerBounds.x, y, innerBounds.width, row.getRowHeight(), mouseX, mouseY + scroller.scrollAmountInt(), delta); y += row.getRowHeight(); } matrices.popPose(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java index 9858fe096..91fd38b36 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.gui.widget.favorites.panel.rows; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.Collections; @@ -42,7 +43,7 @@ public class FavoritesPanelEmptyRow extends FavoritesPanelRow { } @Override - public void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { + public void render(PoseStack matrices, Rectangle innerBounds, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java index 365f74159..9f68a8d72 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java @@ -28,6 +28,7 @@ import me.shedaniel.clothconfig2.api.animator.NumberAnimator; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; @@ -81,7 +82,7 @@ public class FavoritesPanelEntriesRow extends FavoritesPanelRow { } @Override - public void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { + public void render(PoseStack matrices, Rectangle innerBounds, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { this.lastY = y; int entrySize = entrySize(); boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java index 732598623..54e3964d5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java @@ -24,10 +24,11 @@ package me.shedaniel.rei.impl.client.gui.widget.favorites.panel.rows; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.AbstractContainerEventHandler; public abstract class FavoritesPanelRow extends AbstractContainerEventHandler { public abstract int getRowHeight(); - public abstract void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta); + public abstract void render(PoseStack matrices, Rectangle innerBounds, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta); } \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java index c9f0504e3..2c7a7fe6a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.gui.widget.favorites.panel.rows; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -33,29 +34,29 @@ import java.util.Collections; import java.util.List; public class FavoritesPanelSectionRow extends FavoritesPanelRow