From 12223ae029f3d206ebb19ba0cd134e3c36827315 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 6 Mar 2020 04:18:21 +0800 Subject: 3.0.7 Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 6 +- .../java/me/shedaniel/rei/api/ClientHelper.java | 3 +- src/main/java/me/shedaniel/rei/api/REIHelper.java | 42 ++++++++ .../java/me/shedaniel/rei/api/RecipeCategory.java | 3 +- .../me/shedaniel/rei/gui/OverlaySearchField.java | 5 +- .../shedaniel/rei/gui/RecipeDisplayExporter.java | 2 +- .../java/me/shedaniel/rei/gui/RecipeScreen.java | 43 ++++++++ .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 95 ++++++++--------- .../me/shedaniel/rei/gui/StackToNoticeScreen.java | 36 ------- .../rei/gui/VillagerRecipeViewingScreen.java | 112 ++++++++++----------- .../rei/gui/config/entry/FilteringEntry.java | 5 +- .../rei/gui/credits/CreditsEntryListWidget.java | 44 +++++++- .../shedaniel/rei/gui/credits/CreditsScreen.java | 43 +++++--- .../me/shedaniel/rei/gui/widget/ButtonWidget.java | 3 +- .../rei/gui/widget/ClickableLabelWidget.java | 3 +- .../shedaniel/rei/gui/widget/EntryListWidget.java | 4 +- .../me/shedaniel/rei/gui/widget/EntryWidget.java | 9 +- .../rei/gui/widget/FavoritesListWidget.java | 8 +- .../me/shedaniel/rei/gui/widget/LabelWidget.java | 3 +- .../me/shedaniel/rei/gui/widget/PanelWidget.java | 6 +- .../rei/gui/widget/RecipeChoosePageWidget.java | 6 +- .../shedaniel/rei/gui/widget/SlotBaseWidget.java | 4 +- .../me/shedaniel/rei/gui/widget/TabWidget.java | 24 +++-- .../shedaniel/rei/gui/widget/TextFieldWidget.java | 4 +- .../me/shedaniel/rei/impl/ClientHelperImpl.java | 41 +++++--- .../me/shedaniel/rei/impl/DisplayHelperImpl.java | 1 - .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 5 - .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 4 +- .../java/me/shedaniel/rei/impl/ScreenHelper.java | 56 ++++++++--- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 3 +- .../plugin/beacon/DefaultBeaconBaseDisplay.java | 1 - .../plugin/campfire/DefaultCampfireCategory.java | 4 +- .../rei/plugin/cooking/DefaultCookingCategory.java | 4 +- .../rei/plugin/fuel/DefaultFuelCategory.java | 4 +- .../information/DefaultInformationCategory.java | 6 +- .../me/shedaniel/rei/utils/CollectionUtils.java | 2 +- 36 files changed, 393 insertions(+), 251 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/REIHelper.java create mode 100644 src/main/java/me/shedaniel/rei/gui/RecipeScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/StackToNoticeScreen.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 552e2a9cb..17afa2d4a 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -276,14 +276,14 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { if (screen instanceof ContainerScreen) ScreenHelper.setLastContainerScreen((ContainerScreen) screen); boolean alreadyAdded = false; - for (Element element : Lists.newArrayList(screenHooks.cloth_getInputListeners())) + for (Element element : Lists.newArrayList(screenHooks.cloth_getChildren())) if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass())) if (alreadyAdded) - screenHooks.cloth_getInputListeners().remove(element); + screenHooks.cloth_getChildren().remove(element); else alreadyAdded = true; if (!alreadyAdded) - screenHooks.cloth_getInputListeners().add(ScreenHelper.getLastOverlay(true, false)); + screenHooks.cloth_getChildren().add(ScreenHelper.getLastOverlay(true, false)); }); ClothClientHooks.SCREEN_RENDER_POST.register((minecraftClient, screen, i, i1, v) -> { if (shouldReturn(screen.getClass())) diff --git a/src/main/java/me/shedaniel/rei/api/ClientHelper.java b/src/main/java/me/shedaniel/rei/api/ClientHelper.java index 207e51dd1..d0f310649 100644 --- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java @@ -36,9 +36,8 @@ public interface ClientHelper { /** * @return the api instance of {@link ClientHelperImpl} */ - @SuppressWarnings("deprecation") static ClientHelper getInstance() { - return ClientHelperImpl.instance; + return ClientHelperImpl.getInstance(); } /** diff --git a/src/main/java/me/shedaniel/rei/api/REIHelper.java b/src/main/java/me/shedaniel/rei/api/REIHelper.java new file mode 100644 index 000000000..99a5e0415 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/REIHelper.java @@ -0,0 +1,42 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 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.api; + +import me.shedaniel.rei.gui.widget.TextFieldWidget; +import me.shedaniel.rei.impl.ScreenHelper; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public interface REIHelper { + static REIHelper getInstance() { + return ScreenHelper.getInstance(); + } + + boolean isDarkThemeEnabled(); + + TextFieldWidget getSearchTextField(); + + List getInventoryStacks(); +} diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java index 1149b9be0..826c0add1 100644 --- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java @@ -30,7 +30,6 @@ import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.PanelWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.Widget; -import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.util.Identifier; import org.jetbrains.annotations.ApiStatus; @@ -99,7 +98,7 @@ public interface RecipeCategory { @ApiStatus.OverrideOnly default void drawCategoryBackground(Rectangle bounds, int mouseX, int mouseY, float delta) { PanelWidget.render(bounds, -1); - if (ScreenHelper.isDarkModeEnabled()) { + if (REIHelper.getInstance().isDarkThemeEnabled()) { DrawableHelper.fill(bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, 0xFF404040); DrawableHelper.fill(bounds.x + 17, bounds.y + 19, bounds.x + bounds.width - 17, bounds.y + 31, 0xFF404040); } else { diff --git a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index afc1f4b1a..2e61a9bcc 100644 --- a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -27,6 +27,7 @@ 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.REIHelper; import me.shedaniel.rei.gui.widget.TextFieldWidget; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.MinecraftClient; @@ -73,7 +74,7 @@ public class OverlaySearchField extends TextFieldWidget { public void laterRender(int int_1, int int_2, float float_1) { RenderSystem.disableDepthTest(); - setEditableColor(isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching && isMain ? -852212 : (containsMouse(PointHelper.fromMouse()) || isFocused()) ? (ScreenHelper.isDarkModeEnabled() ? -17587 : -1) : -6250336); + setEditableColor(isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching && isMain ? -852212 : (containsMouse(PointHelper.fromMouse()) || isFocused()) ? (REIHelper.getInstance().isDarkThemeEnabled() ? -17587 : -1) : -6250336); setSuggestion(!isFocused() && getText().isEmpty() ? I18n.translate("text.rei.search.field.suggestion") : null); super.render(int_1, int_2, float_1); RenderSystem.enableDepthTest(); @@ -82,7 +83,7 @@ public class OverlaySearchField extends TextFieldWidget { @Override protected void renderSuggestion(int x, int y) { if (containsMouse(PointHelper.fromMouse()) || isFocused()) - this.font.drawWithShadow(this.font.trimToWidth(this.getSuggestion(), this.getWidth()), x, y, ScreenHelper.isDarkModeEnabled() ? 0xccddaa3d : 0xddeaeaea); + this.font.drawWithShadow(this.font.trimToWidth(this.getSuggestion(), this.getWidth()), x, y, REIHelper.getInstance().isDarkThemeEnabled() ? 0xccddaa3d : 0xddeaeaea); else this.font.drawWithShadow(this.font.trimToWidth(this.getSuggestion(), this.getWidth()), x, y, -6250336); } diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java b/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java index 6ada23c54..4b9a88f0c 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java @@ -79,7 +79,7 @@ public final class RecipeDisplayExporter extends Widget { private void exportRecipe(Rectangle rectangle, List widgets) { Framebuffer framebuffer = new Framebuffer(rectangle.width * 8, rectangle.height * 8, true, MinecraftClient.IS_SYSTEM_MAC); framebuffer.setClearColor(0, 0, 0, 0); - // int color = ScreenHelper.isDarkModeEnabled() ? -13750738 : -3750202; + // int color = REIHelper.getInstance().isDarkThemeEnabled() ? -13750738 : -3750202; // framebuffer.setClearColor(((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f, ((color >> 24) & 0xFF) / 255f); framebuffer.clear(MinecraftClient.IS_SYSTEM_MAC); RenderSystem.pushMatrix(); diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java new file mode 100644 index 000000000..3bd6f0afe --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java @@ -0,0 +1,43 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 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.gui; + +import me.shedaniel.rei.api.EntryStack; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface RecipeScreen { + @ApiStatus.Internal + void addIngredientStackToNotice(EntryStack stack); + + @ApiStatus.Internal + void addResultStackToNotice(EntryStack stack); + + @ApiStatus.Internal + Identifier getCurrentCategory(); + + @ApiStatus.Internal + void recalculateCategoryPage(); +} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index a678ce12c..e6e5bccdc 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -32,6 +32,7 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; import me.shedaniel.rei.gui.widget.*; +import me.shedaniel.rei.impl.ClientHelperImpl; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.MinecraftClient; @@ -41,11 +42,11 @@ import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; +import net.minecraft.client.util.NarratorManager; import net.minecraft.client.util.Window; import net.minecraft.client.util.math.Matrix4f; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; -import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -57,46 +58,47 @@ import java.util.*; import java.util.function.Supplier; @ApiStatus.Internal -public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { +public class RecipeViewingScreen extends Screen implements RecipeScreen { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - private final List preWidgets; - private final List widgets; - private final Map> recipeBounds; - private final List tabs; + private final List preWidgets = Lists.newArrayList(); + private final List widgets = Lists.newArrayList(); + private final Map> recipeBounds = Maps.newHashMap(); + private final List tabs = Lists.newArrayList(); private final Map, List> categoriesMap; private final List> categories; + private final RecipeCategory selectedCategory; public int guiWidth; public int guiHeight; - public int page, categoryPages; + public int page; + public int categoryPages = -1; public int largestWidth, largestHeight; - public boolean choosePageActivated; + public boolean choosePageActivated = false; public RecipeChoosePageWidget recipeChoosePageWidget; private int tabsPerPage = 5; private Rectangle bounds; - @Nullable private CategoryBaseWidget workingStationsBaseWidget; - private RecipeCategory selectedCategory; + @Nullable + private CategoryBaseWidget workingStationsBaseWidget; private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext; private EntryStack ingredientStackToNotice = EntryStack.empty(); private EntryStack resultStackToNotice = EntryStack.empty(); - public RecipeViewingScreen(Map, List> categoriesMap) { - super(new LiteralText("")); - this.categoryPages = 0; - this.preWidgets = Lists.newArrayList(); - this.widgets = Lists.newArrayList(); - this.recipeBounds = Maps.newHashMap(); + public RecipeViewingScreen(Map, List> categoriesMap, @Nullable Identifier category) { + super(NarratorManager.EMPTY); Window window = MinecraftClient.getInstance().getWindow(); this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, 176, 150); this.categoriesMap = categoriesMap; - this.categories = Lists.newArrayList(); - for (RecipeCategory category : RecipeHelper.getInstance().getAllCategories()) { - if (categoriesMap.containsKey(category)) - categories.add(category); + this.categories = Lists.newArrayList(categoriesMap.keySet()); + RecipeCategory selected = categories.get(0); + if (category != null) { + for (RecipeCategory recipeCategory : categories) { + if (recipeCategory.getIdentifier().equals(category)) { + selected = recipeCategory; + break; + } + } } - this.selectedCategory = (RecipeCategory) categories.get(0); - this.tabs = new ArrayList<>(); - this.choosePageActivated = false; + this.selectedCategory = (RecipeCategory) selected; } @ApiStatus.Internal @@ -138,6 +140,16 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { this.resultStackToNotice = stack; } + @Override + public Identifier getCurrentCategory() { + return selectedCategory.getIdentifier(); + } + + @Override + public void recalculateCategoryPage() { + this.categoryPages = -1; + } + @Nullable public CategoryBaseWidget getWorkingStationsBaseWidget() { return workingStationsBaseWidget; @@ -202,10 +214,13 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { this.widgets.clear(); this.largestWidth = width - 100; this.largestHeight = Math.max(height - 36, 100); - int maxWidthDisplay = CollectionUtils.mapAndMax(getCurrentDisplayed(), display -> selectedCategory.getDisplayWidth(display), (Comparator) Comparator.naturalOrder()).orElse(150); + int maxWidthDisplay = CollectionUtils.mapAndMax(getCurrentDisplayed(), selectedCategory::getDisplayWidth, Comparator.naturalOrder()).orElse(150); this.guiWidth = maxWidthDisplay + 20; this.guiHeight = MathHelper.floor(MathHelper.clamp((double) (selectedCategory.getDisplayHeight() + 4) * (getRecipesPerPage() + 1) + 36, 100, largestHeight)); this.tabsPerPage = Math.max(5, MathHelper.floor((guiWidth - 20d) / tabSize)); + if (this.categoryPages == -1) { + this.categoryPages = Math.max(0, categories.indexOf(selectedCategory) / tabsPerPage); + } this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); this.page = MathHelper.clamp(page, 0, getTotalPages(selectedCategory) - 1); ButtonWidget w, w2; @@ -227,10 +242,7 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { currentCategoryIndex--; if (currentCategoryIndex < 0) currentCategoryIndex = categories.size() - 1; - selectedCategory = (RecipeCategory) categories.get(currentCategoryIndex); - categoryPages = MathHelper.floor(currentCategoryIndex / (double) tabsPerPage); - page = 0; - RecipeViewingScreen.this.init(); + ClientHelperImpl.getInstance().openRecipeViewingScreen(categoriesMap, categories.get(currentCategoryIndex).getIdentifier(), ingredientStackToNotice, resultStackToNotice); }).tooltip(() -> I18n.translate("text.rei.previous_category"))); widgets.add(LabelWidget.createClickable(new Point(bounds.getCenterX(), bounds.getY() + 7), selectedCategory.getCategoryName(), clickableLabelWidget -> { MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); @@ -241,10 +253,7 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { currentCategoryIndex++; if (currentCategoryIndex >= categories.size()) currentCategoryIndex = 0; - selectedCategory = (RecipeCategory) categories.get(currentCategoryIndex); - categoryPages = MathHelper.floor(currentCategoryIndex / (double) tabsPerPage); - page = 0; - RecipeViewingScreen.this.init(); + ClientHelperImpl.getInstance().openRecipeViewingScreen(categoriesMap, categories.get(currentCategoryIndex).getIdentifier(), ingredientStackToNotice, resultStackToNotice); }).tooltip(() -> I18n.translate("text.rei.next_category"))); categoryBack.enabled = categories.size() > 1; categoryNext.enabled = categories.size() > 1; @@ -281,21 +290,13 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { int j = i + categoryPages * tabsPerPage; if (categories.size() > j) { TabWidget tab; - tabs.add(tab = new TabWidget(i, tabSize, bounds.x + bounds.width / 2 - Math.min(categories.size() - categoryPages * tabsPerPage, tabsPerPage) * tabSize / 2, bounds.y, 0, tabV) { - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (containsMouse(mouseX, mouseY)) { - MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - if (getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)) - return false; - selectedCategory = (RecipeCategory) categories.get(getId() + categoryPages * tabsPerPage); - page = 0; - RecipeViewingScreen.this.init(); - return true; - } + tabs.add(tab = TabWidget.create(i, tabSize, bounds.x + bounds.width / 2 - Math.min(categories.size() - categoryPages * tabsPerPage, tabsPerPage) * tabSize / 2, bounds.y, 0, tabV, widget -> { + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if (widget.getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)) return false; - } - }); + ClientHelperImpl.getInstance().openRecipeViewingScreen(categoriesMap, categories.get(widget.getId() + categoryPages * tabsPerPage).getIdentifier(), ingredientStackToNotice, resultStackToNotice); + return true; + })); tab.setRenderer(categories.get(j), categories.get(j).getLogo(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)); } } @@ -398,7 +399,7 @@ public class RecipeViewingScreen extends Screen implements StackToNoticeScreen { selectedCategory.drawCategoryBackground(bounds, mouseX, mouseY, delta); else { PanelWidget.render(bounds, -1); - if (ScreenHelper.isDarkModeEnabled()) { + if (REIHelper.getInstance().isDarkThemeEnabled()) { fill(bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, 0xFF404040); fill(bounds.x + 17, bounds.y + 19, bounds.x + bounds.width - 17, bounds.y + 30, 0xFF404040); } else { diff --git a/src/main/java/me/shedaniel/rei/gui/StackToNoticeScreen.java b/src/main/java/me/shedaniel/rei/gui/StackToNoticeScreen.java deleted file mode 100644 index 93325e92f..000000000 --- a/src/main/java/me/shedaniel/rei/gui/StackToNoticeScreen.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020 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.gui; - -import me.shedaniel.rei.api.EntryStack; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public interface StackToNoticeScreen { - @ApiStatus.Internal - void addIngredientStackToNotice(EntryStack stack); - - @ApiStatus.Internal - void addResultStackToNotice(EntryStack stack); -} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index fc9e287b4..7ba09f59d 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -24,7 +24,6 @@ package me.shedaniel.rei.gui; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.clothconfig2.ClothConfigInitializer; import me.shedaniel.clothconfig2.api.ScissorsHandler; @@ -34,6 +33,7 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.widget.*; +import me.shedaniel.rei.impl.ClientHelperImpl; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.MinecraftClient; @@ -46,11 +46,12 @@ import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.NarratorManager; import net.minecraft.sound.SoundEvents; -import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -58,50 +59,42 @@ import java.util.Map; import java.util.Optional; @ApiStatus.Internal -public class VillagerRecipeViewingScreen extends Screen implements StackToNoticeScreen { +public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen { private final Map, List> categoryMap; private final List> categories; - private final List widgets; - private final List buttonWidgets; - private final List recipeRenderers; - private final List tabs; + private final List widgets = Lists.newArrayList(); + private final List buttonWidgets = Lists.newArrayList(); + private final List recipeRenderers = Lists.newArrayList(); + private final List tabs = Lists.newArrayList(); public Rectangle bounds, scrollListBounds; private int tabsPerPage = 8; - private int selectedCategoryIndex, selectedRecipeIndex; - private double scroll; + private int selectedCategoryIndex = 0; + private int selectedRecipeIndex = 0; + private double scrollAmount = 0; private double target; private long start; private long duration; - private float scrollBarAlpha; - private float scrollBarAlphaFuture; + private float scrollBarAlpha = 0; + private float scrollBarAlphaFuture = 0; private long scrollBarAlphaFutureTime = -1; - private boolean draggingScrollBar; - private int tabsPage; + private boolean draggingScrollBar = false; + private int tabsPage = -1; private EntryStack ingredientStackToNotice = EntryStack.empty(); private EntryStack resultStackToNotice = EntryStack.empty(); - public VillagerRecipeViewingScreen(Map, List> map) { - super(new LiteralText("")); - this.widgets = Lists.newArrayList(); - this.categoryMap = Maps.newLinkedHashMap(); - this.selectedCategoryIndex = 0; - this.selectedRecipeIndex = 0; - this.scrollBarAlpha = 0; - this.scrollBarAlphaFuture = 0; - this.scroll = 0; - this.draggingScrollBar = false; - this.tabsPage = 0; - this.categories = Lists.newArrayList(); - this.buttonWidgets = Lists.newArrayList(); - this.tabs = Lists.newArrayList(); - this.recipeRenderers = Lists.newArrayList(); - RecipeHelper.getInstance().getAllCategories().forEach(category -> { - if (map.containsKey(category)) { - categories.add(category); - categoryMap.put(category, map.get(category)); + public VillagerRecipeViewingScreen(Map, List> categoryMap, @Nullable Identifier category) { + super(NarratorManager.EMPTY); + this.categoryMap = categoryMap; + this.categories = Lists.newArrayList(categoryMap.keySet()); + if (category != null) { + for (int i = 0; i < categories.size(); i++) { + if (categories.get(i).getIdentifier().equals(category)) { + this.selectedCategoryIndex = i; + break; + } } - }); + } } @Override @@ -119,6 +112,16 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice resultStackToNotice = stack; } + @Override + public Identifier getCurrentCategory() { + return categories.get(selectedCategoryIndex).getIdentifier(); + } + + @Override + public void recalculateCategoryPage() { + this.tabsPage = -1; + } + @Override protected void init() { super.init(); @@ -137,6 +140,9 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice int guiWidth = MathHelper.clamp(category.getDisplayWidth(display) + 30, 0, largestWidth) + 100; int guiHeight = MathHelper.clamp(category.getDisplayHeight() + 40, 166, largestHeight); this.tabsPerPage = Math.max(5, MathHelper.floor((guiWidth - 20d) / tabSize)); + if (this.tabsPage == -1) { + this.tabsPage = selectedCategoryIndex / tabsPerPage; + } this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); List> workingStations = RecipeHelper.getInstance().getWorkingStations(category.getIdentifier()); @@ -214,24 +220,16 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice for (int i = 0; i < tabsPerPage; i++) { int j = i + tabsPage * tabsPerPage; if (categories.size() > j) { + RecipeCategory tabCategory = categories.get(j); TabWidget tab; - tabs.add(tab = new TabWidget(i, tabSize, bounds.x + bounds.width / 2 - Math.min(categories.size() - tabsPage * tabsPerPage, tabsPerPage) * tabSize / 2, bounds.y, 0, tabV) { - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (containsMouse(mouseX, mouseY)) { - MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - if (getId() + tabsPage * tabsPerPage == selectedCategoryIndex) - return false; - selectedCategoryIndex = getId() + tabsPage * tabsPerPage; - scroll = 0; - selectedRecipeIndex = 0; - VillagerRecipeViewingScreen.this.init(); - return true; - } + tabs.add(tab = TabWidget.create(i, tabSize, bounds.x + bounds.width / 2 - Math.min(categories.size() - tabsPage * tabsPerPage, tabsPerPage) * tabSize / 2, bounds.y, 0, tabV, widget -> { + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if (widget.selected) return false; - } - }); - tab.setRenderer(categories.get(j), categories.get(j).getLogo(), categories.get(j).getCategoryName(), tab.getId() + tabsPage * tabsPerPage == selectedCategoryIndex); + ClientHelperImpl.getInstance().openRecipeViewingScreen(categoryMap, tabCategory.getIdentifier(), ingredientStackToNotice, resultStackToNotice); + return true; + })); + tab.setRenderer(tabCategory, tabCategory.getLogo(), tabCategory.getCategoryName(), j == selectedCategoryIndex); } } ButtonWidget w, w2; @@ -312,7 +310,7 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice start = System.currentTimeMillis(); this.duration = duration; } else - scroll = target; + scrollAmount = target; } @Override @@ -384,7 +382,7 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice RenderSystem.pushMatrix(); ScissorsHandler.INSTANCE.scissor(new Rectangle(0, scrollListBounds.y + 1, width, scrollListBounds.height - 2)); for (ButtonWidget buttonWidget : buttonWidgets) { - buttonWidget.getBounds().y = scrollListBounds.y + 1 + yOffset - (int) scroll; + buttonWidget.getBounds().y = scrollListBounds.y + 1 + yOffset - (int) scrollAmount; if (buttonWidget.getBounds().getMaxY() > scrollListBounds.getMinY() && buttonWidget.getBounds().getMinY() < scrollListBounds.getMaxY()) { buttonWidget.render(mouseX, mouseY, delta); } @@ -403,13 +401,13 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice BufferBuilder buffer = tessellator.getBuffer(); int height = (int) (((scrollListBounds.height - 2) * (scrollListBounds.height - 2)) / this.getMaxScrollPosition()); height = MathHelper.clamp(height, 32, scrollListBounds.height - 2 - 8); - height -= Math.min((scroll < 0 ? (int) -scroll : scroll > getMaxScroll() ? (int) scroll - getMaxScroll() : 0), height * .95); + height -= Math.min((scrollAmount < 0 ? (int) -scrollAmount : scrollAmount > getMaxScroll() ? (int) scrollAmount - getMaxScroll() : 0), height * .95); height = Math.max(10, height); - int minY = (int) Math.min(Math.max((int) scroll * (scrollListBounds.height - 2 - height) / getMaxScroll() + scrollListBounds.y + 1, scrollListBounds.y + 1), scrollListBounds.getMaxY() - 1 - height); + int minY = (int) Math.min(Math.max((int) scrollAmount * (scrollListBounds.height - 2 - height) / getMaxScroll() + scrollListBounds.y + 1, scrollListBounds.y + 1), scrollListBounds.getMaxY() - 1 - height); int scrollbarPositionMinX = scrollListBounds.getMaxX() - 6, scrollbarPositionMaxX = scrollListBounds.getMaxX() - 1; boolean hovered = (new Rectangle(scrollbarPositionMinX, minY, scrollbarPositionMaxX - scrollbarPositionMinX, height)).contains(PointHelper.fromMouse()); - float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); - float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); + float bottomC = (hovered ? .67f : .5f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + float topC = (hovered ? .87f : .67f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.disableAlphaTest(); @@ -439,7 +437,7 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice private void updatePosition(float delta) { double[] target = new double[]{this.target}; - this.scroll = ClothConfigInitializer.handleScrollingPosition(target, this.scroll, this.getMaxScroll(), delta, this.start, this.duration); + this.scrollAmount = ClothConfigInitializer.handleScrollingPosition(target, this.scrollAmount, this.getMaxScroll(), delta, this.start, this.duration); this.target = target[0]; } @@ -453,7 +451,7 @@ public class VillagerRecipeViewingScreen extends Screen implements StackToNotice double double_6 = Math.max(1.0D, Math.max(1d, height) / (double) (actualHeight - int_3)); scrollBarAlphaFutureTime = System.currentTimeMillis(); scrollBarAlphaFuture = 1f; - scroll = target = MathHelper.clamp(scroll + double_4 * double_6, 0, height - scrollListBounds.height + 2); + scrollAmount = target = MathHelper.clamp(scrollAmount + double_4 * double_6, 0, height - scrollListBounds.height + 2); return true; } } diff --git a/src/main/java/me/shedaniel/rei/gui/config/entry/FilteringEntry.java b/src/main/java/me/shedaniel/rei/gui/config/entry/FilteringEntry.java index 0d3c1916b..1fbb235fc 100644 --- a/src/main/java/me/shedaniel/rei/gui/config/entry/FilteringEntry.java +++ b/src/main/java/me/shedaniel/rei/gui/config/entry/FilteringEntry.java @@ -36,6 +36,7 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.ConfigObject; import me.shedaniel.rei.api.EntryRegistry; import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.gui.OverlaySearchField; import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.QueuedTooltip; @@ -272,8 +273,8 @@ public class FilteringEntry extends AbstractConfigListEntry> { int scrollbarPositionMinX = getScrollbarMinX(); int scrollbarPositionMaxX = scrollbarPositionMinX + 6; boolean hovered = (new Rectangle(scrollbarPositionMinX, minY, scrollbarPositionMaxX - scrollbarPositionMinX, height)).contains(PointHelper.fromMouse()); - float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); - float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); + float bottomC = (hovered ? .67f : .5f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + float topC = (hovered ? .87f : .67f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); RenderSystem.disableTexture(); RenderSystem.enableBlend(); 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 b567599a6..9c7a96dd5 100644 --- a/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java @@ -29,6 +29,8 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.text.Text; import org.jetbrains.annotations.ApiStatus; +import java.util.List; + @ApiStatus.Internal public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWidget { @@ -76,14 +78,18 @@ public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWi return width - 40; } - public static class CreditsItem extends DynamicNewSmoothScrollingEntryListWidget.Entry { + public static abstract class CreditsItem extends DynamicNewSmoothScrollingEntryListWidget.Entry { + + } + + public static class TextCreditsItem extends CreditsItem { private String text; - public CreditsItem(Text textComponent) { + public TextCreditsItem(Text textComponent) { this(textComponent.asFormattedString()); } - public CreditsItem(String text) { + public TextCreditsItem(String text) { this.text = text; } @@ -103,4 +109,36 @@ public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWi } } + public static class TranslationCreditsItem extends CreditsItem { + private String language; + private List translators; + private int maxWidth; + + public TranslationCreditsItem(String language, String translators, int width, int maxWidth) { + this.language = language; + this.translators = MinecraftClient.getInstance().textRenderer.wrapStringToWidthAsList(translators, width); + this.maxWidth = maxWidth; + } + + @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(language, x + 5, y + 5, -1); + int yy = y + 5; + for (String translator : translators) { + MinecraftClient.getInstance().textRenderer.drawWithShadow(translator, x + 5 + maxWidth, yy, -1); + yy += 12; + } + } + + @Override + public int getItemHeight() { + return 12 * translators.size(); + } + + @Override + public boolean changeFocus(boolean boolean_1) { + return false; + } + } + } diff --git a/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java b/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java index 32b746922..648e9b27e 100644 --- a/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java @@ -24,7 +24,8 @@ package me.shedaniel.rei.gui.credits; import com.google.common.collect.Lists; -import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.CreditsItem; +import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.TextCreditsItem; +import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.TranslationCreditsItem; import me.shedaniel.rei.impl.ScreenHelper; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.CustomValue; @@ -33,9 +34,12 @@ import net.minecraft.client.gui.screen.ingame.ContainerScreen; import net.minecraft.client.gui.widget.AbstractPressableButtonWidget; import net.minecraft.client.resource.language.I18n; import net.minecraft.text.LiteralText; +import net.minecraft.util.Pair; import org.jetbrains.annotations.ApiStatus; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; @ApiStatus.Internal @@ -65,7 +69,8 @@ public class CreditsScreen extends Screen { protected void init() { children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32)); entryListWidget.creditsClearEntries(); - List translators = Lists.newArrayList(); + List> translators = Lists.newArrayList(); + Exception[] exception = {null}; FabricLoader.getInstance().getModContainer("roughlyenoughitems").ifPresent(rei -> { try { if (rei.getMetadata().containsCustomValue("rei:translators")) { @@ -73,24 +78,36 @@ public class CreditsScreen extends Screen { jsonObject.forEach(entry -> { CustomValue value = entry.getValue(); String behind = value.getType() == CustomValue.CvType.ARRAY ? Lists.newArrayList(value.getAsArray().iterator()).stream().map(CustomValue::getAsString).sorted(String::compareToIgnoreCase).collect(Collectors.joining(", ")) : value.getAsString(); - translators.add(String.format(" %s - %s", entry.getKey(), behind)); + translators.add(new Pair<>(entry.getKey(), behind)); }); } - translators.sort(String::compareToIgnoreCase); + translators.sort(Comparator.comparing(Pair::getLeft, String::compareToIgnoreCase)); } catch (Exception e) { - translators.clear(); - translators.add("Failed to get translators: " + e.toString()); - for (StackTraceElement traceElement : e.getStackTrace()) - translators.add(" at " + traceElement); + exception[0] = e; e.printStackTrace(); } }); - List actualTranslators = Lists.newArrayList(); + List> translatorsMapped = translators.stream().map(pair -> { + return new Pair<>( + " " + (I18n.hasTranslation("language.roughlyenoughitems." + pair.getLeft().toLowerCase(Locale.ROOT).replace(' ', '_')) ? I18n.translate("language.roughlyenoughitems." + pair.getLeft().toLowerCase(Locale.ROOT).replace(' ', '_')) : pair.getLeft()), + pair.getRight() + ); + }).collect(Collectors.toList()); int i = width - 80 - 6; - translators.forEach(s -> font.wrapStringToWidthAsList(s, i).forEach(actualTranslators::add)); - for (String line : I18n.translate("text.rei.credit.text", FabricLoader.getInstance().getModContainer("roughlyenoughitems").map(mod -> mod.getMetadata().getVersion().getFriendlyString()).orElse("Unknown"), String.join("\n", actualTranslators)).split("\n")) - entryListWidget.creditsAddEntry(new CreditsItem(new LiteralText(line))); - entryListWidget.creditsAddEntry(new CreditsItem(new LiteralText(""))); + for (String line : I18n.translate("text.rei.credit.text", FabricLoader.getInstance().getModContainer("roughlyenoughitems").map(mod -> mod.getMetadata().getVersion().getFriendlyString()).orElse("Unknown"), "%translators%").split("\n")) + if (line.equalsIgnoreCase("%translators%")) { + if (exception[0] != null) { + entryListWidget.creditsAddEntry(new TextCreditsItem(new LiteralText("Failed to get translators: " + exception[0].toString()))); + for (StackTraceElement traceElement : exception[0].getStackTrace()) + entryListWidget.creditsAddEntry(new TextCreditsItem(new LiteralText(" at " + traceElement))); + } else { + int maxWidth = translatorsMapped.stream().mapToInt(pair -> font.getStringWidth(pair.getLeft())).max().orElse(0) + 5; + for (Pair pair : translatorsMapped) { + entryListWidget.creditsAddEntry(new TranslationCreditsItem(pair.getLeft(), pair.getRight(), i - maxWidth - 10, maxWidth)); + } + } + } else entryListWidget.creditsAddEntry(new TextCreditsItem(new LiteralText(line))); + entryListWidget.creditsAddEntry(new TextCreditsItem(new LiteralText(""))); children.add(buttonDone = new AbstractPressableButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) { @Override public void onPress() { 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 ec4912a8c..06c80b5cd 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.gui.Element; import net.minecraft.client.sound.PositionedSoundInstance; @@ -116,7 +117,7 @@ public abstract class ButtonWidget extends WidgetWithBounds { } protected void renderBackground(int x, int y, int width, int height, int textureOffset) { - minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? BUTTON_LOCATION_DARK : BUTTON_LOCATION); + minecraft.getTextureManager().bindTexture(REIHelper.getInstance().isDarkThemeEnabled() ? BUTTON_LOCATION_DARK : BUTTON_LOCATION); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(770, 771, 1, 0); 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 f8c7cf386..42b0abcc5 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ClickableLabelWidget.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Point; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.impl.ScreenHelper; import org.jetbrains.annotations.ApiStatus; @@ -36,7 +37,7 @@ public abstract class ClickableLabelWidget extends LabelWidget { @ApiStatus.Internal protected ClickableLabelWidget(Point point, String text) { super(point, text); - this.hoveredColor = ScreenHelper.isDarkModeEnabled() ? -1 : 0xFF66FFCC; + this.hoveredColor = REIHelper.getInstance().isDarkThemeEnabled() ? -1 : 0xFF66FFCC; } public LabelWidget hoveredColor(int hoveredColor) { 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 436394f85..b10f94158 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -501,8 +501,8 @@ public class EntryListWidget extends WidgetWithBounds { int scrollbarPositionMinX = getScrollbarMinX(); int scrollbarPositionMaxX = scrollbarPositionMinX + 6; boolean hovered = (new Rectangle(scrollbarPositionMinX, minY, scrollbarPositionMaxX - scrollbarPositionMinX, height)).contains(PointHelper.fromMouse()); - float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); - float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); + float bottomC = (hovered ? .67f : .5f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + float topC = (hovered ? .87f : .67f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); RenderSystem.disableTexture(); RenderSystem.enableBlend(); 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 236fa1823..620b1113f 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -28,10 +28,7 @@ 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; -import me.shedaniel.rei.api.ConfigManager; -import me.shedaniel.rei.api.ConfigObject; -import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.*; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.utils.CollectionUtils; @@ -203,7 +200,7 @@ public class EntryWidget extends WidgetWithBounds { protected void drawBackground(int mouseX, int mouseY, float delta) { if (background) { - minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? RECIPE_GUI_DARK : RECIPE_GUI); + minecraft.getTextureManager().bindTexture(REIHelper.getInstance().isDarkThemeEnabled() ? RECIPE_GUI_DARK : RECIPE_GUI); blit(bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); } } @@ -235,7 +232,7 @@ public class EntryWidget extends WidgetWithBounds { protected void drawHighlighted(int mouseX, int mouseY, float delta) { RenderSystem.disableDepthTest(); RenderSystem.colorMask(true, true, true, false); - int color = ScreenHelper.isDarkModeEnabled() ? -1877929711 : -2130706433; + int color = REIHelper.getInstance().isDarkThemeEnabled() ? -1877929711 : -2130706433; setZ(300); Rectangle bounds = getInnerBounds(); fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), color, color); 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 4c1d22c68..c9557f33b 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -195,8 +195,8 @@ public class FavoritesListWidget extends WidgetWithBounds { int scrollbarPositionMinX = getScrollbarMinX(); int scrollbarPositionMaxX = scrollbarPositionMinX + 6; boolean hovered = (new Rectangle(scrollbarPositionMinX, minY, scrollbarPositionMaxX - scrollbarPositionMinX, height)).contains(PointHelper.fromMouse()); - float bottomC = (hovered ? .67f : .5f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); - float topC = (hovered ? .87f : .67f) * (ScreenHelper.isDarkModeEnabled() ? 0.8f : 1f); + float bottomC = (hovered ? .67f : .5f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + float topC = (hovered ? .87f : .67f) * (REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); RenderSystem.disableTexture(); RenderSystem.enableBlend(); @@ -372,14 +372,14 @@ public class FavoritesListWidget extends WidgetWithBounds { protected boolean reverseFavoritesAction() { return true; } - + @Override public void queueTooltip(int mouseX, int mouseY, float delta) { if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty()) { super.queueTooltip(mouseX, mouseY, delta); } } - + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (!interactable) 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 803b91fb9..f0e9a0edf 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/LabelWidget.java @@ -25,6 +25,7 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.gui.Element; import org.jetbrains.annotations.ApiStatus; @@ -48,7 +49,7 @@ public class LabelWidget extends WidgetWithBounds { public LabelWidget(Point point, String text) { this.pos = point; this.text = text; - this.defaultColor = ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : -1; + this.defaultColor = REIHelper.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : -1; } public static LabelWidget create(Point point, String text) { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java index 8b6108d56..a7d569695 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/PanelWidget.java @@ -26,9 +26,9 @@ package me.shedaniel.rei.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.api.ConfigObject; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.gui.config.RecipeBorderType; import me.shedaniel.rei.gui.config.RecipeScreenType; -import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.util.Identifier; import java.util.Collections; @@ -84,7 +84,7 @@ public class PanelWidget extends WidgetWithBounds { float green = ((color >> 8) & 0xFF) / 255f; float blue = (color & 0xFF) / 255f; RenderSystem.color4f(red, green, blue, alpha); - minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? CHEST_GUI_TEXTURE_DARK : CHEST_GUI_TEXTURE); + minecraft.getTextureManager().bindTexture(REIHelper.getInstance().isDarkThemeEnabled() ? CHEST_GUI_TEXTURE_DARK : CHEST_GUI_TEXTURE); int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height; int xTextureOffset = getXTextureOffset(); int yTextureOffset = getYTextureOffset(); @@ -114,7 +114,7 @@ public class PanelWidget extends WidgetWithBounds { } protected int getInnerColor() { - return ScreenHelper.isDarkModeEnabled() ? -13750738 : -3750202; + return REIHelper.getInstance().isDarkThemeEnabled() ? -13750738 : -3750202; } protected int getXTextureOffset() { 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 0ab440370..6d4d4f16c 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeChoosePageWidget.java @@ -27,8 +27,8 @@ 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.REIHelper; import me.shedaniel.rei.gui.RecipeViewingScreen; -import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.Window; @@ -112,10 +112,10 @@ public class RecipeChoosePageWidget extends DraggableWidget { @Override public void render(int i, int i1, float v) { - font.draw(I18n.translate("text.rei.choose_page"), bounds.x + 5, bounds.y + 5, ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : 0xFF404040); + font.draw(I18n.translate("text.rei.choose_page"), bounds.x + 5, bounds.y + 5, REIHelper.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF404040); String endString = String.format(" /%d", maxPage); int width = font.getStringWidth(endString); - font.draw(endString, bounds.x + bounds.width - 5 - width, bounds.y + 22, ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : 0xFF404040); + font.draw(endString, bounds.x + bounds.width - 5 - width, bounds.y + 22, REIHelper.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF404040); } }); String endString = String.format(" /%d", maxPage); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java index a9961e682..eda14a19f 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/SlotBaseWidget.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Rectangle; -import me.shedaniel.rei.impl.ScreenHelper; +import me.shedaniel.rei.api.REIHelper; public class SlotBaseWidget extends RecipeBaseWidget { @@ -34,7 +34,7 @@ public class SlotBaseWidget extends RecipeBaseWidget { @Override public int getInnerColor() { - return ScreenHelper.isDarkModeEnabled() ? -13619152 : -7631989; + return REIHelper.getInstance().isDarkThemeEnabled() ? -13619152 : -7631989; } @Override 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 101fcdc34..de9529937 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java @@ -26,14 +26,17 @@ package me.shedaniel.rei.gui.widget; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.impl.ScreenHelper; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; +import java.util.function.Predicate; @ApiStatus.Internal public class TabWidget extends WidgetWithBounds { @@ -48,24 +51,25 @@ public class TabWidget extends WidgetWithBounds { public Rectangle bounds; public RecipeCategory category; public int u, v; + @Nullable + private Predicate onClick; - public TabWidget(int id, Rectangle bounds) { - this(id, bounds, 0, 192); - } - - public TabWidget(int id, Rectangle bounds, int u, int v) { + private TabWidget(int id, Rectangle bounds, int u, int v, @Nullable Predicate onClick) { this.id = id; this.bounds = bounds; this.u = u; this.v = v; + this.onClick = onClick; } - public TabWidget(int id, int tabSize, int leftX, int bottomY) { - this(id, new Rectangle(leftX + id * tabSize, bottomY - tabSize, tabSize, tabSize)); + @ApiStatus.Internal + public static TabWidget create(int id, int tabSize, int leftX, int bottomY, int u, int v, @Nullable Predicate onClick) { + return new TabWidget(id, new Rectangle(leftX + id * tabSize, bottomY - tabSize, tabSize, tabSize), u, v, onClick); } - public TabWidget(int id, int tabSize, int leftX, int bottomY, int u, int v) { - this(id, new Rectangle(leftX + id * tabSize, bottomY - tabSize, tabSize, tabSize), u, v); + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + return button == 0 && containsMouse(mouseX, mouseY) && onClick.test(this); } public void setRenderer(RecipeCategory category, EntryStack logo, String categoryName, boolean selected) { @@ -101,7 +105,7 @@ public