From fab526cb228b30bf91358cca2381938bba176401 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 5 Nov 2022 01:27:03 +0800 Subject: New tab buttons --- .../rei/impl/client/config/ConfigObjectImpl.java | 2 +- .../gui/screen/AbstractDisplayViewingScreen.java | 38 ++++- .../gui/screen/CompositeDisplayViewingScreen.java | 81 +--------- .../gui/screen/DefaultDisplayViewingScreen.java | 74 +-------- .../impl/client/gui/widget/TabContainerWidget.java | 179 +++++++++++++++++++++ .../rei/impl/client/gui/widget/TabWidget.java | 41 +++-- .../rei/impl/client/search/AsyncSearchManager.java | 2 +- 7 files changed, 246 insertions(+), 171 deletions(-) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabContainerWidget.java (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index a18d7aeab..d59ece66c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -684,7 +684,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Comment("Declares how the scrollbar in composite screen should act.") private boolean compositeScrollBarPermanent = false; private boolean toastDisplayedOnCopyIdentifier = true; @Comment("Declares whether REI should use compact tabs for categories.") private boolean useCompactTabs = true; - @Comment("Declares whether REI should use compact tab buttons for categories.") private boolean useCompactTabButtons = false; + @Comment("Declares whether REI should use compact tab buttons for categories.") @ConfigEntry.Gui.Excluded private boolean useCompactTabButtons = false; } public static class Search { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index b2173b0c6..28050a6e3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -29,6 +29,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.datafixers.util.Pair; import com.mojang.math.Matrix4f; import dev.architectury.fluid.FluidStack; +import dev.architectury.utils.value.IntValue; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -50,6 +51,7 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; +import me.shedaniel.rei.impl.client.gui.widget.TabContainerWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.ChatFormatting; @@ -76,17 +78,17 @@ import java.util.stream.Stream; public abstract class AbstractDisplayViewingScreen extends Screen implements DisplayScreen { protected final Map, List> categoryMap; protected final List> categories; + protected final TabContainerWidget tabs = new TabContainerWidget(); protected List> ingredientStackToNotice = new ArrayList<>(); protected List> resultStackToNotice = new ArrayList<>(); protected int selectedCategoryIndex = 0; - protected int tabsPerPage; + protected int categoryPages = -1; protected Rectangle bounds; - protected AbstractDisplayViewingScreen(Map, List> categoryMap, @Nullable CategoryIdentifier category, int tabsPerPage) { + protected AbstractDisplayViewingScreen(Map, List> categoryMap, @Nullable CategoryIdentifier category) { super(Component.empty()); this.categoryMap = categoryMap; this.categories = Lists.newArrayList(categoryMap.keySet()); - this.tabsPerPage = tabsPerPage; if (category != null) { selectCategory(category, false); } @@ -105,12 +107,42 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis } recalculateCategoryPage(); + this.tabs.updateScroll(categories, selectedCategoryIndex, !init ? 0 : 300); if (init) { init(); } } + @Override + public void recalculateCategoryPage() { + this.categoryPages = -1; + } + + protected void initTabs() { + this.tabs.init(new Rectangle(bounds.x, bounds.y - 28, bounds.width, 28), categories, new IntValue() { + @Override + public void accept(int value) { + AbstractDisplayViewingScreen.this.categoryPages = value; + } + + @Override + public int getAsInt() { + return AbstractDisplayViewingScreen.this.categoryPages; + } + }, new IntValue() { + @Override + public void accept(int value) { + AbstractDisplayViewingScreen.this.selectCategory(categories.get(value).getCategoryIdentifier()); + } + + @Override + public int getAsInt() { + return selectedCategoryIndex; + } + }, AbstractDisplayViewingScreen.this::init); + } + @Override public List children() { List children = super.children(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java index e6c9d9348..050b91e35 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java @@ -44,16 +44,12 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; -import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -68,7 +64,6 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen private final List widgets = Lists.newArrayList(); private final List