diff options
| author | shedaniel <daniel@shedaniel.me> | 2023-10-26 15:49:00 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-04-16 00:38:18 +0900 |
| commit | 598dfc5c1f5e532a34f09c7d8d398ec727a33ab3 (patch) | |
| tree | 2f41015d23de0e2a18fce460619a9aeb40aceb36 /runtime/src/main/java/me | |
| parent | 881f8d146f15c2dfbe1292747f933d3c19cb429a (diff) | |
| download | RoughlyEnoughItems-598dfc5c1f5e532a34f09c7d8d398ec727a33ab3.tar.gz RoughlyEnoughItems-598dfc5c1f5e532a34f09c7d8d398ec727a33ab3.tar.bz2 RoughlyEnoughItems-598dfc5c1f5e532a34f09c7d8d398ec727a33ab3.zip | |
Localise more values and add a basic theme previewer
Diffstat (limited to 'runtime/src/main/java/me')
9 files changed, 184 insertions, 38 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigEntriesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigEntriesListWidget.java index 6f580d3a3..de05300eb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigEntriesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigEntriesListWidget.java @@ -38,6 +38,7 @@ public class ConfigEntriesListWidget { WidgetWithBounds list = ListWidget.builderOf(RectangleUtils.inset(bounds, 6, 6), groups, (index, entry) -> ConfigGroupWidget.create(entry, bounds.width - 12 - 6)) .gap(7) + .calculateTotalHeightDynamically(true) .build(); return ScrollableViewWidget.create(bounds, list.withPadding(0, 5), true); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigGroupWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigGroupWidget.java index 76d41e4f1..fdad7818d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigGroupWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigGroupWidget.java @@ -23,45 +23,70 @@ package me.shedaniel.rei.impl.client.gui.config.components; +import com.mojang.math.Matrix4f; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.util.MatrixUtils; import me.shedaniel.rei.impl.client.gui.config.options.CompositeOption; import me.shedaniel.rei.impl.client.gui.config.options.OptionGroup; import net.minecraft.client.gui.GuiComponent; +import org.apache.commons.lang3.tuple.Triple; +import java.util.AbstractList; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public class ConfigGroupWidget { public static WidgetWithBounds create(OptionGroup entry, int width) { - List<Widget> widgets = new ArrayList<>(); - int height = 0; + List<Triple<Widget, Supplier<Rectangle>, Matrix4f[]>> widgets = new ArrayList<>(); + int[] height = {0}; WidgetWithBounds groupTitle = Widgets.createLabel(new Point(0, 3), entry.getGroupName().copy().withStyle(style -> style.withColor(0xFFC0C0C0).withUnderlined(true))) - .leftAligned(); - groupTitle = groupTitle.withPadding(0, 0, 0, 6); - widgets.add(groupTitle); - height = Math.max(height, groupTitle.getBounds().getMaxY()); + .leftAligned() + .withPadding(0, 0, 0, 6); + widgets.add(Triple.of(groupTitle, groupTitle::getBounds, new Matrix4f[]{new Matrix4f()})); + height[0] = Math.max(height[0], groupTitle.getBounds().getMaxY()); for (CompositeOption<?> option : entry.getOptions()) { - WidgetWithBounds widget = ConfigOptionWidget.create(option, width); - widgets.add(Widgets.withTranslate(widget, 0, height, 0)); - height = Math.max(height, height + widget.getBounds().getMaxY()); + Matrix4f[] translation = new Matrix4f[]{Matrix4f.createTranslateMatrix(0, height[0], 0)}; + WidgetWithBounds widget = Widgets.withTranslate(ConfigOptionWidget.create(option, width), () -> translation[0]); + widgets.add(Triple.of(widget, () -> MatrixUtils.transform(translation[0], widget.getBounds()), translation)); + height[0] = Math.max(height[0], widget.getBounds().getMaxY()); if (entry.getOptions().get(entry.getOptions().size() - 1) != option) { - int y = height; - widgets.add(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + Matrix4f[] translationDrawable = new Matrix4f[]{Matrix4f.createTranslateMatrix(0, height[0], 0)}; + widgets.add(Triple.of(Widgets.withTranslate(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { for (int x = 0; x <= width; x += 4) { - GuiComponent.fill(matrices, x, y + 1, x + 2, y + 2, 0xFF757575); + GuiComponent.fill(matrices, x, 1, x + 2, 2, 0xFF757575); } - })); - height += 7; + }), () -> translationDrawable[0]), () -> + MatrixUtils.transform(translationDrawable[0], new Rectangle(0, 0, 1, 7)), translationDrawable)); + height[0] += 7; } } - Rectangle bounds = new Rectangle(0, 0, width, height); - return Widgets.concatWithBounds(bounds, widgets); + widgets.add(Triple.of(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + int h = 0; + for (Triple<Widget, Supplier<Rectangle>, Matrix4f[]> widget : widgets) { + widget.getRight()[0] = Matrix4f.createTranslateMatrix(0, h, 0); + h = Math.max(h, widget.getMiddle().get().getMaxY()); + } + height[0] = h; + }), Rectangle::new, new Matrix4f[]{new Matrix4f()})); + + return Widgets.concatWithBounds(() -> new Rectangle(0, 0, width, height[0]), new AbstractList<>() { + @Override + public Widget get(int index) { + return widgets.get(index).getLeft(); + } + + @Override + public int size() { + return widgets.size(); + } + }); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionValueWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionValueWidget.java index f2764dd2d..e2d62eed3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionValueWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionValueWidget.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.config.components; +import com.google.common.base.MoreObjects; import com.mojang.math.Matrix4f; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -43,6 +44,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import java.util.Map; +import java.util.Objects; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.literal; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.translatable; @@ -61,7 +63,7 @@ public class ConfigOptionValueWidget { text[0] = literal(value.toString()); } - if (value.equals(defaultOptions.get(option))) { + if (value.equals(Objects.requireNonNullElseGet(option.getDefaultValue(), () -> (T) defaultOptions.get(option)))) { text[0] = translatable("config.rei.value.default", text[0]); } @@ -84,7 +86,7 @@ public class ConfigOptionValueWidget { ((Map<CompositeOption<?>, Object>) options).put(option, selection.getOptions().get((selection.getOptions().indexOf((T) options.get(option)) + 1) % 2)); text[0] = selection.getOption((T) options.get(option)); - if (options.get(option).equals(defaultOptions.get(option))) { + if (options.get(option).equals(Objects.requireNonNullElseGet(option.getDefaultValue(), () -> (T) defaultOptions.get(option)))) { text[0] = translatable("config.rei.value.default", text[0]); } }); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionWidget.java index 9707b3ab7..2c157767e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/components/ConfigOptionWidget.java @@ -25,17 +25,25 @@ package me.shedaniel.rei.impl.client.gui.config.components; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; +import me.shedaniel.clothconfig2.api.ScissorsHandler; +import me.shedaniel.clothconfig2.api.animator.NumberAnimator; +import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Label; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.util.MatrixUtils; +import me.shedaniel.rei.impl.client.gui.config.REIConfigScreen; import me.shedaniel.rei.impl.client.gui.config.options.CompositeOption; +import me.shedaniel.rei.impl.common.util.RectangleUtils; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.FormattedCharSequence; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -43,8 +51,9 @@ import java.util.List; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.translatable; public class ConfigOptionWidget { - public static WidgetWithBounds create(CompositeOption<?> option, int width) { + public static <T> WidgetWithBounds create(CompositeOption<T> option, int width) { List<Widget> widgets = new ArrayList<>(); + int[] stableHeight = {12}; int[] height = {12}; widgets.add(Widgets.createLabel(new Point(0, 0), option.getName().copy().withStyle(style -> style.withColor(0xFFC0C0C0))) .leftAligned()); @@ -54,21 +63,28 @@ public class ConfigOptionWidget { final MutableComponent description = option.getDescription().copy().withStyle(style -> style.withColor(0xFF757575)); final List<FormattedCharSequence> split = Minecraft.getInstance().font.split(description, width); final boolean hasPreview = option.hasPreview(); - final Label preview = Widgets.createLabel(new Point(), translatable("config.rei.texts.preview")) + final Label previewLabel = Widgets.createLabel(new Point(), translatable("config.rei.texts.preview")) .color(0xFFA5F4FF) .hoveredColor(0xFFD1FAFF) .noShadow() .clickable() + .onClick($ -> clickPreview()) .rightAligned(); + @Nullable + WidgetWithBounds preview = null; + boolean previewVisible = false; + Matrix4f previewTranslation = new Matrix4f(); + final NumberAnimator<Float> previewHeight = ValueAnimator.ofFloat() + .withConvention(() -> previewVisible ? preview.getBounds().getHeight() : 0f, ValueAnimator.typicalTransitionTime()); boolean nextLinePreview = false; { - height[0] += 12 * split.size(); + stableHeight[0] += 12 * split.size(); if (hasPreview) { int lastWidth = Minecraft.getInstance().font.width(split.get(split.size() - 1)); - if (lastWidth + preview.getBounds().width + 10 > width) { + if (lastWidth + this.previewLabel.getBounds().width + 10 > width) { nextLinePreview = true; - height[0] += 12; + stableHeight[0] += 12; } } } @@ -80,26 +96,48 @@ public class ConfigOptionWidget { @Override public void render(PoseStack poses, int mouseX, int mouseY, float delta) { + this.previewHeight.update(delta); + height[0] = stableHeight[0] + Math.round(this.previewHeight.value()); + for (int i = 0; i < split.size(); i++) { Minecraft.getInstance().font.draw(poses, split.get(i), 0, 12 + 12 * i, -1); } if (hasPreview) { if (nextLinePreview) { - this.preview.setPoint(new Point(width, 12 + 12 * split.size())); + this.previewLabel.setPoint(new Point(width, 12 + 12 * split.size())); } else { - this.preview.setPoint(new Point(width, 12 + 12 * split.size() - 12)); + this.previewLabel.setPoint(new Point(width, 12 + 12 * split.size() - 12)); } - this.preview.render(poses, mouseX, mouseY, delta); + this.previewLabel.render(poses, mouseX, mouseY, delta); + + if (this.preview != null && this.previewHeight.value() > 0.1f) { + ScissorsHandler.INSTANCE.scissor(MatrixUtils.transform(poses.last().pose(), new Rectangle(0, 24 + 12 * split.size() - (nextLinePreview ? 0 : 12), width, this.previewHeight.value()))); + this.previewTranslation = Matrix4f.createTranslateMatrix(0, 12 + 12 * split.size(), 100); + this.preview.render(poses, mouseX, mouseY, delta); + ScissorsHandler.INSTANCE.removeLastScissor(); + } } } + private void clickPreview() { + if (this.preview == null) { + this.preview = option.getPreviewer().preview(width, () -> (T) ((REIConfigScreen) Minecraft.getInstance().screen).getOptions().get(option)); + this.preview = Widgets.withTranslate(this.preview, () -> this.previewTranslation); + } + + this.previewVisible = !this.previewVisible; + } + @Override public List<? extends GuiEventListener> children() { - return List.of(preview); + if (this.preview != null && this.previewHeight.value() > 0.1f) return List.of(this.previewLabel, this.preview); + return List.of(this.previewLabel); } }); - return Widgets.concatWithBounds(new Rectangle(0, 0, width, height[0]), widgets); + + height[0] = stableHeight[0]; + return Widgets.concatWithBounds(() -> new Rectangle(0, 0, width, height[0]), widgets); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigGroups.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigGroups.java index 60a78a657..87725f710 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigGroups.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigGroups.java @@ -53,7 +53,8 @@ interface AllREIConfigGroups { .add(CONFIG_BUTTON_LOCATION) .add(CRAFTABLE_FILTER); OptionGroup LAYOUT_PANEL = make("layout.panel") - .add(BOUNDARIES); + .add(BOUNDARIES) + .add(LOCATION); OptionGroup ACCESSIBILITY_DISPLAY = make("accessibility.display") .add(LARGER_TABS) .add(LARGER_ARROW_BUTTONS); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigOptions.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigOptions.java index 58827c465..f418e9edd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigOptions.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/AllREIConfigOptions.java @@ -25,11 +25,14 @@ package me.shedaniel.rei.impl.client.gui.config.options; import me.shedaniel.rei.api.client.gui.config.*; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.gui.config.REIConfigScreen; import me.shedaniel.rei.impl.client.gui.config.options.preview.ThemePreviewer; +import net.minecraft.client.Minecraft; import java.util.function.BiConsumer; import java.util.function.Function; +import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.literal; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.translatable; interface AllREIConfigOptions { @@ -47,7 +50,8 @@ interface AllREIConfigOptions { CompositeOption<Boolean> REDUCED_MOTION = make("appearance.reduced_motion", i -> i.basics.reduceMotion, (i, v) -> i.basics.reduceMotion = v) .enabledDisabled(); CompositeOption<DisplayScreenType> RECIPE_LOOKUP_STYLE = make("appearance.recipe_lookup_style", i -> i.appearance.recipeScreenType, (i, v) -> i.appearance.recipeScreenType = v) - .enumOptions(); + .options(DisplayScreenType.ORIGINAL, DisplayScreenType.COMPOSITE) + .defaultValue(() -> DisplayScreenType.ORIGINAL); CompositeOption<Boolean> APPEND_MOD_NAMES = make("appearance.append_mod_names", i -> i.advanced.tooltips.appendModNames, (i, v) -> i.advanced.tooltips.appendModNames = v) .enabledDisabled(); CompositeOption<Boolean> APPEND_FAVORITES_HINT = make("appearance.append_favorites_hint", i -> i.advanced.tooltips.displayFavoritesTooltip, (i, v) -> i.advanced.tooltips.displayFavoritesTooltip = v) @@ -63,14 +67,28 @@ interface AllREIConfigOptions { .enumOptions(); CompositeOption<String> GIVE_COMMAND = make("cheats.give_command", i -> i.advanced.commands.giveCommand, (i, v) -> i.advanced.commands.giveCommand = v); CompositeOption<SearchFieldLocation> SEARCH_FIELD_LOCATION = make("layout.search_field_location", i -> i.appearance.layout.searchFieldLocation, (i, v) -> i.appearance.layout.searchFieldLocation = v) - .enumOptions(); + .entry(OptionValueEntry.<SearchFieldLocation>enumOptions().overrideText(location -> { + if (Minecraft.getInstance().screen instanceof REIConfigScreen configScreen) { + return literal(location.toString(configScreen.getOptions().get(AllREIConfigOptions.LOCATION) == DisplayPanelLocation.RIGHT)); + } else { + return literal(location.toString(true)); + } + })); CompositeOption<ConfigButtonPosition> CONFIG_BUTTON_LOCATION = make("layout.config_button_location", i -> i.appearance.layout.configButtonLocation, (i, v) -> i.appearance.layout.configButtonLocation = v) - .enumOptions(); + .entry(OptionValueEntry.<ConfigButtonPosition>enumOptions().overrideText(location -> { + if (Minecraft.getInstance().screen instanceof REIConfigScreen configScreen) { + return literal(location.toString(configScreen.getOptions().get(AllREIConfigOptions.LOCATION) == DisplayPanelLocation.RIGHT)); + } else { + return literal(location.toString(true)); + } + })); CompositeOption<Boolean> CRAFTABLE_FILTER = make("layout.craftable_filter", i -> i.appearance.layout.showCraftableOnlyButton, (i, v) -> i.appearance.layout.showCraftableOnlyButton = v) .enabledDisabled(); // TODO: BOUNDARIES CompositeOption<Boolean> BOUNDARIES = make("layout.boundaries", i -> true, (i, v) -> { }); + CompositeOption<DisplayPanelLocation> LOCATION = make("layout.location", i -> i.advanced.accessibility.displayPanelLocation, (i, v) -> i.advanced.accessibility.displayPanelLocation = v) + .enumOptions(); CompositeOption<Boolean> LARGER_TABS = make("accessibility.larger_tabs", i -> !i.advanced.accessibility.useCompactTabs, (i, v) -> i.advanced.accessibility.useCompactTabs = !v) .enabledDisabled(); CompositeOption<Boolean> LARGER_ARROW_BUTTONS = make("accessibility.larger_arrow_buttons", i -> !i.advanced.accessibility.useCompactTabButtons, (i, v) -> i.advanced.accessibility.useCompactTabButtons = !v) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/CompositeOption.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/CompositeOption.java index 11f9126db..b0eb11a08 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/CompositeOption.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/CompositeOption.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.function.Supplier; public class CompositeOption<T> { private final Component name; @@ -37,6 +38,8 @@ public class CompositeOption<T> { private final BiConsumer<ConfigObjectImpl, T> save; @Nullable private ConfigPreviewer<T> previewer; + @Nullable + private Supplier<T> defaultValue = null; private OptionValueEntry<T> entry; public CompositeOption(Component name, Component description, Function<ConfigObjectImpl, T> bind, BiConsumer<ConfigObjectImpl, T> save) { @@ -67,11 +70,20 @@ public class CompositeOption<T> { return this.entry(OptionValueEntry.enumOptions(entry)); } + public CompositeOption<T> options(T... entry) { + return this.entry(OptionValueEntry.options(entry)); + } + public CompositeOption<T> previewer(ConfigPreviewer<T> previewer) { this.previewer = previewer; return this; } + public CompositeOption<T> defaultValue(Supplier<T> defaultValue) { + this.defaultValue = defaultValue; + return this; + } + public Component getName() { return name; } @@ -100,4 +112,10 @@ public class CompositeOption<T> { public boolean hasPreview() { return previewer != null; } + + @Nullable + public T getDefaultValue() { + if (defaultValue == null) return null; + return defaultValue.get(); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/OptionValueEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/OptionValueEntry.java index 6ec876266..303d16607 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/OptionValueEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/OptionValueEntry.java @@ -26,7 +26,9 @@ package me.shedaniel.rei.impl.client.gui.config.options; import me.shedaniel.rei.api.common.util.CollectionUtils; import net.minecraft.network.chat.Component; +import java.util.Arrays; import java.util.List; +import java.util.function.Function; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.literal; import static me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils.translatable; @@ -37,7 +39,7 @@ public interface OptionValueEntry<T> { }; } - static OptionValueEntry<Boolean> ofBoolean(Component falseText, Component trueText) { + static OptionValueEntry.Selection<Boolean> ofBoolean(Component falseText, Component trueText) { return new Selection<Boolean>() { @Override public List<Boolean> getOptions() { @@ -51,17 +53,17 @@ public interface OptionValueEntry<T> { }; } - static OptionValueEntry<Boolean> trueFalse() { + static OptionValueEntry.Selection<Boolean> trueFalse() { return ofBoolean(translatable("config.rei.value.trueFalse.false"), translatable("config.rei.value.trueFalse.true")); } - static OptionValueEntry<Boolean> enabledDisabled() { + static OptionValueEntry.Selection<Boolean> enabledDisabled() { return ofBoolean(translatable("config.rei.value.enabledDisabled.false"), translatable("config.rei.value.enabledDisabled.true")); } - static <T> OptionValueEntry<T> enumOptions(T... array) { + static <T> OptionValueEntry.Selection<T> enumOptions(T... array) { Class<T> type = (Class<T>) array.getClass().getComponentType(); Object[] constants = type.getEnumConstants(); return new Selection<T>() { @@ -77,9 +79,37 @@ public interface OptionValueEntry<T> { }; } + static <T> OptionValueEntry<T> options(T... options) { + return new Selection<T>() { + @Override + public List<T> getOptions() { + return Arrays.asList(options); + } + + @Override + public Component getOption(T value) { + return literal(value.toString()); + } + }; + } + interface Selection<T> extends OptionValueEntry<T> { List<T> getOptions(); Component getOption(T value); + + default Selection<T> overrideText(Function<T, Component> textFunction) { + return new Selection<T>() { + @Override + public List<T> getOptions() { + return Selection.this.getOptions(); + } + + @Override + public Component getOption(T value) { + return textFunction.apply(value); + } + }; + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/preview/ThemePreviewer.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/preview/ThemePreviewer.java index df5ac9be6..42fcc9cee 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/preview/ThemePreviewer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/config/options/preview/ThemePreviewer.java @@ -24,12 +24,16 @@ package me.shedaniel.rei.impl.client.gui.config.options.preview; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; +import me.shedaniel.math.Color; +import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.config.AppearanceTheme; +import me.shedaniel.rei.api.client.gui.widgets.Label; import me.shedaniel.rei.api.client.gui.widgets.Panel; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.impl.client.gui.config.options.ConfigPreviewer; +import me.shedaniel.rei.impl.client.gui.config.options.ConfigUtils; import me.shedaniel.rei.impl.client.gui.widget.basewidgets.PanelWidget; import java.util.List; @@ -40,10 +44,19 @@ public enum ThemePreviewer implements ConfigPreviewer<AppearanceTheme> { @Override public WidgetWithBounds preview(int width, Supplier<AppearanceTheme> value) { - Panel base = Widgets.createCategoryBase(new Rectangle(width * 10 / 2, 3, width * 10 / 8, 20)); + Panel base = Widgets.createCategoryBase(new Rectangle(width * 5 / 20, 3, width * 5 / 10, 50)); ((PanelWidget) base).setDarkBackgroundAlpha(ValueAnimator.ofFloat() .withConvention(() -> value.get() == AppearanceTheme.DARK ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat()); - return Widgets.concatWithBounds(new Rectangle(0, 0, width, 26), List.of(base)); + ValueAnimator<Color> labelColor = ValueAnimator.ofColor(value.get() == AppearanceTheme.LIGHT ? Color.ofTransparent(0xFF404040) : Color.ofTransparent(0xFFBBBBBB)) + .withConvention(() -> value.get() == AppearanceTheme.LIGHT ? Color.ofTransparent(0xFF404040) : Color.ofTransparent(0xFFBBBBBB), ValueAnimator.typicalTransitionTime()); + Label label = Widgets.createLabel(new Point(width / 2, 24), ConfigUtils.literal("Preview")) + .centered() + .noShadow() + .color(labelColor.value().getColor()); + return Widgets.concatWithBounds(new Rectangle(0, 0, width, 56), List.of(base, label, Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + labelColor.update(delta); + label.color(labelColor.value().getColor()); + }))); } } |
