From 26c697ea62f9b22d34063998bbd148c7c8e23478 Mon Sep 17 00:00:00 2001 From: RettichLP Date: Sun, 9 Aug 2026 00:03:33 +0200 Subject: [PATCH 1/3] Make "Auto trash can" customizable with per-item collection options and update localization strings. Co-authored-by: AI --- .../options/MiscellaneousOptions.java | 1 - .../common/configuration/options/Options.java | 7 ++ .../options/MiscellaneousOptionsScreen.java | 4 +- .../options/TrashCanOptionsScreen.java | 73 +++++++++++++++++++ .../mixin/AbstractContainerScreenMixin.java | 14 ++-- .../resources/assets/ucutils/lang/de_de.json | 2 +- .../resources/assets/ucutils/lang/en_gb.json | 2 +- .../resources/assets/ucutils/lang/en_us.json | 2 +- 8 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 src/main/java/de/rettichlp/ucutils/common/gui/screens/options/TrashCanOptionsScreen.java diff --git a/src/main/java/de/rettichlp/ucutils/common/configuration/options/MiscellaneousOptions.java b/src/main/java/de/rettichlp/ucutils/common/configuration/options/MiscellaneousOptions.java index f6fc108c..6abc14fd 100644 --- a/src/main/java/de/rettichlp/ucutils/common/configuration/options/MiscellaneousOptions.java +++ b/src/main/java/de/rettichlp/ucutils/common/configuration/options/MiscellaneousOptions.java @@ -21,7 +21,6 @@ public class MiscellaneousOptions { private boolean showHydration = true; private AtmInformationType atmInformationType = NONE; - private boolean autoCollectChestsFromTrashCans = false; private boolean highlightCorpses = false; // feature rejected by UnicaCity team private boolean hideDolphins = false; private boolean blockMalleSound = false; diff --git a/src/main/java/de/rettichlp/ucutils/common/configuration/options/Options.java b/src/main/java/de/rettichlp/ucutils/common/configuration/options/Options.java index 9202cc2c..77c4ea66 100644 --- a/src/main/java/de/rettichlp/ucutils/common/configuration/options/Options.java +++ b/src/main/java/de/rettichlp/ucutils/common/configuration/options/Options.java @@ -10,6 +10,9 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; +import java.util.Set; + import static de.rettichlp.ucutils.common.configuration.options.Options.ReinforcementType.UNICACITYADDON; import static net.minecraft.ChatFormatting.AQUA; import static net.minecraft.ChatFormatting.BLUE; @@ -18,6 +21,9 @@ import static net.minecraft.client.gui.components.Tooltip.create; import static net.minecraft.network.chat.Component.empty; import static net.minecraft.network.chat.Component.literal; +import static net.minecraft.world.item.Items.CHEST; +import static net.minecraft.world.item.Items.ENDER_CHEST; +import static net.minecraft.world.item.Items.TRAPPED_CHEST; @Getter @Setter @@ -33,6 +39,7 @@ public class Options { private boolean checkUnicacityServer = true; private ReinforcementType reinforcementType = UNICACITYADDON; + private Set autoCollectFromTrashCan = new HashSet<>(Set.of(CHEST.toString(), TRAPPED_CHEST.toString(), ENDER_CHEST.toString())); @Getter @AllArgsConstructor diff --git a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java index 3c95135a..204c0c7d 100644 --- a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java +++ b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java @@ -3,12 +3,14 @@ import de.rettichlp.ucutils.common.configuration.options.MiscellaneousOptions; import de.rettichlp.ucutils.common.gui.screens.OptionsScreen; import de.rettichlp.ucutils.common.gui.screens.components.ToggleButtonWidget; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import static de.rettichlp.ucutils.UCUtils.commandService; import static de.rettichlp.ucutils.UCUtils.renderService; +import static net.minecraft.client.gui.components.Tooltip.create; import static net.minecraft.client.gui.layouts.LinearLayout.horizontal; import static net.minecraft.client.gui.layouts.LinearLayout.vertical; import static net.minecraft.network.chat.CommonComponents.NEW_LINE; @@ -43,7 +45,7 @@ public void initBody() { renderService.addCyclingButton(directionalLayoutWidget1, BANK_INFORMATION_NAME, MiscellaneousOptions.AtmInformationType.values(), MiscellaneousOptions.AtmInformationType::getDisplayName, (options, value) -> options.miscellaneous().atmInformationType(value), options -> options.miscellaneous().atmInformationType(), 150); LinearLayout directionalLayoutWidget2 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget2, AUTO_TRASH_CAN_NAME, AUTO_TRASH_CAN_TOOLTIP, (options, value) -> options.miscellaneous().autoCollectChestsFromTrashCans(value), options -> options.miscellaneous().autoCollectChestsFromTrashCans(), 150); + directionalLayoutWidget2.addChild(Button.builder(AUTO_TRASH_CAN_NAME, _ -> this.minecraft.gui.setScreen(new TrashCanOptionsScreen(this))).tooltip(create(AUTO_TRASH_CAN_TOOLTIP)).width(150).build()); ToggleButtonWidget toggleButtonWidget = renderService.addToggleButton(directionalLayoutWidget2, HIGHLIGHT_CORPSES_NAME, HIGHLIGHT_CORPSES_TOOLTIP, (options, value) -> options.miscellaneous().highlightCorpses(value), options -> options.miscellaneous().highlightCorpses(), 150); toggleButtonWidget.active = commandService.isSuperUser(); diff --git a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/TrashCanOptionsScreen.java b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/TrashCanOptionsScreen.java new file mode 100644 index 00000000..d1c9c2c9 --- /dev/null +++ b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/TrashCanOptionsScreen.java @@ -0,0 +1,73 @@ +package de.rettichlp.ucutils.common.gui.screens.options; + +import de.rettichlp.ucutils.common.gui.screens.OptionsScreen; +import de.rettichlp.ucutils.common.gui.screens.components.ToggleButtonWidget; +import net.minecraft.client.gui.layouts.GridLayout; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.jspecify.annotations.NonNull; + +import java.util.Collection; +import java.util.Set; +import java.util.function.Consumer; + +import static de.rettichlp.ucutils.UCUtils.configuration; +import static net.minecraft.network.chat.Component.translatable; +import static net.minecraft.world.item.Items.APPLE; +import static net.minecraft.world.item.Items.CARROT; +import static net.minecraft.world.item.Items.CHEST; +import static net.minecraft.world.item.Items.ENDER_CHEST; +import static net.minecraft.world.item.Items.PAPER; +import static net.minecraft.world.item.Items.POTATO; +import static net.minecraft.world.item.Items.ROTTEN_FLESH; +import static net.minecraft.world.item.Items.TRAPPED_CHEST; + +public class TrashCanOptionsScreen extends OptionsScreen { + + public static final Component TEXT_TRASH_CAN = translatable("ucutils.options.auto_trash_can.name"); + + private static final Set CHEST_ITEMS = Set.of(CHEST.toString(), TRAPPED_CHEST.toString(), ENDER_CHEST.toString()); + + public TrashCanOptionsScreen(Screen parent) { + super(parent, TEXT_TRASH_CAN); + } + + @Override + public void initBody() { + GridLayout gridLayout = this.layout.addToContents(new GridLayout()); + gridLayout.columnSpacing(8).rowSpacing(4); + GridLayout.RowHelper gridLayoutRowHelper = gridLayout.createRowHelper(2); + + Set autoCollectFromTrashCan = configuration.getOptions().autoCollectFromTrashCan(); + + addToggleButton(gridLayoutRowHelper, translatable("block.minecraft.chest"), autoCollectFromTrashCan.containsAll(CHEST_ITEMS), value -> { + if (value) { + autoCollectFromTrashCan.addAll(CHEST_ITEMS); + } else { + autoCollectFromTrashCan.removeAll(CHEST_ITEMS); + } + }); + addToggleButton(gridLayoutRowHelper, translatable("item.minecraft.apple"), autoCollectFromTrashCan.contains(APPLE.toString()), value -> setItemState(autoCollectFromTrashCan, APPLE.toString(), value)); + addToggleButton(gridLayoutRowHelper, translatable("item.minecraft.carrot"), autoCollectFromTrashCan.contains(CARROT.toString()), value -> setItemState(autoCollectFromTrashCan, CARROT.toString(), value)); + addToggleButton(gridLayoutRowHelper, translatable("item.minecraft.paper"), autoCollectFromTrashCan.contains(PAPER.toString()), value -> setItemState(autoCollectFromTrashCan, PAPER.toString(), value)); + addToggleButton(gridLayoutRowHelper, translatable("item.minecraft.potato"), autoCollectFromTrashCan.contains(POTATO.toString()), value -> setItemState(autoCollectFromTrashCan, POTATO.toString(), value)); + addToggleButton(gridLayoutRowHelper, translatable("item.minecraft.rotten_flesh"), autoCollectFromTrashCan.contains(ROTTEN_FLESH.toString()), value -> setItemState(autoCollectFromTrashCan, ROTTEN_FLESH.toString(), value)); + + gridLayout.arrangeElements(); + gridLayout.visitWidgets(this::addRenderableWidget); + } + + private void addToggleButton(GridLayout.@NonNull RowHelper gridLayoutRowHelper, Component name, boolean currentValue, Consumer setter) { + ToggleButtonWidget toggleButton = new ToggleButtonWidget(name, setter, currentValue); + toggleButton.setWidth(150); + gridLayoutRowHelper.addChild(toggleButton); + } + + private void setItemState(Collection autoCollectFromTrashCan, String item, boolean value) { + if (value) { + autoCollectFromTrashCan.add(item); + } else { + autoCollectFromTrashCan.remove(item); + } + } +} diff --git a/src/main/java/de/rettichlp/ucutils/mixin/AbstractContainerScreenMixin.java b/src/main/java/de/rettichlp/ucutils/mixin/AbstractContainerScreenMixin.java index d474d603..804fe652 100644 --- a/src/main/java/de/rettichlp/ucutils/mixin/AbstractContainerScreenMixin.java +++ b/src/main/java/de/rettichlp/ucutils/mixin/AbstractContainerScreenMixin.java @@ -29,6 +29,7 @@ import java.awt.Color; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.regex.Matcher; import java.util.stream.Stream; @@ -55,7 +56,6 @@ import static net.minecraft.network.chat.Component.literal; import static net.minecraft.network.chat.Component.translatable; import static net.minecraft.world.inventory.ContainerInput.PICKUP; -import static net.minecraft.world.item.Items.CHEST; import static net.minecraft.world.item.Items.PLAYER_HEAD; @Mixin(AbstractContainerScreen.class) @@ -108,11 +108,13 @@ protected AbstractContainerScreenMixin(Component title) { } } case "Mülleimer" -> { - if (configuration.getOptions().miscellaneous().autoCollectChestsFromTrashCans()) { - for (int i = 0; i < 5; i++) { - if (getMenu().slots.get(i).getItem().is(CHEST)) { - gameMode.handleContainerInput(getMenu().containerId, i, 0, PICKUP, player); - } + Set autoCollectFromTrashCan = configuration.getOptions().autoCollectFromTrashCan(); + + for (int i = 0; i < 5; i++) { + ItemStack itemStack = getMenu().slots.get(i).getItem(); + boolean shouldCollect = autoCollectFromTrashCan.contains(itemStack.getItem().toString()); + if (shouldCollect) { + gameMode.handleContainerInput(getMenu().containerId, i, 0, PICKUP, player); } } } diff --git a/src/main/resources/assets/ucutils/lang/de_de.json b/src/main/resources/assets/ucutils/lang/de_de.json index d334ffe4c..3e84cf0a 100644 --- a/src/main/resources/assets/ucutils/lang/de_de.json +++ b/src/main/resources/assets/ucutils/lang/de_de.json @@ -91,7 +91,7 @@ "ucutils.options.hydration.name": "Durstanzeige", "ucutils.options.hydration.tooltip": "Zeigt deinen Durst über der Hungeranzeige an", "ucutils.options.auto_trash_can.name": "Automatischer Mülleimer", - "ucutils.options.auto_trash_can.tooltip": "Sammelt automatisch Kisten aus Mülleimern", + "ucutils.options.auto_trash_can.tooltip": "Sammelt automatisch Gegenstände aus Mülleimern", "ucutils.options.highlight_corpses.name": "Leichen hervorheben", "ucutils.options.highlight_corpses.tooltip": "Lässt Leichen in der Farbe ihrer Fraktion leuchten", "ucutils.options.hide_dolphins.name": "Verstecke Delfine", diff --git a/src/main/resources/assets/ucutils/lang/en_gb.json b/src/main/resources/assets/ucutils/lang/en_gb.json index 21b5aea8..25a9e8a6 100644 --- a/src/main/resources/assets/ucutils/lang/en_gb.json +++ b/src/main/resources/assets/ucutils/lang/en_gb.json @@ -91,7 +91,7 @@ "ucutils.options.hydration.name": "Hydration display", "ucutils.options.hydration.tooltip": "Displays your hydration above your hunger bar", "ucutils.options.auto_trash_can.name": "Auto trash can", - "ucutils.options.auto_trash_can.tooltip": "Automatically collects chests from trash cans", + "ucutils.options.auto_trash_can.tooltip": "Automatically collects items from trash cans", "ucutils.options.highlight_corpses.name": "Highlight corpses", "ucutils.options.highlight_corpses.tooltip": "Makes corpses glow in their faction's colour", "ucutils.options.hide_dolphins.name": "Hide dolphins", diff --git a/src/main/resources/assets/ucutils/lang/en_us.json b/src/main/resources/assets/ucutils/lang/en_us.json index 0ac5eaa8..15c13421 100644 --- a/src/main/resources/assets/ucutils/lang/en_us.json +++ b/src/main/resources/assets/ucutils/lang/en_us.json @@ -91,7 +91,7 @@ "ucutils.options.hydration.name": "Hydration display", "ucutils.options.hydration.tooltip": "Displays your hydration above your hunger bar", "ucutils.options.auto_trash_can.name": "Auto trash can", - "ucutils.options.auto_trash_can.tooltip": "Automatically collects chests from trash cans", + "ucutils.options.auto_trash_can.tooltip": "Automatically collects items from trash cans", "ucutils.options.highlight_corpses.name": "Highlight corpses", "ucutils.options.highlight_corpses.tooltip": "Makes corpses glow in their faction's color", "ucutils.options.hide_dolphins.name": "Hide dolphins", From 0707239a37dbaa27367ed01c000915a45fa8de7a Mon Sep 17 00:00:00 2001 From: RettichLP Date: Sun, 9 Aug 2026 00:04:21 +0200 Subject: [PATCH 2/3] Clarify automated trashcan item collection description in README Co-authored-by: AI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e78a0801..36f46526 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ und [The Rettington Companion](https://modrinth.com/mod/the-rettington-companion der so viel Geld einzahlt, bis der Bankautomat voll ist - Mit dem `/aktien` Befehl wird die Aktien-App auf dem Händy direkt geöffnet, sodass man nicht mehr manuell durch das Handy navigieren muss -- Kisten werden automatisch aus Mülleimern eingesammelt +- Gegenstände werden automatisch aus Mülleimern eingesammelt - Es werden bestimmte Nachrichten im Chat ausgeblendet (konfigurierbar über [The Rettington Companion](https://modrinth.com/mod/the-rettington-companion)) - Sollte ein Spieler abwesend sein, wird bei `/id` angezeigt wie lang dieser schon abwesend ist From d3be9c70c251fdd65911a23391f9f57c8b39fc2c Mon Sep 17 00:00:00 2001 From: RettichLP Date: Sun, 9 Aug 2026 01:06:00 +0200 Subject: [PATCH 3/3] Refactor options screens to use GridLayout for improved layout structure and readability Co-authored-by: AI --- .../options/MiscellaneousOptionsScreen.java | 58 +++++++++++---- .../screens/options/SoundOptionsScreen.java | 73 ++++++++++++++----- 2 files changed, 97 insertions(+), 34 deletions(-) diff --git a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java index 204c0c7d..c2042da8 100644 --- a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java +++ b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/MiscellaneousOptionsScreen.java @@ -2,17 +2,17 @@ import de.rettichlp.ucutils.common.configuration.options.MiscellaneousOptions; import de.rettichlp.ucutils.common.gui.screens.OptionsScreen; +import de.rettichlp.ucutils.common.gui.screens.components.CyclingButtonEntry; import de.rettichlp.ucutils.common.gui.screens.components.ToggleButtonWidget; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.layouts.LinearLayout; +import net.minecraft.client.gui.components.CycleButton; +import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import static de.rettichlp.ucutils.UCUtils.commandService; -import static de.rettichlp.ucutils.UCUtils.renderService; +import static de.rettichlp.ucutils.UCUtils.configuration; import static net.minecraft.client.gui.components.Tooltip.create; -import static net.minecraft.client.gui.layouts.LinearLayout.horizontal; -import static net.minecraft.client.gui.layouts.LinearLayout.vertical; import static net.minecraft.network.chat.CommonComponents.NEW_LINE; import static net.minecraft.network.chat.Component.translatable; import static net.minecraft.util.CommonColors.RED; @@ -38,21 +38,47 @@ public MiscellaneousOptionsScreen(Screen parent) { @Override public void initBody() { - LinearLayout directionalLayoutWidget = this.layout.addToContents(vertical().spacing(4)); + GridLayout gridLayout = this.layout.addToContents(new GridLayout()); + gridLayout.columnSpacing(8).rowSpacing(4); + GridLayout.RowHelper gridLayoutRowHelper = gridLayout.createRowHelper(2); - LinearLayout directionalLayoutWidget1 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget1, HYDRATION_NAME, HYDRATION_TOOLTIP, (options, value) -> options.miscellaneous().showHydration(value), options -> options.miscellaneous().showHydration(), 150); - renderService.addCyclingButton(directionalLayoutWidget1, BANK_INFORMATION_NAME, MiscellaneousOptions.AtmInformationType.values(), MiscellaneousOptions.AtmInformationType::getDisplayName, (options, value) -> options.miscellaneous().atmInformationType(value), options -> options.miscellaneous().atmInformationType(), 150); + MiscellaneousOptions miscellaneousOptions = configuration.getOptions().miscellaneous(); - LinearLayout directionalLayoutWidget2 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - directionalLayoutWidget2.addChild(Button.builder(AUTO_TRASH_CAN_NAME, _ -> this.minecraft.gui.setScreen(new TrashCanOptionsScreen(this))).tooltip(create(AUTO_TRASH_CAN_TOOLTIP)).width(150).build()); - ToggleButtonWidget toggleButtonWidget = renderService.addToggleButton(directionalLayoutWidget2, HIGHLIGHT_CORPSES_NAME, HIGHLIGHT_CORPSES_TOOLTIP, (options, value) -> options.miscellaneous().highlightCorpses(value), options -> options.miscellaneous().highlightCorpses(), 150); - toggleButtonWidget.active = commandService.isSuperUser(); + ToggleButtonWidget toggleButton1 = new ToggleButtonWidget(HYDRATION_NAME, miscellaneousOptions::showHydration, miscellaneousOptions.showHydration()); + toggleButton1.setWidth(150); + toggleButton1.setTooltip(create(HYDRATION_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton1); - LinearLayout directionalLayoutWidget3 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget3, HIDE_DOLPHINS_NAME, HIDE_DOLPHINS_TOOLTIP, (options, value) -> options.miscellaneous().hideDolphins(value), options -> options.miscellaneous().hideDolphins(), 150); - renderService.addToggleButton(directionalLayoutWidget3, BLOCK_MALLE_SOUND_NAME, BLOCK_MALLE_SOUND_TOOLTIP, (options, value) -> options.miscellaneous().blockMalleSound(value), options -> options.miscellaneous().blockMalleSound(), 150); + CycleButton cycleButton1 = CycleButton.builder(MiscellaneousOptions.AtmInformationType::getDisplayName, miscellaneousOptions.atmInformationType()) + .withValues(MiscellaneousOptions.AtmInformationType.values()) + .withTooltip(CyclingButtonEntry::getTooltip) + .create(BANK_INFORMATION_NAME, (_, value) -> miscellaneousOptions.atmInformationType(value)); + cycleButton1.setWidth(150); + gridLayoutRowHelper.addChild(cycleButton1); - directionalLayoutWidget.visitWidgets(this::addRenderableWidget); + Button button1 = Button.builder(AUTO_TRASH_CAN_NAME, _ -> this.minecraft.gui.setScreen(new TrashCanOptionsScreen(this))) + .tooltip(create(AUTO_TRASH_CAN_TOOLTIP)) + .width(150) + .build(); + gridLayoutRowHelper.addChild(button1); + + ToggleButtonWidget toggleButton2 = new ToggleButtonWidget(HIGHLIGHT_CORPSES_NAME, miscellaneousOptions::highlightCorpses, miscellaneousOptions.highlightCorpses()); + toggleButton2.setWidth(150); + toggleButton2.setTooltip(create(HIGHLIGHT_CORPSES_TOOLTIP)); + toggleButton2.active = commandService.isSuperUser(); + gridLayoutRowHelper.addChild(toggleButton2); + + ToggleButtonWidget toggleButton3 = new ToggleButtonWidget(HIDE_DOLPHINS_NAME, miscellaneousOptions::hideDolphins, miscellaneousOptions.hideDolphins()); + toggleButton3.setWidth(150); + toggleButton3.setTooltip(create(HIDE_DOLPHINS_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton3); + + ToggleButtonWidget toggleButton4 = new ToggleButtonWidget(BLOCK_MALLE_SOUND_NAME, miscellaneousOptions::blockMalleSound, miscellaneousOptions.blockMalleSound()); + toggleButton4.setWidth(150); + toggleButton4.setTooltip(create(BLOCK_MALLE_SOUND_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton4); + + gridLayout.arrangeElements(); + gridLayout.visitWidgets(this::addRenderableWidget); } } diff --git a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/SoundOptionsScreen.java b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/SoundOptionsScreen.java index e508e52a..052ae3a8 100644 --- a/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/SoundOptionsScreen.java +++ b/src/main/java/de/rettichlp/ucutils/common/gui/screens/options/SoundOptionsScreen.java @@ -2,13 +2,15 @@ import de.rettichlp.ucutils.common.configuration.options.SoundOptions; import de.rettichlp.ucutils.common.gui.screens.OptionsScreen; -import net.minecraft.client.gui.layouts.LinearLayout; +import de.rettichlp.ucutils.common.gui.screens.components.CyclingButtonEntry; +import de.rettichlp.ucutils.common.gui.screens.components.ToggleButtonWidget; +import net.minecraft.client.gui.components.CycleButton; +import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import static de.rettichlp.ucutils.UCUtils.renderService; -import static net.minecraft.client.gui.layouts.LinearLayout.horizontal; -import static net.minecraft.client.gui.layouts.LinearLayout.vertical; +import static de.rettichlp.ucutils.UCUtils.configuration; +import static net.minecraft.client.gui.components.Tooltip.create; import static net.minecraft.network.chat.Component.translatable; public class SoundOptionsScreen extends OptionsScreen { @@ -34,24 +36,59 @@ public SoundOptionsScreen(Screen parent) { @Override public void initBody() { - LinearLayout directionalLayoutWidget = this.layout.addToContents(vertical().spacing(4)); + GridLayout gridLayout = this.layout.addToContents(new GridLayout()); + gridLayout.columnSpacing(8).rowSpacing(4); + GridLayout.RowHelper gridLayoutRowHelper = gridLayout.createRowHelper(2); - LinearLayout directionalLayoutWidget1 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addCyclingButton(directionalLayoutWidget1, SOUND_BANK_ROBBERY_NAME, SoundOptions.StateSelect.values(), SoundOptions.StateSelect::getDisplayName, (options, e) -> options.sound().bankRobbery(e), options -> options.sound().bankRobbery(), 150); - renderService.addCyclingButton(directionalLayoutWidget1, SOUND_BOMB_NAME, SoundOptions.StateSelect.values(), SoundOptions.StateSelect::getDisplayName, (options, e) -> options.sound().bomb(e), options -> options.sound().bomb(), 150); + SoundOptions soundOptions = configuration.getOptions().sound(); - LinearLayout directionalLayoutWidget2 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget2, SOUND_CONTRACT_SET_NAME, SOUND_CONTRACT_SET_TOOLTIP, (options, value) -> options.sound().contractSet(value), options -> options.sound().contractSet(), 150); - renderService.addToggleButton(directionalLayoutWidget2, SOUND_CONTRACT_FULFILLED_NAME, SOUND_CONTRACT_FULFILLED_TOOLTIP, (options, value) -> options.sound().contractFulfilled(value), options -> options.sound().contractFulfilled(), 150); + CycleButton cycleButton1 = CycleButton.builder(SoundOptions.StateSelect::getDisplayName, soundOptions.bankRobbery()) + .withValues(SoundOptions.StateSelect.values()) + .withTooltip(CyclingButtonEntry::getTooltip) + .create(SOUND_BANK_ROBBERY_NAME, (_, value) -> soundOptions.bankRobbery(value)); + cycleButton1.setWidth(150); + gridLayoutRowHelper.addChild(cycleButton1); - LinearLayout directionalLayoutWidget3 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget3, SOUND_SERVICE_NAME, SOUND_SERVICE_TOOLTIP, (options, value) -> options.sound().service(value), options -> options.sound().service(), 150); - renderService.addCyclingButton(directionalLayoutWidget3, SOUND_FIRE_NAME, SoundOptions.MedicSelect.values(), SoundOptions.MedicSelect::getDisplayName, (options, e) -> options.sound().fire(e), options -> options.sound().fire(), 150); + CycleButton cycleButton2 = CycleButton.builder(SoundOptions.StateSelect::getDisplayName, soundOptions.bomb()) + .withValues(SoundOptions.StateSelect.values()) + .withTooltip(CyclingButtonEntry::getTooltip) + .create(SOUND_BOMB_NAME, (_, value) -> soundOptions.bomb(value)); + cycleButton2.setWidth(150); + gridLayoutRowHelper.addChild(cycleButton2); - LinearLayout directionalLayoutWidget4 = directionalLayoutWidget.addChild(horizontal().spacing(8)); - renderService.addToggleButton(directionalLayoutWidget4, SOUND_REPORT_NAME, SOUND_REPORT_TOOLTIP, (options, value) -> options.sound().report(value), options -> options.sound().report(), 150); - renderService.addToggleButton(directionalLayoutWidget4, SOUND_NOTIFICATION_NAME, SOUND_NOTIFICATION_TOOLTIP, (options, value) -> options.sound().notification(value), options -> options.sound().notification(), 150); + ToggleButtonWidget toggleButton1 = new ToggleButtonWidget(SOUND_CONTRACT_SET_NAME, soundOptions::contractSet, soundOptions.contractSet()); + toggleButton1.setWidth(150); + toggleButton1.setTooltip(create(SOUND_CONTRACT_SET_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton1); - directionalLayoutWidget.visitWidgets(this::addRenderableWidget); + ToggleButtonWidget toggleButton2 = new ToggleButtonWidget(SOUND_CONTRACT_FULFILLED_NAME, soundOptions::contractFulfilled, soundOptions.contractFulfilled()); + toggleButton2.setWidth(150); + toggleButton2.setTooltip(create(SOUND_CONTRACT_FULFILLED_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton2); + + ToggleButtonWidget toggleButton3 = new ToggleButtonWidget(SOUND_SERVICE_NAME, soundOptions::service, soundOptions.service()); + toggleButton3.setWidth(150); + toggleButton3.setTooltip(create(SOUND_SERVICE_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton3); + + CycleButton cycleButton3 = CycleButton.builder(SoundOptions.MedicSelect::getDisplayName, soundOptions.fire()) + .withValues(SoundOptions.MedicSelect.values()) + .withTooltip(CyclingButtonEntry::getTooltip) + .create(SOUND_FIRE_NAME, (_, value) -> soundOptions.fire(value)); + cycleButton3.setWidth(150); + gridLayoutRowHelper.addChild(cycleButton3); + + ToggleButtonWidget toggleButton4 = new ToggleButtonWidget(SOUND_REPORT_NAME, soundOptions::report, soundOptions.report()); + toggleButton4.setWidth(150); + toggleButton4.setTooltip(create(SOUND_REPORT_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton4); + + ToggleButtonWidget toggleButton5 = new ToggleButtonWidget(SOUND_NOTIFICATION_NAME, soundOptions::notification, soundOptions.notification()); + toggleButton5.setWidth(150); + toggleButton5.setTooltip(create(SOUND_NOTIFICATION_TOOLTIP)); + gridLayoutRowHelper.addChild(toggleButton5); + + gridLayout.arrangeElements(); + gridLayout.visitWidgets(this::addRenderableWidget); } }