From 589059fd448ce5c84588a2bbde112c8fa6b495ae Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Fri, 3 Feb 2023 20:00:08 +0100 Subject: [PATCH] Better text drawing in radial menu using tooltips. Hold shift for description. Fixed keybind text. --- .../gui/buildmode/RadialMenu.java | 88 ++++--------- .../gui/buildmodifier/MirrorEntry.java | 12 +- .../gui/buildmodifier/RadialMirrorEntry.java | 118 +++++++++--------- .../assets/effortlessbuilding/lang/en_us.json | 8 +- 4 files changed, 94 insertions(+), 132 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java index 960bf98..27b71c3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java @@ -15,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; @@ -22,6 +23,10 @@ import nl.requios.effortlessbuilding.ClientEvents; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.ModeOptions; +import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription; +import nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import org.apache.commons.lang3.text.WordUtils; import org.lwjgl.opengl.GL11; @@ -39,8 +44,6 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions.OptionEnum; * https://github.com/AlgorithmX2/Chisels-and-Bits/blob/1.12/src/main/java/mod/chiselsandbits/client/gui/ChiselsAndBitsMenu.java */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class RadialMenu extends Screen { public static final RadialMenu instance = new RadialMenu(); @@ -181,7 +184,7 @@ public class RadialMenu extends Screen { drawIcons(ms, middleX, middleY, modes, buttons); - drawTexts(ms, currentBuildMode, middleX, middleY, modes, buttons, options); + drawTexts(ms, currentBuildMode, middleX, middleY, modes, buttons, options, mouseXX, mouseYY); ms.popPose(); } @@ -311,7 +314,7 @@ public class RadialMenu extends Screen { ms.popPose(); } - private void drawTexts(PoseStack ms, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList modes, ArrayList buttons, OptionEnum[] options) { + private void drawTexts(PoseStack ms, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList modes, ArrayList buttons, OptionEnum[] options, int mouseX, int mouseY) { //font.drawStringWithShadow("Actions", (int) (middleX - buttonDistance - 13) - font.getStringWidth("Actions") * 0.5f, (int) middleY - 38, 0xffffffff); //Draw option strings @@ -352,60 +355,25 @@ public class RadialMenu extends Screen { for (final MenuButton button : buttons) { if (button.highlighted) { - String text = ChatFormatting.AQUA + button.name; - String description = ChatFormatting.WHITE + button.description; - - //Add keybind in brackets - String keybind = findKeybind(button, currentBuildMode); - boolean hasKeybind = !keybind.isEmpty(); - keybind = ChatFormatting.GRAY + "(" + WordUtils.capitalizeFully(keybind) + ")"; - - if (button.textSide == Direction.WEST) { - - font.draw(ms, text, (int) (middleX + button.x1 - 8) - font.width(text), - (int) (middleY + button.y1 + 6), whiteTextColor); - - } else if (button.textSide == Direction.EAST) { - - font.draw(ms, text, (int) (middleX + button.x2 + 8), - (int) (middleY + button.y1 + 6), whiteTextColor); - - } else if (button.textSide == Direction.UP || button.textSide == Direction.NORTH) { - - int y = (int) (middleY + button.y1 - 14); - font.draw(ms, text, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(text) * 0.5), y, whiteTextColor); - - y -= 12; - if (hasKeybind) { - font.draw(ms, keybind, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(keybind) * 0.5), y, whiteTextColor); - y -= 12; - } - - if (!description.isEmpty()) - font.drawWordWrap(FormattedText.of(description), (int) (middleX + (button.x1 + button.x2) * 0.5 - actionDescriptionWidth * 0.5), y, actionDescriptionWidth, whiteTextColor); - - } else if (button.textSide == Direction.DOWN || button.textSide == Direction.SOUTH) { - - int y = (int) (middleY + button.y1 + 26); - font.draw(ms, text, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(text) * 0.5), y, whiteTextColor); - - y += 12; - if (hasKeybind) { - font.draw(ms, keybind, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(keybind) * 0.5), y, whiteTextColor); - y += 12; - } - - if (!description.isEmpty()) - font.drawWordWrap(FormattedText.of(description), (int) (middleX + (button.x1 + button.x2) * 0.5 - actionDescriptionWidth * 0.5), y, actionDescriptionWidth, whiteTextColor); + var tooltip = new ArrayList(); + tooltip.add(Components.literal(button.name).withStyle(ChatFormatting.AQUA)); + //Add description when holding shift + if (!button.description.isEmpty()) { + tooltip.add(TooltipHelper.holdShift(ItemDescription.Palette.Blue, hasShiftDown())); + if (hasShiftDown()) tooltip.add(Component.literal(button.description).withStyle(ChatFormatting.GRAY)); } + //Add keybind in brackets + var keybind = findKeybind(button); + if (keybind != null) tooltip.add(Lang.translateDirect("tooltip.keybind", keybind.withStyle(ChatFormatting.GRAY)).withStyle(ChatFormatting.DARK_GRAY)); + renderComponentTooltip(ms, tooltip, mouseX, mouseY); } } } - private String findKeybind(MenuButton button, BuildModeEnum currentBuildMode){ - String result = ""; + private MutableComponent findKeybind(MenuButton button){ + int keybindingIndex = -1; if (button.action == ActionEnum.OPEN_MODIFIER_SETTINGS) keybindingIndex = 1; if (button.action == ActionEnum.UNDO) keybindingIndex = 2; @@ -414,23 +382,9 @@ public class RadialMenu extends Screen { if (keybindingIndex != -1) { KeyMapping keyMap = ClientEvents.keyBindings[keybindingIndex]; - if (!keyMap.getKeyModifier().name().equals("None")) { - result = keyMap.getKeyModifier().name() + " "; - } - result += I18n.get(keyMap.getKey().getName()); + return Components.keybind(keyMap.getName()); } - - if (currentBuildMode.options.length > 0) { - //Add (ctrl) to first two actions of first option - if (button.action == currentBuildMode.options[0].actions[0] - || button.action == currentBuildMode.options[0].actions[1]) { - result = I18n.get(ClientEvents.keyBindings[4].getKey().getDisplayName().getString()); - if (result.equals("Left Control")) result = "Ctrl"; - } - } - - result = result.replace("Key.keyboard.", ""); - return result; + return null; } private boolean inTriangle(final double x1, final double y1, final double x2, final double y2, diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java index 4cf6c69..726c819 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java @@ -102,7 +102,9 @@ public class MirrorEntry extends BaseModifierEntry { //Radius radiusInput = new LabeledScrollInput(0, 0, 27, 18) .withRange(0, ReachHelper.getMaxMirrorRadius(Minecraft.getInstance().player)) - .titled(Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) + .titled(Minecraft.getInstance().player.isCreative() ? + Component.literal("Radius") : + Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) .calling(value -> { modifier.radius = value; onValueChanged(); @@ -212,21 +214,21 @@ public class MirrorEntry extends BaseModifierEntry { //Show lines button if (modifier.drawLines) { showLinesButton.setIcon(AllIcons.I_SHOW_LINES); - showLinesButton.setToolTip(Components.literal("Showing mirror lines")); + showLinesButton.setToolTip(Components.literal("Show mirror lines")); } else { showLinesButton.setIcon(AllIcons.I_HIDE_LINES); - showLinesButton.setToolTip(Components.literal("Not showing mirror lines")); + showLinesButton.setToolTip(Components.literal("Show mirror lines")); } //Show areas button if (modifier.drawPlanes) { showAreasButton.setIcon(AllIcons.I_SHOW_AREAS); - showAreasButton.setToolTip(Components.literal("Showing mirror areas")); + showAreasButton.setToolTip(Components.literal("Show mirror areas")); } else { showAreasButton.setIcon(AllIcons.I_HIDE_AREAS); - showAreasButton.setToolTip(Components.literal("Not showing mirror areas")); + showAreasButton.setToolTip(Components.literal("Show mirror areas")); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java index 80b9554..25cb90d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java @@ -43,14 +43,14 @@ public class RadialMirrorEntry extends BaseModifierEntry { for (int i = 0; i < 3; i++) { final int index = i; var scrollInput = new LabeledScrollInput(0, 0, 36, 18) - .showControlScrollsSlowerTooltip() - .titled(Component.literal(i == 0 ? "X Position" : i == 1 ? "Y Position" : "Z Position")) - .format(integer -> Component.literal(df.format(integer / 2.0))) - .withStepFunction(stepContext -> stepContext.shift ? 20 : stepContext.control ? 1 : 2) - .calling(value -> { - modifier.position = MathHelper.with(modifier.position, index, value / 2.0); - onValueChanged(); - }); + .showControlScrollsSlowerTooltip() + .titled(Component.literal(i == 0 ? "X Position" : i == 1 ? "Y Position" : "Z Position")) + .format(integer -> Component.literal(df.format(integer / 2.0))) + .withStepFunction(stepContext -> stepContext.shift ? 20 : stepContext.control ? 1 : 2) + .calling(value -> { + modifier.position = MathHelper.with(modifier.position, index, value / 2.0); + onValueChanged(); + }); scrollInput.setState((int) (MathHelper.get(modifier.position, index) * 2.0)); positionInputs.add(scrollInput); } @@ -58,80 +58,80 @@ public class RadialMirrorEntry extends BaseModifierEntry { //Player position button playerPositionButton = new IconButton(0, 0, AllIcons.I_PLAYER) - .withCallback(() -> { - modifier.position = Vec3.atLowerCornerOf(Minecraft.getInstance().player.blockPosition()); - onValueChanged(); - }); + .withCallback(() -> { + modifier.position = Vec3.atLowerCornerOf(Minecraft.getInstance().player.blockPosition()); + onValueChanged(); + }); playerPositionButton.setToolTip(Components.literal("Set to player position")); listeners.add(playerPositionButton); //Toggle offset button toggleOffsetButton = new IconButton(0, 0, AllIcons.I_BLOCK_CENTER) - .withCallback(() -> { - if (modifier.position.x == Math.floor(modifier.position.x)) { - modifier.position = new Vec3( - Math.floor(modifier.position.x) + 0.5, - Math.floor(modifier.position.y) + 0.5, - Math.floor(modifier.position.z) + 0.5 - ); - } - else { - modifier.position = new Vec3( - Math.floor(modifier.position.x), - Math.floor(modifier.position.y), - Math.floor(modifier.position.z) - ); - } - onValueChanged(); - }); + .withCallback(() -> { + if (modifier.position.x == Math.floor(modifier.position.x)) { + modifier.position = new Vec3( + Math.floor(modifier.position.x) + 0.5, + Math.floor(modifier.position.y) + 0.5, + Math.floor(modifier.position.z) + 0.5 + ); + } + else { + modifier.position = new Vec3( + Math.floor(modifier.position.x), + Math.floor(modifier.position.y), + Math.floor(modifier.position.z) + ); + } + onValueChanged(); + }); listeners.add(toggleOffsetButton); //Slices slicesInput = new LabeledScrollInput(0, 0, 27, 18) - .withRange(3, 1000) - .titled(Component.literal("Slices")) - .calling(value -> { - modifier.slices = value; - onValueChanged(); - }); + .withRange(3, 1000) + .titled(Component.literal("Slices")) + .calling(value -> { + modifier.slices = value; + onValueChanged(); + }); slicesInput.setState(modifier.slices); listeners.add(slicesInput); //Alternate alternateButton = new IconButton(0, 0, AllIcons.I_ALTERNATE_OFF) - .withCallback(() -> { - modifier.alternate = !modifier.alternate; - onValueChanged(); - }); + .withCallback(() -> { + modifier.alternate = !modifier.alternate; + onValueChanged(); + }); listeners.add(alternateButton); //Radius radiusInput = new LabeledScrollInput(0, 0, 27, 18) - .withRange(0, ReachHelper.getMaxMirrorRadius(Minecraft.getInstance().player)) - .titled(Minecraft.getInstance().player.isCreative() ? - Component.literal("Radius") : - Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) - .calling(value -> { - modifier.radius = value; - onValueChanged(); - }); + .withRange(0, ReachHelper.getMaxMirrorRadius(Minecraft.getInstance().player)) + .titled(Minecraft.getInstance().player.isCreative() ? + Component.literal("Radius") : + Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) + .calling(value -> { + modifier.radius = value; + onValueChanged(); + }); radiusInput.setState(modifier.radius); listeners.add(radiusInput); //Show lines button showLinesButton = new IconButton(0, 0, AllIcons.I_SHOW_LINES) - .withCallback(() -> { - modifier.drawLines = !modifier.drawLines; - onValueChanged(); - }); + .withCallback(() -> { + modifier.drawLines = !modifier.drawLines; + onValueChanged(); + }); listeners.add(showLinesButton); //Show areas button showAreasButton = new IconButton(0, 0, AllIcons.I_SHOW_AREAS) - .withCallback(() -> { - modifier.drawPlanes = !modifier.drawPlanes; - onValueChanged(); - }); + .withCallback(() -> { + modifier.drawPlanes = !modifier.drawPlanes; + onValueChanged(); + }); listeners.add(showAreasButton); for (ScrollInput positionInput : positionInputs) { @@ -221,21 +221,21 @@ public class RadialMirrorEntry extends BaseModifierEntry { //Show lines button if (modifier.drawLines) { showLinesButton.setIcon(AllIcons.I_SHOW_LINES); - showLinesButton.setToolTip(Components.literal("Showing mirror lines")); + showLinesButton.setToolTip(Components.literal("Show mirror lines")); } else { showLinesButton.setIcon(AllIcons.I_HIDE_LINES); - showLinesButton.setToolTip(Components.literal("Not showing mirror lines")); + showLinesButton.setToolTip(Components.literal("Show mirror lines")); } //Show areas button if (modifier.drawPlanes) { showAreasButton.setIcon(AllIcons.I_SHOW_AREAS); - showAreasButton.setToolTip(Components.literal("Showing mirror areas")); + showAreasButton.setToolTip(Components.literal("Show mirror areas")); } else { showAreasButton.setIcon(AllIcons.I_HIDE_AREAS); - showAreasButton.setToolTip(Components.literal("Not showing mirror areas")); + showAreasButton.setToolTip(Components.literal("Show mirror areas")); } } } diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.json b/src/main/resources/assets/effortlessbuilding/lang/en_us.json index a971a10..4da0f70 100644 --- a/src/main/resources/assets/effortlessbuilding/lang/en_us.json +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.json @@ -90,5 +90,11 @@ "effortlessbuilding.gui.scrollInput.scrollToAdjustAmount": "Scroll to Adjust Amount", "effortlessbuilding.gui.scrollInput.scrollToSelect": "Scroll to Select", "effortlessbuilding.gui.scrollInput.shiftScrollsFaster": "Shift to Scroll Faster", - "effortlessbuilding.gui.scrollInput.controlScrollsSlower": "Control to Scroll Slower" + "effortlessbuilding.gui.scrollInput.controlScrollsSlower": "Control to Scroll Slower", + + "effortlessbuilding.tooltip.holdForDescription": "Hold [%1$s] for Summary", + "effortlessbuilding.tooltip.holdForControls": "Hold [%1$s] for Controls", + "effortlessbuilding.tooltip.keyShift": "Shift", + "effortlessbuilding.tooltip.keyCtrl": "Ctrl", + "effortlessbuilding.tooltip.keybind": "[%1$s]" }