From b4be45e414504afb49910d766bebcd00f55b052b Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 16 Jan 2020 16:10:19 +0800 Subject: 3.3.11 --- gradle.properties | 2 +- .../me/shedaniel/rei/api/OptimalEntryStack.java | 25 +++ .../java/me/shedaniel/rei/api/RecipeCategory.java | 1 - .../shedaniel/rei/gui/ContainerScreenOverlay.java | 7 +- .../me/shedaniel/rei/gui/OverlaySearchField.java | 41 +++-- .../shedaniel/rei/gui/PreRecipeViewingScreen.java | 7 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 5 +- .../rei/gui/VillagerRecipeViewingScreen.java | 3 + .../rei/gui/credits/CreditsEntryListWidget.java | 32 ++-- .../rei/gui/toast/CopyRecipeIdentifierToast.java | 16 +- .../rei/gui/widget/AutoCraftingButtonWidget.java | 3 + .../me/shedaniel/rei/gui/widget/ButtonWidget.java | 3 + .../gui/widget/ClickableActionedLabelWidget.java | 27 ++++ .../rei/gui/widget/ClickableLabelWidget.java | 16 +- .../gui/widget/CraftableToggleButtonWidget.java | 3 + .../shedaniel/rei/gui/widget/DraggableWidget.java | 3 + .../shedaniel/rei/gui/widget/EntryListWidget.java | 117 ++++++++++++-- .../me/shedaniel/rei/gui/widget/EntryWidget.java | 35 ++-- .../rei/gui/widget/FavoritesListWidget.java | 5 +- .../me/shedaniel/rei/gui/widget/LabelWidget.java | 27 ++++ .../rei/gui/widget/RecipeArrowWidget.java | 6 + .../rei/gui/widget/RecipeChoosePageWidget.java | 10 +- .../me/shedaniel/rei/gui/widget/TabWidget.java | 8 +- .../shedaniel/rei/gui/widget/TextFieldWidget.java | 178 +++++++++++---------- .../java/me/shedaniel/rei/gui/widget/Widget.java | 18 +++ .../shedaniel/rei/gui/widget/WidgetWithBounds.java | 16 +- .../me/shedaniel/rei/impl/ConfigManagerImpl.java | 61 +++++-- .../me/shedaniel/rei/impl/ConfigObjectImpl.java | 4 +- .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 100 +++++++----- .../java/me/shedaniel/rei/impl/ScreenHelper.java | 3 +- src/main/java/me/shedaniel/rei/impl/Weather.java | 21 ++- .../rei/listeners/ContainerScreenHooks.java | 12 +- .../autocrafting/DefaultCategoryHandler.java | 12 +- .../autocrafting/DefaultRecipeBookHandler.java | 2 +- .../rei/plugin/brewing/BrewingRecipe.java | 6 +- .../plugin/campfire/DefaultCampfireCategory.java | 10 +- .../composting/DefaultCompostingDisplay.java | 20 +-- .../rei/plugin/cooking/DefaultCookingCategory.java | 16 +- .../information/DefaultInformationCategory.java | 2 +- .../stonecutting/DefaultStoneCuttingDisplay.java | 16 +- .../plugin/stripping/DefaultStrippingCategory.java | 12 +- .../assets/roughlyenoughitems/lang/en_us.json | 2 + 42 files changed, 606 insertions(+), 307 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/OptimalEntryStack.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/ClickableActionedLabelWidget.java diff --git a/gradle.properties b/gradle.properties index f7ce4fe63..6ea4adce3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -mod_version=3.3.10 +mod_version=3.3.11 minecraft_version=1.15.1 yarn_version=1.15.1+build.1 fabricloader_version=0.7.2+build.174 diff --git a/src/main/java/me/shedaniel/rei/api/OptimalEntryStack.java b/src/main/java/me/shedaniel/rei/api/OptimalEntryStack.java new file mode 100644 index 000000000..0a98ccf72 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/OptimalEntryStack.java @@ -0,0 +1,25 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.api; + +import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.annotations.Internal; + +@Internal +@Deprecated +public interface OptimalEntryStack { + default void optimisedRenderStart(float delta) { + } + + default void optimisedRenderBase(Rectangle bounds, int mouseX, int mouseY, float delta) { + } + + default void optimisedRenderOverlay(Rectangle bounds, int mouseX, int mouseY, float delta) { + } + + default void optimisedRenderEnd(float delta) { + } +} diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index fea0cf166..7378fb862 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -9,7 +9,6 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.gui.RecipeViewingScreen; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.CategoryBaseWidget; import me.shedaniel.rei.gui.widget.PanelWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.Widget; diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 7e51678b2..576f74ee6 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -293,11 +293,6 @@ public class ContainerScreenOverlay extends WidgetWithBounds { super.render(mouseX, mouseY, delta); } - @Override - public Optional getTooltips() { - return Optional.ofNullable(I18n.translate("text.rei.go_back_first_page")); - } - @Override public void onLabelClicked() { MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); @@ -309,7 +304,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds { public boolean changeFocus(boolean boolean_1) { return false; } - }); + }.tooltip(() -> I18n.translate("text.rei.go_back_first_page"))); } if (ConfigObject.getInstance().isCraftableFilterEnabled()) this.widgets.add(toggleButtonWidget = new CraftableToggleButtonWidget(getCraftableToggleArea()) { diff --git a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index 46ffc30ba..31b4a5d7b 100644 --- a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -7,6 +7,7 @@ package me.shedaniel.rei.gui; import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.math.api.Point; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.widget.TextFieldWidget; @@ -16,15 +17,18 @@ import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.InputUtil; import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Pair; import java.util.List; +@Internal +@Deprecated public class OverlaySearchField extends TextFieldWidget { public static boolean isSearching = false; public long keybindFocusTime = -1; public int keybindFocusKey = -1; - protected long lastClickedTime = -1; + protected Pair lastClickedDetails = null; private List history = Lists.newArrayListWithCapacity(100); OverlaySearchField(int x, int y, int width, int height) { @@ -67,14 +71,25 @@ public class OverlaySearchField extends TextFieldWidget { this.font.drawWithShadow(this.font.trimToWidth(this.getSuggestion(), this.getWidth()), x, y, -6250336); } + @SuppressWarnings("deprecation") @Override public void renderBorder() { - if (!isSearching) - super.renderBorder(); - else if (this.hasBorder()) { + boolean hasError = ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty(); + if (isSearching) { fill(this.getBounds().x - 1, this.getBounds().y - 1, this.getBounds().x + this.getBounds().width + 1, this.getBounds().y + this.getBounds().height + 1, -852212); - fill(this.getBounds().x, this.getBounds().y, this.getBounds().x + this.getBounds().width, this.getBounds().y + this.getBounds().height, -16777216); + } else if (hasError) { + fill(this.getBounds().x - 1, this.getBounds().y - 1, this.getBounds().x + this.getBounds().width + 1, this.getBounds().y + this.getBounds().height + 1, -43691); + } else { + super.renderBorder(); + return; } + fill(this.getBounds().x, this.getBounds().y, this.getBounds().x + this.getBounds().width, this.getBounds().y + this.getBounds().height, -16777216); + } + + public int getManhattanDistance(Point point1, Point point2) { + int e = Math.abs(point1.getX() - point2.getX()); + int f = Math.abs(point1.getY() - point2.getY()); + return e + f; } @Override @@ -83,14 +98,16 @@ public class OverlaySearchField extends TextFieldWidget { if (isVisible() && contains && int_1 == 1) setText(""); if (contains && int_1 == 0) - if (lastClickedTime == -1) - lastClickedTime = System.currentTimeMillis(); - else if (System.currentTimeMillis() - lastClickedTime > 700) - lastClickedTime = -1; - else { - lastClickedTime = -1; + if (lastClickedDetails == null) + lastClickedDetails = new Pair<>(System.currentTimeMillis(), new Point(double_1, double_2)); + else if (System.currentTimeMillis() - lastClickedDetails.getLeft() > 1500) + lastClickedDetails = null; + else if (getManhattanDistance(lastClickedDetails.getRight(), new Point(double_1, double_2)) <= 25) { + lastClickedDetails = null; isSearching = !isSearching; minecraft.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + } else { + lastClickedDetails = new Pair<>(System.currentTimeMillis(), new Point(double_1, double_2)); } return super.mouseClicked(double_1, double_2, int_1); } @@ -140,7 +157,7 @@ public class OverlaySearchField extends TextFieldWidget { } @Override - public void render(int int_1, int int_2, float float_1) { + public void render(int mouseX, int mouseY, float delta) { } } diff --git a/src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java index c45868256..1220a4df2 100644 --- a/src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java @@ -11,6 +11,7 @@ import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWi import me.shedaniel.clothconfig2.impl.EasingMethod; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.config.RecipeScreenType; import me.shedaniel.rei.gui.widget.ButtonWidget; import me.shedaniel.rei.gui.widget.LabelWidget; @@ -30,6 +31,8 @@ import net.minecraft.util.math.MathHelper; import java.util.Collections; import java.util.List; +@Internal +@Deprecated public class PreRecipeViewingScreen extends Screen { private static final Identifier IDENTIFIER = new Identifier("roughlyenoughitems", "textures/gui/screenshot.png"); @@ -96,9 +99,9 @@ public class PreRecipeViewingScreen extends Screen { } }); this.widgets.add(new ScreenTypeSelection(width / 2 - 200 - 5, height / 2 - 112 / 2 - 10, 0)); - this.widgets.add(new LabelWidget(new Point(width / 2 - 200 - 5 + 104, height / 2 - 112 / 2 + 115), I18n.translate("config.roughlyenoughitems.recipeScreenType.original")).noShadow().color(-1124073473)); + this.widgets.add(LabelWidget.create(new Point(width / 2 - 200 - 5 + 104, height / 2 - 112 / 2 + 115), I18n.translate("config.roughlyenoughitems.recipeScreenType.original")).noShadow().color(-1124073473)); this.widgets.add(new ScreenTypeSelection(width / 2 + 5, height / 2 - 112 / 2 - 10, 112)); - this.widgets.add(new LabelWidget(new Point(width / 2 + 5 + 104, height / 2 - 112 / 2 + 115), I18n.translate("config.roughlyenoughitems.recipeScreenType.villager")).noShadow().color(-1124073473)); + this.widgets.add(LabelWidget.create(new Point(width / 2 + 5 + 104, height / 2 - 112 / 2 + 115), I18n.translate("config.roughlyenoughitems.recipeScreenType.villager")).noShadow().color(-1124073473)); this.children.addAll(widgets); } diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index 7347c0694..e4fa346be 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -11,6 +11,7 @@ import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.widget.*; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; @@ -30,6 +31,8 @@ import javax.annotation.Nullable; import java.util.*; import java.util.function.Supplier; +@Deprecated +@Internal public class RecipeViewingScreen extends Screen { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); @@ -359,7 +362,7 @@ public class RecipeViewingScreen extends Screen { public static class WorkstationSlotWidget extends EntryWidget { public WorkstationSlotWidget(int x, int y, List widgets) { - super(x, y); + super(new Point(x, y)); entries(widgets); noBackground(); } diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index b49b1f50b..f12f7e8d1 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -14,6 +14,7 @@ import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.widget.*; import me.shedaniel.rei.impl.ScreenHelper; @@ -37,6 +38,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; +@Deprecated +@Internal public class VillagerRecipeViewingScreen extends Screen { private int tabsPerPage = 8; diff --git a/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java index 6c8248788..e76c9294e 100644 --- a/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java @@ -11,13 +11,13 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.text.Text; public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWidget { - + private boolean inFocus; - + public CreditsEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY) { super(client, width, height, startY, endY, DrawableHelper.BACKGROUND_LOCATION); } - + @Override public boolean changeFocus(boolean boolean_1) { if (!this.inFocus && this.getItemCount() == 0) { @@ -29,58 +29,58 @@ public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWi } else if (this.inFocus && this.getFocused() != null) { this.moveSelection(0); } - + return this.inFocus; } } - + public void creditsClearEntries() { clearItems(); } - + private CreditsItem rei_getEntry(int int_1) { return this.children().get(int_1); } - + public void creditsAddEntry(CreditsItem entry) { addItem(entry); } - + @Override public int getItemWidth() { return width - 80; } - + @Override protected int getScrollbarPosition() { return width - 40; } - + public static class CreditsItem extends DynamicNewSmoothScrollingEntryListWidget.Entry { private String text; - + public CreditsItem(Text textComponent) { this(textComponent.asFormattedString()); } - + public CreditsItem(String text) { this.text = text; } - + @Override public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) { MinecraftClient.getInstance().textRenderer.drawWithShadow(text, x + 5, y + 5, -1); } - + @Override public int getItemHeight() { return 12; } - + @Override public boolean changeFocus(boolean boolean_1) { return false; } } - + } diff --git a/src/main/java/me/shedaniel/rei/gui/toast/CopyRecipeIdentifierToast.java b/src/main/java/me/shedaniel/rei/gui/toast/CopyRecipeIdentifierToast.java index 18cf9f54e..7169e13d6 100644 --- a/src/main/java/me/shedaniel/rei/gui/toast/CopyRecipeIdentifierToast.java +++ b/src/main/java/me/shedaniel/rei/gui/toast/CopyRecipeIdentifierToast.java @@ -14,21 +14,21 @@ import net.minecraft.util.Identifier; import javax.annotation.Nullable; public class CopyRecipeIdentifierToast implements Toast { - + protected static final Identifier TOASTS_TEX = new Identifier("roughlyenoughitems", "textures/gui/toasts.png"); private String title; private String subtitle; private long startTime; - + public CopyRecipeIdentifierToast(String title, @Nullable String subtitleNullable) { this.title = title; this.subtitle = subtitleNullable; } - + public static void addToast(String title, @Nullable String subtitleNullable) { MinecraftClient.getInstance().getToastManager().add(new CopyRecipeIdentifierToast(title, subtitleNullable)); } - + @Override public Visibility draw(ToastManager toastManager, long var2) { toastManager.getGame().getTextureManager().bindTexture(TOASTS_TEX); @@ -40,17 +40,17 @@ public class CopyRecipeIdentifierToast implements Toast { toastManager.getGame().textRenderer.draw(this.title, 18.0F, 7.0F, 11141120); toastManager.getGame().textRenderer.draw(this.subtitle, 18.0F, 18.0F, -16777216); } - + return var2 - this.startTime < 5000L ? Visibility.SHOW : Visibility.HIDE; } - + @Override public Object getType() { return Type.THIS_IS_SURE_A_TYPE; } - + public enum Type { THIS_IS_SURE_A_TYPE } - + } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java index d425b9376..0fe31025b 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java @@ -11,6 +11,7 @@ import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.toast.CopyRecipeIdentifierToast; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.MinecraftClient; @@ -27,6 +28,8 @@ import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Collectors; +@Internal +@Deprecated public class AutoCraftingButtonWidget extends ButtonWidget { private static final Lazy IS_YOG = new Lazy(() -> { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java index 315f272a6..2599e906e 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.api.ConfigObject; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.gui.Element; import net.minecraft.client.sound.PositionedSoundInstance; @@ -22,6 +23,8 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +@Internal +@Deprecated public abstract class ButtonWidget extends WidgetWithBounds { protected static final Identifier BUTTON_LOCATION = new Identifier("roughlyenoughitems", "textures/gui/button.png"); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ClickableActionedLabelWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ClickableActionedLabelWidget.java new file mode 100644 index 000000000..85adca39e --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/ClickableActionedLabelWidget.java @@ -0,0 +1,27 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.widget; + +import me.shedaniel.math.api.Point; +import me.shedaniel.rei.api.annotations.Internal; + +import java.util.function.Consumer; + +@Deprecated +@Internal +public class ClickableActionedLabelWidget extends ClickableLabelWidget { + private Consumer onClicked; + + ClickableActionedLabelWidget(Point point, String text, Consumer onClicked) { + super(point, text); + this.onClicked = onClicked; + } + + @Override + public void onLabelClicked() { + onClicked.accept(this); + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java index 53effc029..f6304a985 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java @@ -8,8 +8,6 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Point; import me.shedaniel.rei.impl.ScreenHelper; -import java.util.Optional; - public abstract class ClickableLabelWidget extends LabelWidget { public boolean focused; @@ -32,6 +30,7 @@ public abstract class ClickableLabelWidget extends LabelWidget { clickable(clickable); } + @Deprecated public ClickableLabelWidget(Point point, String text) { super(point, text); this.hoveredColor = ScreenHelper.isDarkModeEnabled() ? -1 : 0xFF66FFCC; @@ -69,11 +68,16 @@ public abstract class ClickableLabelWidget extends LabelWidget { else font.draw(getText(), pos.x, pos.y, color); } - if (isClickable() && getTooltips().isPresent()) + drawTooltips(mouseX, mouseY); + } + + @Override + protected void drawTooltips(int mouseX, int mouseY) { + if (getTooltips().isPresent()) if (!focused && containsMouse(mouseX, mouseY)) ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n"))); else if (focused) - ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(pos, getTooltips().get().split("\n"))); + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getPosition(), getTooltips().get().split("\n"))); } public int getHoveredColor() { @@ -89,10 +93,6 @@ public abstract class ClickableLabelWidget extends LabelWidget { return false; } - public Optional getTooltips() { - return Optional.empty(); - } - @Override public boolean keyPressed(int int_1, int int_2, int int_3) { if (!isClickable() || !focused) diff --git a/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java index bffd7cfae..043dd9934 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java @@ -8,6 +8,7 @@ package me.shedaniel.rei.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.api.ConfigManager; +import me.shedaniel.rei.api.annotations.Internal; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.item.ItemRenderer; @@ -17,6 +18,8 @@ import net.minecraft.util.Identifier; import java.util.Optional; +@Deprecated +@Internal public abstract class CraftableToggleButtonWidget extends ButtonWidget { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java index e7f52e7e1..830ed5858 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/DraggableWidget.java @@ -8,10 +8,13 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.annotations.Internal; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.util.Window; +@Deprecated +@Internal public abstract class DraggableWidget extends WidgetWithBounds { public boolean dragged = false; diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 5e1e9cf94..5eb221f1e 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -15,6 +15,7 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.config.ItemListOrdering; import me.shedaniel.rei.impl.ScreenHelper; @@ -37,14 +38,12 @@ import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Locale; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Supplier; import java.util.stream.Collectors; +@Internal public class EntryListWidget extends WidgetWithBounds { static final Supplier RENDER_ENCHANTMENT_GLINT = ConfigObject.getInstance()::doesRenderEntryEnchantmentGlint; @@ -72,6 +71,7 @@ public class EntryListWidget extends WidgetWithBounds { private List allStacks = null; private List favorites = null; private List entries = Collections.emptyList(); + private List renders = Collections.emptyList(); private List widgets = Collections.emptyList(); @SuppressWarnings("deprecation") private List lastSearchArguments = Collections.emptyList(); private boolean draggingScrollBar = false; @@ -324,16 +324,55 @@ public class EntryListWidget extends WidgetWithBounds { } else { if (debugTime) { int size = 0; - long totalTimeStart = System.nanoTime(); long time = 0; - for (Widget widget : widgets) { - if (widget instanceof EntryListEntry) { + for (Widget widget : renders) { + widget.render(mouseX, mouseY, delta); + } + long totalTimeStart = System.nanoTime(); + if (ConfigObject.getInstance().doesFastEntryRendering()) { + for (Map.Entry, List> entry : entries.stream().collect(Collectors.groupingBy(entryListEntry -> entryListEntry.getCurrentEntry().getClass())).entrySet()) { + List list = entry.getValue(); + if (list.isEmpty()) + continue; + EntryListEntry firstWidget = list.get(0); + EntryStack first = firstWidget.getCurrentEntry(); + if (first instanceof OptimalEntryStack) { + OptimalEntryStack firstStack = (OptimalEntryStack) first; + firstStack.optimisedRenderStart(delta); + size += list.size(); + long l = System.nanoTime(); + for (EntryListEntry listEntry : list) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + currentEntry.setZ(100); + listEntry.drawBackground(mouseX, mouseY, delta); + ((OptimalEntryStack) currentEntry).optimisedRenderBase(listEntry.getInnerBounds(), mouseX, mouseY, delta); + } + for (EntryListEntry listEntry : list) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + ((OptimalEntryStack) currentEntry).optimisedRenderOverlay(listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (listEntry.containsMouse(mouseX, mouseY)) { + listEntry.queueTooltip(mouseX, mouseY, delta); + listEntry.drawHighlighted(mouseX, mouseY, delta); + } + } + time += (System.nanoTime() - l); + firstStack.optimisedRenderEnd(delta); + } else { + for (EntryListEntry listEntry : list) { + size++; + long l = System.nanoTime(); + listEntry.render(mouseX, mouseY, delta); + time += (System.nanoTime() - l); + } + } + } + } else { + for (EntryListEntry entry : entries) { size++; long l = System.nanoTime(); - widget.render(mouseX, mouseY, delta); + entry.render(mouseX, mouseY, delta); time += (System.nanoTime() - l); - } else - widget.render(mouseX, mouseY, delta); + } } long totalTime = System.nanoTime() - totalTimeStart; int z = getZ(); @@ -349,9 +388,45 @@ public class EntryListWidget extends WidgetWithBounds { immediate.draw(); setZ(z); } else { - for (Widget widget : widgets) { + for (Widget widget : renders) { widget.render(mouseX, mouseY, delta); } + if (ConfigObject.getInstance().doesFastEntryRendering()) { + for (Map.Entry, List> entry : entries.stream().collect(Collectors.groupingBy(entryListEntry -> entryListEntry.getCurrentEntry().getClass())).entrySet()) { + List list = entry.getValue(); + if (list.isEmpty()) + continue; + EntryListEntry firstWidget = list.get(0); + EntryStack first = firstWidget.getCurrentEntry(); + if (first instanceof OptimalEntryStack) { + OptimalEntryStack firstStack = (OptimalEntryStack) first; + firstStack.optimisedRenderStart(delta); + for (EntryListEntry listEntry : list) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + currentEntry.setZ(100); + listEntry.drawBackground(mouseX, mouseY, delta); + ((OptimalEntryStack) currentEntry).optimisedRenderBase(listEntry.getInnerBounds(), mouseX, mouseY, delta); + } + for (EntryListEntry listEntry : list) { + EntryStack currentEntry = listEntry.getCurrentEntry(); + ((OptimalEntryStack) currentEntry).optimisedRenderOverlay(listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (listEntry.containsMouse(mouseX, mouseY)) { + listEntry.queueTooltip(mouseX, mouseY, delta); + listEntry.drawHighlighted(mouseX, mouseY, delta); + } + } + firstStack.optimisedRenderEnd(delta); + } else { + for (EntryListEntry listEntry : list) { + listEntry.render(mouseX, mouseY, delta); + } + } + } + } else { + for (EntryListEntry listEntry : entries) { + listEntry.render(mouseX, mouseY, delta); + } + } } } if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) @@ -464,6 +539,7 @@ public class EntryListWidget extends WidgetWithBounds { public void updateEntriesPosition() { this.innerBounds = updateInnerBounds(bounds); if (!ConfigObject.getInstance().isEntryListWidgetScrolled()) { + this.renders = Lists.newArrayList(); page = Math.max(page, 0); List entries = Lists.newArrayList(); int width = innerBounds.width / entrySize(); @@ -484,12 +560,11 @@ public class EntryListWidget extends WidgetWithBounds { entries.get(i + Math.max(0, numberForFavorites - page * entries.size())).isFavorites = false; } this.entries = entries; - this.widgets = Lists.newArrayList(entries); if (numberForFavorites > 0) { int skippedFavorites = page * (entries.size() - width); int j = 0; if (skippedFavorites < favorites.size()) { - widgets.add(new LabelWidget(new Point(innerBounds.x + 2, innerBounds.y + 6), I18n.translate("text.rei.favorites")).leftAligned()); + renders.add(LabelWidget.create(new Point(innerBounds.x + 2, innerBounds.y + 6), I18n.translate("text.rei.favorites")).leftAligned()); j += width; } List subFavoritesList = favorites.stream().skip(skippedFavorites).limit(Math.max(0, entries.size() - width)).collect(Collectors.toList()); @@ -499,6 +574,8 @@ public class EntryListWidget extends WidgetWithBounds { j++; } } + this.widgets = Lists.newArrayList(renders); + this.widgets.addAll(entries); } else { page = 0; int width = innerBounds.width / entrySize(); @@ -519,7 +596,8 @@ public class EntryListWidget extends WidgetWithBounds { } } this.entries = entries; - this.widgets = Collections.unmodifiableList(entries); + this.widgets = Lists.newArrayList(renders); + this.widgets.addAll(entries); } FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); if (favoritesListWidget != null) @@ -741,24 +819,29 @@ public class EntryListWidget extends WidgetWithBounds { private boolean isFavorites; private EntryListEntry(int x, int y) { - super(x, y); + super(new Point(x, y)); this.backupY = y; getBounds().width = getBounds().height = entrySize(); } + @Override + public void drawBackground(int mouseX, int mouseY, float delta) { + super.drawBackground(mouseX, mouseY, delta); + } + @Override public boolean containsMouse(double mouseX, double mouseY) { return super.containsMouse(mouseX, mouseY) && bounds.contains(mouseX, mouseY); } @Override - protected void drawHighlighted(int mouseX, int mouseY, float delta) { + public void drawHighlighted(int mouseX, int mouseY, float delta) { if (getCurrentEntry().getType() != EntryStack.Type.EMPTY) super.drawHighlighted(mouseX, mouseY, delta); } @Override - protected void queueTooltip(int mouseX, int mouseY, float delta) { + public void queueTooltip(int mouseX, int mouseY, float delta) { if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty()) { super.queueTooltip(mouseX, mouseY, delta); } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java index 4d7601e21..dd7b2f429 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -7,6 +7,7 @@ package me.shedaniel.rei.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.clothconfig2.api.ModifierKeyCode; +import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.ClientHelper; @@ -39,12 +40,20 @@ public class EntryWidget extends WidgetWithBounds { private List entryStacks; protected EntryWidget(int x, int y) { - this.bounds = new Rectangle(x - 1, y - 1, 18, 18); + this(new Point(x, y)); + } + + protected EntryWidget(Point point) { + this.bounds = new Rectangle(point.x - 1, point.y - 1, 18, 18); this.entryStacks = new ArrayList<>(); } public static EntryWidget create(int x, int y) { - return new EntryWidget(x, y); + return create(new Point(x, y)); + } + + public static EntryWidget create(Point point) { + return new EntryWidget(point); } public EntryWidget disableInteractions() { @@ -131,23 +140,31 @@ public class EntryWidget extends WidgetWithBounds { @Override public void render(int mouseX, int mouseY, float delta) { - if (background) { - drawBackground(mouseX, mouseY, delta); - } + drawBackground(mouseX, mouseY, delta); drawCurrentEntry(mouseX, mouseY, delta); boolean highlighted = containsMouse(mouseX, mouseY); - if (tooltips && highlighted) { + if (hasTooltips() && highlighted) { queueTooltip(mouseX, mouseY, delta); } - if (highlight && highlighted) { + if (hasHighlight() && highlighted) { drawHighlighted(mouseX, mouseY, delta); } } + public final boolean hasTooltips() { + return tooltips; + } + + public final boolean hasHighlight() { + return highlight; + } + protected void drawBackground(int mouseX, int mouseY, float delta) { - minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? RECIPE_GUI_DARK : RECIPE_GUI); - blit(bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + if (background) { + minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? RECIPE_GUI_DARK : RECIPE_GUI); + blit(bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + } } protected void drawCurrentEntry(int mouseX, int mouseY, float delta) { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java index 19faf9d04..d44c75b36 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -10,9 +10,11 @@ import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.clothconfig2.ClothConfigInitializer; import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget; +import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.config.ItemListOrdering; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; @@ -28,6 +30,7 @@ import java.util.List; import static me.shedaniel.rei.gui.widget.EntryListWidget.*; +@Internal public class FavoritesListWidget extends WidgetWithBounds { protected double target; protected double scroll; @@ -318,7 +321,7 @@ public class FavoritesListWidget extends WidgetWithBounds { private int backupY; private EntryListEntry(int x, int y) { - super(x, y); + super(new Point(x, y)); this.backupY = y; getBounds().width = getBounds().height = entrySize(); } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java index ac6815d3d..bd9acb417 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java @@ -12,6 +12,9 @@ import net.minecraft.client.gui.Element; import java.util.Collections; import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Supplier; public class LabelWidget extends WidgetWithBounds { @@ -20,18 +23,33 @@ public class LabelWidget extends WidgetWithBounds { private int defaultColor; private boolean hasShadows = true; private boolean centered = true; + private Supplier tooltipSupplier; @Deprecated public LabelWidget(int x, int y, String text) { this(new Point(x, y), text); } + @Deprecated public LabelWidget(Point point, String text) { this.pos = point; this.text = text; this.defaultColor = ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : -1; } + public static LabelWidget create(Point point, String text) { + return new LabelWidget(point, text); + } + + public static ClickableLabelWidget createClickable(Point point, String text, Consumer onClicked) { + return new ClickableActionedLabelWidget(point, text, onClicked); + } + + public LabelWidget tooltip(Supplier tooltipSupplier) { + this.tooltipSupplier = tooltipSupplier; + return this; + } + public boolean isCentered() { return centered; } @@ -94,6 +112,10 @@ public class LabelWidget extends WidgetWithBounds { return this; } + public Optional getTooltips() { + return Optional.ofNullable(tooltipSupplier).map(Supplier::get); + } + @Override public Rectangle getBounds() { int width = font.getStringWidth(text); @@ -125,4 +147,9 @@ public class LabelWidget extends WidgetWithBounds { } } + protected void drawTooltips(int mouseX, int mouseY) { + if (getTooltips().isPresent()) + if (containsMouse(mouseX, mouseY)) + ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n"))); + } } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java index f48d3020e..be4b0f897 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeArrowWidget.java @@ -5,6 +5,7 @@ package me.shedaniel.rei.gui.widget; +import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.plugin.DefaultPlugin; import net.minecraft.client.MinecraftClient; @@ -19,12 +20,17 @@ public class RecipeArrowWidget extends WidgetWithBounds { private int x, y; private boolean animated; + @Deprecated public RecipeArrowWidget(int x, int y, boolean animated) { this.x = x; this.y = y; this.animated = animated; } + public static RecipeArrowWidget create(Point point, boolean animated) { + return new RecipeArrowWidget(point.x, point.y, animated); + } + @Override public Rectangle getBounds() { return new Rectangle(x, y, 24, 17); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java index 8325d2428..7e231f7e0 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.gui.RecipeViewingScreen; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.MinecraftClient; @@ -20,6 +21,8 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +@Deprecated +@Internal public class RecipeChoosePageWidget extends DraggableWidget { private int currentPage; @@ -101,13 +104,12 @@ public class RecipeChoosePageWidget extends DraggableWidget { int width = font.getStringWidth(endString); this.widgets.add(textFieldWidget = new TextFieldWidget(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18)); textFieldWidget.setMaxLength(10000); - textFieldWidget.stripInvaild = s -> { + textFieldWidget.stripInvalid = s -> { StringBuilder stringBuilder_1 = new StringBuilder(); char[] var2 = s.toCharArray(); int var3 = var2.length; - for (int var4 = 0; var4 < var3; ++var4) { - char char_1 = var2[var4]; + for (char char_1 : var2) { if (Character.isDigit(char_1)) stringBuilder_1.append(char_1); } @@ -170,7 +172,7 @@ public class RecipeChoosePageWidget extends DraggableWidget { public Optional getIntFromString(String s) { try { return Optional.of(Integer.valueOf(s)); - } catch (Exception e) { + } catch (Exception ignored) { } return Optional.empty(); } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java index ca3bb420d..17e7e3edf 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java @@ -9,6 +9,7 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeCategory; +import me.shedaniel.rei.api.annotations.Internal; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -16,6 +17,8 @@ import net.minecraft.util.Identifier; import java.util.Collections; import java.util.List; +@Deprecated +@Internal public class TabWidget extends WidgetWithBounds { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); @@ -26,7 +29,7 @@ public class TabWidget extends WidgetWithBounds { public int id; public String categoryName; public Rectangle bounds; - public RecipeCategory category; + public RecipeCategory category; public int u, v; public TabWidget(int id, Rectangle bounds) { @@ -48,7 +51,7 @@ public class TabWidget extends WidgetWithBounds { this(id, new Rectangle(leftX + id * tabSize, bottomY - tabSize, tabSize, tabSize), u, v); } - public void setRenderer(RecipeCategory category, EntryStack logo, String categoryName, boolean selected) { + public void setRenderer(RecipeCategory category, EntryStack logo, String categoryName, boolean selected) { if (logo == null) { shown = false; this.logo = null; @@ -91,7 +94,6 @@ public class TabWidget extends WidgetWithBounds { } } - @SuppressWarnings("deprecation") private void drawTooltip() { if (this.minecraft.options.advancedItemTooltips) ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(categoryName, Formatting.DARK_GRAY.toString() + category.getIdentifier().toString(), ClientHelper.getInstance().getFormattedModFromIdentifier(category.getIdentifier()))); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java index ce52952d5..48c5b0d57 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java @@ -5,8 +5,6 @@ package me.shedaniel.rei.gui.widget; -import com.google.common.base.Predicates; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; @@ -28,7 +26,7 @@ import java.util.function.Predicate; public class TextFieldWidget extends WidgetWithBounds implements Tickable { - public Function stripInvaild; + public Function stripInvalid; protected int focusedTicks; protected boolean editable; protected int field_2103; @@ -43,7 +41,6 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { private boolean hasBorder; private boolean field_2096; private boolean focused; - private boolean field_17037; private boolean visible; private String suggestion; private Consumer changedListener; @@ -58,12 +55,12 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { this.editableColor = 14737632; this.notEditableColor = 7368816; this.visible = true; - this.textPredicate = Predicates.alwaysTrue(); + this.textPredicate = s -> true; this.renderTextProvider = (string_1, integer_1) -> { return string_1; }; this.bounds = rectangle; - this.stripInvaild = s -> SharedConstants.stripInvalidChars(s); + this.stripInvalid = SharedConstants::stripInvalidChars; } public TextFieldWidget(int x, int y, int width, int height) { @@ -109,13 +106,13 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { } this.onChanged(string_1); - this.method_1872(); + this.moveCursorToEnd(); } } public String getSelectedText() { - int int_1 = this.cursorMax < this.cursorMin ? this.cursorMax : this.cursorMin; - int int_2 = this.cursorMax < this.cursorMin ? this.cursorMin : this.cursorMax; + int int_1 = Math.min(this.cursorMax, this.cursorMin); + int int_2 = Math.max(this.cursorMax, this.cursorMin); return this.text.substring(int_1, int_2); } @@ -125,9 +122,9 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { public void addText(String string_1) { String string_2 = ""; - String string_3 = stripInvaild.apply(string_1); - int int_1 = this.cursorMax < this.cursorMin ? this.cursorMax : this.cursorMin; - int int_2 = this.cursorMax < this.cursorMin ? this.cursorMin : this.cursorMax; + String string_3 = stripInvalid.apply(string_1); + int int_1 = Math.min(this.cursorMax, this.cursorMin); + int int_2 = Math.max(this.cursorMax, this.cursorMin); int int_3 = this.maxLength - this.text.length() - (int_1 - int_2); if (!this.text.isEmpty()) { string_2 = string_2 + this.text.substring(0, int_1); @@ -200,7 +197,7 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { if (this.textPredicate.test(string_1)) { this.text = string_1; if (boolean_1) { - this.moveCursor(int_1); + this.moveCursor(int_1, true); } this.onChanged(this.text); @@ -247,32 +244,32 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { return int_3; } - public void moveCursor(int int_1) { - this.method_1883(this.cursorMax + int_1); + public void moveCursor(int int_1, boolean resetSelect) { + this.moveCursorTo(this.cursorMax + int_1, resetSelect); } - public void method_1883(int int_1) { + public void moveCursorTo(int int_1, boolean resetSelect) { this.setCursor(int_1); - if (!this.field_17037) { + // if (!this.field_17037) { + if (resetSelect) { this.method_1884(this.cursorMax); } this.onChanged(this.text); } - public void method_1870() { - this.method_1883(0); + public void moveCursorToHead() { + this.moveCursorTo(0, true); } - public void method_1872() { - this.method_1883(this.text.length()); + public void moveCursorToEnd() { + this.moveCursorTo(this.text.length(), true); } public boolean keyPressed(int int_1, int int_2, int int_3) { if (this.isVisible() && this.isFocused()) { - this.field_17037 = Screen.hasShiftDown(); if (Screen.isSelectAll(int_1)) { - this.method_1872(); + this.moveCursorToEnd(); this.method_1884(0); return true; } else if (Screen.isCopy(int_1)) { @@ -314,25 +311,25 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { return true; case 262: if (Screen.hasControlDown()) { - this.method_1883(this.method_1853(1)); + this.moveCursorTo(this.method_1853(1), !Screen.hasShiftDown()); } else { - this.moveCursor(1); + this.moveCursor(1, !Screen.hasShiftDown()); } return true; case 263: if (Screen.hasControlDown()) { - this.method_1883(this.method_1853(-1)); + this.moveCursorTo(this.method_1853(-1), !Screen.hasShiftDown()); } else { - this.moveCursor(-1); + this.moveCursor(-1, !Screen.hasShiftDown()); } return true; case 268: - this.method_1870(); + this.moveCursorToHead(); return true; case 269: - this.method_1872(); + this.moveCursorToEnd(); return true; } } @@ -379,7 +376,7 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { } String string_1 = this.font.trimToWidth(this.text.substring(this.field_2103), this.getWidth()); - this.method_1883(this.font.trimToWidth(string_1, int_2).length() + this.field_2103); + this.moveCursorTo(this.font.trimToWidth(string_1, int_2).length() + this.field_2103, true); return true; } else { return false; @@ -397,7 +394,7 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { } } - public void render(int int_1, int int_2, float float_1) { + public void render(int mouseX, int mouseY, float delta) { if (this.isVisible()) { renderBorder(); @@ -407,55 +404,50 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { String string_1 = this.font.trimToWidth(this.text.substring(this.field_2103), this.getWidth()); boolean boolean_1 = int_4 >= 0 && int_4 <= string_1.length(); boolean boolean_2 = this.focused && this.focusedTicks / 6 % 2 == 0 && boolean_1; - int int_6 = this.hasBorder ? this.bounds.x + 4 : this.bounds.x; - int int_7 = this.hasBorder ? this.bounds.y + (this.bounds.height - 8) / 2 : this.bounds.y; - int int_8 = int_6; + int x = this.hasBorder ? this.bounds.x + 4 : this.bounds.x; + int y = this.hasBorder ? this.bounds.y + (this.bounds.height - 8) / 2 : this.bounds.y; + int int_8 = x; if (int_5 > string_1.length()) { int_5 = string_1.length(); } if (!string_1.isEmpty()) { String string_2 = boolean_1 ? string_1.substring(0, int_4) : string_1; - int_8 = this.font.drawWithShadow(this.renderTextProvider.apply(string_2, this.field_2103), (float) int_6, (float) int_7, color); + int_8 = this.font.drawWithShadow(this.renderTextProvider.apply(string_2, this.field_2103), (float) x, (float) y, color); } - boolean boolean_3 = this.cursorMax < this.text.length() || this.text.length() >= this.getMaxLength(); + boolean isCursorInsideText = this.cursorMax < this.text.length() || this.text.length() >= this.getMaxLength(); int int_9 = int_8; if (!boolean_1) { - int_9 = int_4 > 0 ? int_6 + this.bounds.width : int_6; - } else if (boolean_3) { - int_9 = int_8 - 1; + int_9 = int_4 > 0 ? x + this.bounds.width : x; + } else if (isCursorInsideText) { --int_8; } + int_9--; if (!string_1.isEmpty() && boolean_1 && int_4 < string_1.length()) { - this.font.drawWithShadow(this.renderTextProvider.apply(string_1.substring(int_4), this.cursorMax), (float) int_8, (float) int_7, color); + this.font.drawWithShadow(this.renderTextProvider.apply(string_1.substring(int_4), this.cursorMax), (float) int_8, (float) y, color); } - if (!boolean_3 && text.isEmpty() && this.suggestion != null) { - renderSuggestion(int_6, int_7); + if (!isCursorInsideText && text.isEmpty() && this.suggestion != null) { + renderSuggestion(x, y); } - int var10002; - int var10003; if (boolean_2) { - if (boolean_3) { - int var10001 = int_7 - 1; - var10002 = int_9 + 1; - var10003 = int_7 + 1; - this.font.getClass(); - fill(int_9, var10001, var10002, var10003 + 9, -3092272); - } else { - this.font.drawWithShadow("_", (float) int_9, (float) int_7, color); - } + // if (isCursorInsideText) { + fill(int_9 + 1, y, int_9 + 2, y + 9, ((0xFF) << 24) | ((((color >> 16 & 255) / 4) & 0xFF) << 16) | ((((color >> 8 & 255) / 4) & 0xFF) << 8) | ((((color & 255) / 4) & 0xFF))); + // fill(int_9, y, int_9 + 1, y + 9, 0xff343434); + fill(int_9, y - 1, int_9 + 1, y + 8, ((0xFF) << 24) | color); + // fill(int_9 - 1, y - 1, int_9, y + 8, 0xffd0d0d0); + // } else { + // this.font.drawWithShadow("|", (float) int_9 - 2, (float) y, 0xffd0d0d0); + // } } + // Render selection overlay if (int_5 != int_4) { - int int_10 = int_6 + this.font.getStringWidth(string_1.substring(0, int_5)); - var10002 = int_7 - 1; - var10003 = int_10 - 1; - int var10004 = int_7 + 1; - this.method_1886(int_9, var10002, var10003, var10004 + 9); + int int_10 = x + this.font.getStringWidth(string_1.substring(0, int_5)); + this.method_1886(int_9, y - 1, int_10 - 1, y + 9, color); } } } @@ -464,41 +456,59 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable { this.font.drawWithShadow(this.font.trimToWidth(this.suggestion, this.getWidth()), x, y, -8355712); } - protected void method_1886(int int_1, int int_2, int int_3, int int_4) { - int int_6; - if (int_1 < int_3) { - int_6 = int_1; - int_1 = int_3; - int_3 = int_6; + protected void method_1886(int x1, int y1, int x2, int y2, int color) { + int tmp; + if (x1 < x2) { + tmp = x1; + x1 = x2; + x2 = tmp; } - if (int_2 < int_4) { - int_6 = int_2; - int_2 = int_4; - int_4 = int_6; + if (y1 < y2) { + tmp = y1; + y1 = y2; + y2 = tmp; } - if (int_3 > this.bounds.x + this.bounds.width) { - int_3 = this.bounds.x + this.bounds.width; + if (x2 > this.bounds.x + this.bounds.width) { + x2 = this.bounds.x + this.bounds.width; } - if (int_1 > this.bounds.x + this.bounds.width) { - int_1 = this.bounds.x + this.bounds.width; + if (x1 > this.bounds.x + this.bounds.width) { + x1 = this.bounds.x + this.bounds.width; } - Tessellator tessellator_1 = Tessellator.getInstance(); - BufferBuilder bufferBuilder_1 = tessellator_1.getBuffer(); - RenderSystem.color4f(0.0F, 0.0F, 255.0F, 255.0F); + int r = (color >> 16 & 255); + int g = (color >> 8 & 255); + int b = (color & 255); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + // RenderSystem.color4f(0.0F, 0.0F, 255.0F, 255.0F); + //