diff --git a/assets/icons-18.psd b/assets/icons-18.psd new file mode 100644 index 0000000..c37a522 Binary files /dev/null and b/assets/icons-18.psd differ diff --git a/assets/icons-20.psd b/assets/icons-20.psd new file mode 100644 index 0000000..5e0175d Binary files /dev/null and b/assets/icons-20.psd differ diff --git a/src/main/java/me/roundaround/armorstands/client/gui/MessageRenderer.java b/src/main/java/me/roundaround/armorstands/client/gui/MessageRenderer.java index adc8ce2..f40da3f 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/MessageRenderer.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/MessageRenderer.java @@ -1,12 +1,11 @@ package me.roundaround.armorstands.client.gui; import com.mojang.blaze3d.systems.RenderSystem; -import me.roundaround.armorstands.client.gui.widget.NavigationButtonWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; @@ -77,7 +76,7 @@ public void render(Screen screen, DrawContext context) { TextRenderer textRenderer = client.textRenderer; int width = textRenderer.getWidth(text); int x = (screen.width - width) / 2; - int y = screen.height - NavigationButtonWidget.HEIGHT - 1 - 6 - textRenderer.fontHeight; + int y = screen.height - ButtonWidget.DEFAULT_HEIGHT - 1 - 6 - textRenderer.fontHeight; float opacity = MathHelper.clamp(timeRemaining / 10f, 0f, 1f); int backgroundAlpha = client.options.getTextBackgroundColor(0) >> 24 & 0xFF; diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java index cd0db10..4b6d9db 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java @@ -4,9 +4,7 @@ import me.roundaround.armorstands.ArmorStandsMod; import me.roundaround.armorstands.client.ArmorStandsClientMod; import me.roundaround.armorstands.client.gui.MessageRenderer; -import me.roundaround.armorstands.client.gui.widget.HelpButtonWidget; -import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.NavigationButtonWidget; +import me.roundaround.armorstands.client.gui.widget.ArmorStandLayoutWidget; import me.roundaround.armorstands.client.network.ClientNetworking; import me.roundaround.armorstands.mixin.ArmorStandEntityAccessor; import me.roundaround.armorstands.mixin.InGameHudAccessor; @@ -15,14 +13,18 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.network.UtilityAction; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; -import me.roundaround.roundalib.client.gui.GuiUtil; +import me.roundaround.roundalib.asset.icon.BuiltinIcon; +import me.roundaround.roundalib.asset.icon.CustomIcon; +import me.roundaround.roundalib.client.gui.layout.IntRect; +import me.roundaround.roundalib.client.gui.widget.DrawableWidget; +import me.roundaround.roundalib.client.gui.widget.IconButtonWidget; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.sound.SoundEvents; @@ -30,24 +32,21 @@ import net.minecraft.util.Identifier; import org.lwjgl.glfw.GLFW; -import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; import java.util.Optional; public abstract class AbstractArmorStandScreen extends HandledScreen implements PassesEventsThrough { - protected static final Identifier SELECTION_TEXTURE = new Identifier( - ArmorStandsMod.MOD_ID, "textures/gui/selection_frame.png"); - - protected static final int NAV_BUTTON_BOTTOM_PADDING = 1; - protected static final int NAV_BUTTON_SPACING = 0; + protected static final Identifier SELECTION_TEXTURE = new Identifier(ArmorStandsMod.MOD_ID, "selection"); + protected static final CustomIcon COPY_ICON = new CustomIcon("copy", 20); + protected static final CustomIcon PASTE_ICON = new CustomIcon("paste", 20); + protected final ArmorStandLayoutWidget layout = new ArmorStandLayoutWidget(this); protected final ArmorStandEntity armorStand; protected final MessageRenderer messageRenderer; - protected final ArrayList navigationButtons = new ArrayList<>(); - protected NavigationButtonWidget activeButton; + protected IconButtonWidget activeButton; protected boolean supportsUndoRedo = false; protected boolean utilizesInventory = false; protected boolean passEvents = true; @@ -80,15 +79,96 @@ public boolean shouldPassEvents() { @Override public void init() { - initStart(); + this.populateLayout(); + this.collectChildren(); + this.initTabNavigation(); + } - super.init(); + protected void populateLayout() { + this.initUtilityButtons(); + this.initNavigationButtons(); + } - initLeft(); - initNavigationButtons(); - initRight(); + protected void initUtilityButtons() { + if (!this.supportsUndoRedo) { + return; + } - initEnd(); + this.layout.topLeft.add(IconButtonWidget.builder(BuiltinIcon.HELP_18, ArmorStandsMod.MOD_ID) + .large() + .messageAndTooltip(this.buildHelpTooltipText()) + .build()); + this.layout.topLeft.add(IconButtonWidget.builder(COPY_ICON, ArmorStandsMod.MOD_ID) + .large() + .messageAndTooltip(Text.translatable("armorstands.utility.copy")) + .onPress((button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.COPY)) + .build()); + this.layout.topLeft.add(IconButtonWidget.builder(PASTE_ICON, ArmorStandsMod.MOD_ID) + .large() + .messageAndTooltip(Text.translatable("armorstands.utility.paste")) + .onPress((button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PASTE)) + .build()); + this.layout.topLeft.add(IconButtonWidget.builder(BuiltinIcon.UNDO_18, ArmorStandsMod.MOD_ID) + .large() + .messageAndTooltip(Text.translatable("armorstands.utility.undo")) + .onPress((button) -> ClientNetworking.sendUndoPacket(false)) + .build()); + this.layout.topLeft.add(IconButtonWidget.builder(BuiltinIcon.REDO_18, ArmorStandsMod.MOD_ID) + .large() + .messageAndTooltip(Text.translatable("armorstands.utility.redo")) + .onPress((button) -> ClientNetworking.sendUndoPacket(true)) + .build()); + } + + private Text buildHelpTooltipText() { + String alt = Text.translatable("armorstands.help.alt").getString(); + String inventory = Objects.requireNonNull(this.client).options.inventoryKey.getBoundKeyLocalizedText().getString(); + String left = InputUtil.fromKeyCode(GLFW.GLFW_KEY_LEFT, 0).getLocalizedText().getString(); + String right = InputUtil.fromKeyCode(GLFW.GLFW_KEY_RIGHT, 0).getLocalizedText().getString(); + String highlight = ArmorStandsClientMod.highlightArmorStandKeyBinding.getBoundKeyLocalizedText().getString(); + String control = Text.translatable("armorstands.help." + (MinecraftClient.IS_SYSTEM_MAC ? "cmd" : "ctrl")) + .getString(); + String z = InputUtil.fromKeyCode(GLFW.GLFW_KEY_Z, 0).getLocalizedText().getString(); + String shift = Text.translatable("armorstands.help.shift").getString(); + String c = InputUtil.fromKeyCode(GLFW.GLFW_KEY_C, 0).getLocalizedText().getString(); + String v = InputUtil.fromKeyCode(GLFW.GLFW_KEY_V, 0).getLocalizedText().getString(); + + return Text.translatable("armorstands.help", alt, inventory, left, right, highlight, control, z, control, shift, z, + control, c, control, v + ); + } + + protected void initNavigationButtons() { + for (ScreenType screenType : ScreenType.values()) { + IconButtonWidget navButton = IconButtonWidget.builder(screenType.getIcon(), ArmorStandsMod.MOD_ID) + .onPress((button) -> ClientNetworking.sendRequestScreenPacket(this.getArmorStand(), screenType)) + .build(); + if (this.getScreenType() == screenType) { + navButton.active = false; + } + this.layout.navRow.add(navButton); + } + } + + protected void collectChildren() { + this.layout.forEachChild(this::addDrawableChild); + this.addDrawableChild(new DrawableWidget() { + @Override + protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + IconButtonWidget activeButton = AbstractArmorStandScreen.this.activeButton; + if (activeButton == null) { + return; + } + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + context.drawGuiTexture(SELECTION_TEXTURE, activeButton.getX() - 2, activeButton.getY() - 2, 24, 24); + } + }); + } + + @Override + protected void initTabNavigation() { + this.layout.refreshPositions(); } @Override @@ -118,8 +198,6 @@ public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) super.render(drawContext, adjustedMouseX, adjustedMouseY, delta); - renderActivePageButtonHighlight(drawContext); - this.messageRenderer.render(drawContext); } @@ -197,22 +275,20 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { } @Override - public boolean mouseScrolled( - double mouseX, double mouseY, double horizontalAmount, double verticalAmount - ) { + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (this.cursorLocked) { return false; } - for (NavigationButtonWidget button : this.navigationButtons) { - if (button.isMouseOverIgnoreState(mouseX, mouseY)) { - if (verticalAmount > 0) { - goToPreviousScreen(); - } else { - goToNextScreen(); - } - return true; + + if (IntRect.fromWidget(this.layout.navRow).contains(mouseX, mouseY)) { + if (verticalAmount > 0) { + goToPreviousScreen(); + } else { + goToNextScreen(); } + return true; } + return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); } @@ -286,17 +362,13 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return true; } - for (int i = 0; i < this.navigationButtons.size(); i++) { - NavigationButtonWidget button = this.navigationButtons.get(i); - ScreenType screenType = button.getScreenType(); - + for (ScreenType screenType : ScreenType.values()) { if (screenType == this.getScreenType()) { continue; } - - if (this.client.options.hotbarKeys[i].matchesKey(keyCode, scanCode)) { + if (this.client.options.hotbarKeys[screenType.getId()].matchesKey(keyCode, scanCode)) { playClickSound(); - button.onPress(); + ClientNetworking.sendRequestScreenPacket(this.armorStand, screenType); return true; } } @@ -355,87 +427,6 @@ public void updateDisabledSlotsOnClient(int disabledSlots) { ((ArmorStandEntityAccessor) this.armorStand).setDisabledSlots(disabledSlots); } - protected void initStart() { - this.navigationButtons.clear(); - } - - protected void initUtilityButtons() { - if (!this.supportsUndoRedo) { - return; - } - - addDrawableChild(new HelpButtonWidget(GuiUtil.PADDING, GuiUtil.PADDING)); - addDrawableChild( - new IconButtonWidget(GuiUtil.PADDING + IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2), GuiUtil.PADDING, 14, - Text.translatable("armorstands.utility.copy"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.COPY) - )); - addDrawableChild( - new IconButtonWidget(GuiUtil.PADDING + 2 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, - 15, Text.translatable("armorstands.utility.paste"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PASTE) - )); - addDrawableChild( - new IconButtonWidget(GuiUtil.PADDING + 3 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, - 17, Text.translatable("armorstands.utility.undo"), (button) -> ClientNetworking.sendUndoPacket(false) - )); - addDrawableChild( - new IconButtonWidget(GuiUtil.PADDING + 4 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, - 18, Text.translatable("armorstands.utility.redo"), (button) -> ClientNetworking.sendUndoPacket(true) - )); - } - - protected void initLeft() { - initUtilityButtons(); - } - - protected void initNavigationButtons() { - ScreenType[] screenTypes = ScreenType.values(); - int totalWidth = screenTypes.length * NavigationButtonWidget.WIDTH + (screenTypes.length - 1) * NAV_BUTTON_SPACING; - - int x = (width - totalWidth) / 2 - 2 * NAV_BUTTON_SPACING; - int y = height - NAV_BUTTON_BOTTOM_PADDING - NavigationButtonWidget.HEIGHT; - - for (ScreenType screenType : screenTypes) { - NavigationButtonWidget button = new NavigationButtonWidget(this, x, y, screenType); - - if (getScreenType() == screenType) { - this.activeButton = button; - addDrawable(button); - } else { - addDrawableChild(button); - } - - x += NAV_BUTTON_SPACING + NavigationButtonWidget.WIDTH; - - this.navigationButtons.add(button); - } - } - - protected void initRight() { - } - - protected void initEnd() { - } - - protected void renderActivePageButtonHighlight(DrawContext drawContext) { - if (this.activeButton == null) { - return; - } - - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - MatrixStack matrixStack = drawContext.getMatrices(); - matrixStack.push(); - matrixStack.translate(0, 0, 100); - drawContext.drawTexture(SELECTION_TEXTURE, this.activeButton.getX() - 2, this.activeButton.getY() - 2, 0, 0, 24, 24, - 24, 24 - ); - matrixStack.pop(); - } - protected void playClickSound() { Objects.requireNonNull(this.client) .getSoundManager() diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java index 512ebb2..a5c21da 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java @@ -38,24 +38,23 @@ public ScreenType getScreenType() { return ScreenType.INVENTORY; } - @Override - protected void initRight() { - this.showArmsToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.SHOW_ARMS, - ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand), this.width - GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 2 * FlagToggleWidget.WIDGET_HEIGHT - (GuiUtil.PADDING / 2) - )); - this.lockInventoryToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.LOCK_INVENTORY, - ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand), this.width - GuiUtil.PADDING, - this.height - GuiUtil.PADDING - FlagToggleWidget.WIDGET_HEIGHT - )); + protected void populateLayout() { +// this.showArmsToggle = this.layout.bottomRight.add(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.SHOW_ARMS, +// ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand), this.width - GuiUtil.PADDING, +// this.height - GuiUtil.PADDING - 2 * FlagToggleWidget.WIDGET_HEIGHT - (GuiUtil.PADDING / 2) +// )); +// this.lockInventoryToggle = this.layout.bottomRight.add(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.LOCK_INVENTORY, +// ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand), this.width - GuiUtil.PADDING, +// this.height - GuiUtil.PADDING - FlagToggleWidget.WIDGET_HEIGHT +// )); } @Override public void handledScreenTick() { super.handledScreenTick(); - this.showArmsToggle.setValue(ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand)); - this.lockInventoryToggle.setValue(ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand)); +// this.showArmsToggle.setValue(ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand)); +// this.lockInventoryToggle.setValue(ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand)); } @Override diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java index 9c3de8d..c9ad2b7 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java @@ -1,7 +1,5 @@ package me.roundaround.armorstands.client.gui.screen; -import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.MoveButtonWidget; import me.roundaround.armorstands.client.network.ClientNetworking; import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.network.UtilityAction; @@ -10,6 +8,7 @@ import me.roundaround.armorstands.util.MoveUnits; import me.roundaround.roundalib.client.gui.GuiUtil; import me.roundaround.roundalib.client.gui.widget.LabelWidget; +import me.roundaround.roundalib.client.gui.widget.layout.LinearLayoutWidget; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.CyclingButtonWidget; import net.minecraft.entity.Entity; @@ -19,6 +18,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class ArmorStandMoveScreen extends AbstractArmorStandScreen { private static final int MINI_BUTTON_WIDTH = 28; @@ -27,12 +27,10 @@ public class ArmorStandMoveScreen extends AbstractArmorStandScreen { private static final int BUTTON_HEIGHT = 16; private final HashMap directionLabels = new HashMap<>(); - private final ArrayList moveButtons = new ArrayList<>(); + private final ArrayList moveButtons = new ArrayList<>(); - private LabelWidget playerPosLabel; - private LabelWidget playerBlockPosLabel; - private LabelWidget standPosLabel; - private LabelWidget standBlockPosLabel; + private LabelWidget playerLabel; + private LabelWidget standLabel; private LabelWidget facingLabel; private CyclingButtonWidget unitsButton; private MoveMode mode = MoveMode.RELATIVE; @@ -49,186 +47,115 @@ public ScreenType getScreenType() { } @Override - protected void initStart() { - super.initStart(); + protected void populateLayout() { + super.populateLayout(); - directionLabels.clear(); - moveButtons.clear(); - } - - @Override - protected void initLeft() { - super.initLeft(); - - initCurrentStatus(); - initSnapButtons(); - } - - private void initCurrentStatus() { - ArrayList playerLines = new ArrayList<>(); - playerLines.add(Text.translatable("armorstands.current.player")); - playerLines.add(this.getCurrentPosText(this.client.player)); - playerLines.add(this.getCurrentBlockPosText(this.client.player)); - this.addDrawable(LabelWidget.builder(this.textRenderer, playerLines) - .refPosition(this.width, 0) - .alignedTop() - .justifiedRight() - .build()); - - ArrayList standLines = new ArrayList<>(); - standLines.add(Text.translatable("armorstands.current.stand")); - standLines.add(this.getCurrentPosText(this.armorStand)); - standLines.add(this.getCurrentBlockPosText(this.armorStand)); - this.addDrawable(LabelWidget.builder(this.textRenderer, standLines) - .refPosition(this.width, 0) - .alignedTop() - .justifiedRight() - .build()); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.standPosLabel = addLabel(LabelWidget.builder(getCurrentPosText(this.armorStand), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.standBlockPosLabel = addLabel(LabelWidget.builder(getCurrentBlockPosText(this.armorStand), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); + this.initSnapButtons(); + this.initLabels(); + this.initCore(); } private void initSnapButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.move.snap"), GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 2 * (BUTTON_HEIGHT + (GuiUtil.PADDING / 2)) - ).shiftForPadding().justifiedLeft().alignedBottom().build()); - - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.standing"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_STANDING) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2)) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.sitting"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_SITTING) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), - this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2) - ) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.corner"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CORNER) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.center"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CENTER) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.player"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_PLAYER) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + 2 * (BUTTON_WIDTH + (GuiUtil.PADDING / 2)), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); + this.layout.bottomLeft.add( + LabelWidget.builder(this.textRenderer, Text.translatable("armorstands.move.snap")).build()); + + LinearLayoutWidget firstRow = LinearLayoutWidget.horizontal().alignLeft().spacing(GuiUtil.PADDING); + firstRow.add(ButtonWidget.builder(Text.translatable("armorstands.move.snap.standing"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_STANDING) + ).size(BUTTON_WIDTH, BUTTON_HEIGHT).build()); + firstRow.add(ButtonWidget.builder(Text.translatable("armorstands.move.snap.sitting"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_SITTING) + ).size(BUTTON_WIDTH, BUTTON_HEIGHT).build()); + this.layout.bottomLeft.add(firstRow); + + LinearLayoutWidget secondRow = LinearLayoutWidget.horizontal().alignLeft().spacing(GuiUtil.PADDING); + secondRow.add(ButtonWidget.builder(Text.translatable("armorstands.move.snap.corner"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CORNER) + ).size(BUTTON_WIDTH, BUTTON_HEIGHT).build()); + secondRow.add(ButtonWidget.builder(Text.translatable("armorstands.move.snap.center"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CENTER) + ).size(BUTTON_WIDTH, BUTTON_HEIGHT).build()); + secondRow.add(ButtonWidget.builder(Text.translatable("armorstands.move.snap.player"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_PLAYER) + ).size(BUTTON_WIDTH, BUTTON_HEIGHT).build()); + this.layout.bottomLeft.add(secondRow); } - @Override - protected void initRight() { - super.initRight(); - - int topOfMoveButtons = this.height - GuiUtil.PADDING - 6 * MINI_BUTTON_HEIGHT - 5 * (GuiUtil.PADDING / 2); + private void initLabels() { + LinearLayoutWidget labels = LinearLayoutWidget.vertical().spacing(GuiUtil.PADDING).alignTop().alignRight(); + this.playerLabel = labels.add( + LabelWidget.builder(this.textRenderer, this.getPlayerLines()).justifiedRight().lineSpacing(1).build()); + this.standLabel = labels.add( + LabelWidget.builder(this.textRenderer, this.getArmorStandLines()).justifiedRight().lineSpacing(1).build()); + this.layout.topRight.add(labels); + } - addDrawableChild(CyclingButtonWidget.builder(MoveMode::getOptionValueText) + private void initCore() { + this.layout.bottomRight.add(CyclingButtonWidget.builder(MoveMode::getOptionValueText) .values(MoveMode.values()) .initially(this.mode) - .build(this.width - GuiUtil.PADDING - 120, - topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2) - 2 * MINI_BUTTON_HEIGHT, 120, - MINI_BUTTON_HEIGHT, MoveMode.getOptionLabelText(), (button, mode) -> { - this.mode = mode; - this.units = this.mode.getDefaultUnits(); - - this.facingLabel.setText( - getCurrentFacingText(this.mode.equals(MoveMode.LOCAL_TO_STAND) ? this.armorStand : client.player)); - this.directionLabels.forEach((direction, label) -> { - label.setText(this.mode.getDirectionText(direction)); - }); - - this.unitsButton.setValue(this.units); - this.moveButtons.forEach((moveButton) -> { - moveButton.setUnits(this.units); - }); - } - )); - - this.unitsButton = addDrawableChild(CyclingButtonWidget.builder(MoveUnits::getOptionValueText) + .build(MoveMode.getOptionLabelText(), (button, mode) -> { + this.mode = mode; + this.units = this.mode.getDefaultUnits(); + + this.unitsButton.setValue(this.units); + this.facingLabel.setText(this.getCurrentFacingText()); + this.directionLabels.forEach((direction, label) -> label.setText(this.mode.getDirectionText(direction))); + this.moveButtons.forEach((moveButton) -> moveButton.setUnits(this.units)); + })); + + this.unitsButton = this.layout.bottomRight.add(CyclingButtonWidget.builder(MoveUnits::getOptionValueText) .values(MoveUnits.values()) .initially(this.units) - .build(this.width - GuiUtil.PADDING - 120, - topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 2 * (GuiUtil.PADDING / 2) - MINI_BUTTON_HEIGHT, 120, - MINI_BUTTON_HEIGHT, MoveUnits.getOptionLabelText(), (button, units) -> { - this.units = units; - this.moveButtons.forEach((moveButton) -> { - moveButton.setUnits(this.units); - }); - } - )); - - this.facingLabel = addLabel(LabelWidget.builder( - getCurrentFacingText(this.mode.equals(MoveMode.LOCAL_TO_STAND) ? this.armorStand : this.client.player), - this.width - GuiUtil.PADDING, topOfMoveButtons - (GuiUtil.PADDING / 2) - ).shiftForPadding().alignedBottom().justifiedRight().build()); + .build(MoveUnits.getOptionLabelText(), (button, units) -> { + this.units = units; + this.moveButtons.forEach((moveButton) -> moveButton.setUnits(this.units)); + })); + + this.facingLabel = this.layout.bottomRight.add( + LabelWidget.builder(this.textRenderer, this.getCurrentFacingText()).build()); Direction[] directions = new Direction[]{ Direction.UP, Direction.DOWN, Direction.SOUTH, Direction.NORTH, Direction.EAST, Direction.WEST }; - for (int i = directions.length - 1; i >= 0; i--) { - addRowOfButtons(directions[directions.length - i - 1], i); - } - } + for (Direction direction : directions) { + LinearLayoutWidget row = LinearLayoutWidget.horizontal().spacing(GuiUtil.PADDING).alignRight().alignCenterY(); + + LabelWidget label = LabelWidget.builder(this.textRenderer, this.mode.getDirectionText(direction)).build(); + this.directionLabels.put(direction, label); + row.add(label); - private void addRowOfButtons(Direction direction, int index) { - int refX = this.width - GuiUtil.PADDING; - int refY = this.height - GuiUtil.PADDING - MINI_BUTTON_HEIGHT - index * ((GuiUtil.PADDING / 2) + MINI_BUTTON_HEIGHT); - - directionLabels.put(direction, addLabel( - LabelWidget.builder(this.mode.getDirectionText(direction), refX - 3 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), - refY + MINI_BUTTON_HEIGHT / 2 - ).justifiedRight().alignedMiddle().shiftForPadding().build())); - - moveButtons.add(addDrawableChild( - new MoveButtonWidget(refX - 3 * MINI_BUTTON_WIDTH - 2 * (GuiUtil.PADDING / 2), refY, MINI_BUTTON_WIDTH, - MINI_BUTTON_HEIGHT, direction, 1, this.mode, this.units - ))); - - moveButtons.add(addDrawableChild( - new MoveButtonWidget(refX - 2 * MINI_BUTTON_WIDTH - (GuiUtil.PADDING / 2), refY, MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT, - direction, 2, this.mode, this.units - ))); - - moveButtons.add(addDrawableChild( - new MoveButtonWidget(refX - MINI_BUTTON_WIDTH, refY, MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT, direction, 3, - this.mode, this.units - ))); + MoveButtonRef one = new MoveButtonRef(direction, 1, this.mode, this.units); + this.moveButtons.add(one); + row.add(one.getButton()); + + this.layout.bottomRight.add(row); + } } @Override public void handledScreenTick() { super.handledScreenTick(); - this.playerPosLabel.setText(getCurrentPosText(this.client.player)); - this.playerBlockPosLabel.setText(getCurrentBlockPosText(this.client.player)); - this.standPosLabel.setText(getCurrentPosText(this.armorStand)); - this.standBlockPosLabel.setText(getCurrentBlockPosText(this.armorStand)); + this.playerLabel.setText(this.getPlayerLines()); + this.standLabel.setText(this.getArmorStandLines()); this.facingLabel.setText( getCurrentFacingText(this.mode.equals(MoveMode.LOCAL_TO_STAND) ? this.armorStand : this.client.player)); } + private List getPlayerLines() { + return List.of(Text.translatable("armorstands.current.player"), this.getCurrentPosText(this.client.player), + this.getCurrentBlockPosText(this.client.player) + ); + } + + private List getArmorStandLines() { + return List.of(Text.translatable("armorstands.current.stand"), this.getCurrentPosText(this.armorStand), + this.getCurrentBlockPosText(this.armorStand) + ); + } + private Text getCurrentPosText(Entity entity) { String xStr = String.format("%.2f", entity.getX()); String yStr = String.format("%.2f", entity.getY()); @@ -241,6 +168,10 @@ private Text getCurrentBlockPosText(Entity entity) { return Text.translatable("armorstands.current.block", pos.getX(), pos.getY(), pos.getZ()); } + private Text getCurrentFacingText() { + return this.getCurrentFacingText(this.mode.equals(MoveMode.LOCAL_TO_STAND) ? this.armorStand : this.client.player); + } + private Text getCurrentFacingText(Entity entity) { float currentRotation = entity.getYaw(); Direction currentFacing = Direction.fromRotation(currentRotation); @@ -253,4 +184,41 @@ private Text getCurrentFacingText(Entity entity) { Text towards = Text.translatable("armorstands.current.facing." + towardsI18n); return Text.translatable("armorstands.current.facing", currentFacing.toString(), towards.getString()); } + + private static class MoveButtonRef { + private final ButtonWidget button; + private final Direction direction; + private final int amount; + private final MoveMode mode; + + private MoveUnits units; + + public MoveButtonRef(Direction direction, int amount, MoveMode mode, MoveUnits units) { + this.direction = direction; + this.amount = amount; + this.mode = mode; + this.units = units; + + this.button = ButtonWidget.builder(this.getMessage(), this::onPress) + .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) + .build(); + } + + public ButtonWidget getButton() { + return this.button; + } + + public void setUnits(MoveUnits units) { + this.units = units; + this.button.setMessage(this.units.getButtonText(this.amount)); + } + + private Text getMessage() { + return this.units.getButtonText(this.amount); + } + + private void onPress(ButtonWidget button) { + ClientNetworking.sendAdjustPosPacket(this.direction, this.amount, this.mode, this.units); + } + } } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java index 1380d9d..187a2fb 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java @@ -1,21 +1,25 @@ package me.roundaround.armorstands.client.gui.screen; import com.mojang.blaze3d.systems.RenderSystem; +import me.roundaround.armorstands.ArmorStandsMod; import me.roundaround.armorstands.client.gui.widget.AdjustPoseSliderWidget; -import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.LabelWidget; import me.roundaround.armorstands.client.network.ClientNetworking; import me.roundaround.armorstands.network.EulerAngleParameter; import me.roundaround.armorstands.network.PosePart; import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; import me.roundaround.armorstands.util.Pose; +import me.roundaround.roundalib.asset.icon.CustomIcon; import me.roundaround.roundalib.client.gui.GuiUtil; +import me.roundaround.roundalib.client.gui.layout.Spacing; +import me.roundaround.roundalib.client.gui.widget.DrawableWidget; +import me.roundaround.roundalib.client.gui.widget.IconButtonWidget; +import me.roundaround.roundalib.client.gui.widget.LabelWidget; +import me.roundaround.roundalib.client.gui.widget.layout.LinearLayoutWidget; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.CyclingButtonWidget; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.text.Text; @@ -24,13 +28,15 @@ public class ArmorStandPoseScreen extends AbstractArmorStandScreen { private static final int SLIDER_HEIGHT = 16; private static final int BUTTON_HEIGHT = 16; private static final int BUTTON_WIDTH = 16; - private static final int ROW_PAD = 6; - private static final int PART_PAD_VERTICAL = 10; - private static final int PART_PAD_HORIZONTAL = 4; + protected static final CustomIcon HEAD_ICON = new CustomIcon("head", 20); + protected static final CustomIcon BODY_ICON = new CustomIcon("body", 20); + protected static final CustomIcon RIGHT_ARM_ICON = new CustomIcon("rightarm", 20); + protected static final CustomIcon LEFT_ARM_ICON = new CustomIcon("leftarm", 20); + protected static final CustomIcon RIGHT_LEG_ICON = new CustomIcon("rightleg", 20); + protected static final CustomIcon LEFT_LEG_ICON = new CustomIcon("leftleg", 20); private PosePart posePart = PosePart.HEAD; - private IconButtonWidget activePosePartButton; - + private ButtonWidget activePosePartButton; private LabelWidget posePartLabel; private AdjustPoseSliderWidget pitchSlider; private AdjustPoseSliderWidget yawSlider; @@ -61,158 +67,118 @@ public ScreenType getScreenType() { } @Override - protected void initLeft() { - super.initLeft(); + protected void collectChildren() { + super.collectChildren(); + this.addDrawableChild(new DrawableWidget() { + @Override + protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + ButtonWidget activeButton = ArmorStandPoseScreen.this.activePosePartButton; + if (activeButton == null) { + return; + } + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + context.drawGuiTexture(SELECTION_TEXTURE, activeButton.getX() - 2, activeButton.getY() - 2, 24, 24); + } + }); + } - int offset = (CONTROL_WIDTH - 3 * IconButtonWidget.WIDTH - 2 * PART_PAD_HORIZONTAL) / 2; + @Override + protected void populateLayout() { + super.populateLayout(); - IconButtonWidget headButton = new IconButtonWidget( - offset + GuiUtil.PADDING + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, - this.height - GuiUtil.PADDING - 3 * IconButtonWidget.HEIGHT - 2 * PART_PAD_VERTICAL - PART_PAD_VERTICAL - - BUTTON_HEIGHT, 6, PosePart.HEAD.getDisplayName(), (button) -> { - setActivePosePart(PosePart.HEAD); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - headButton.active = false; - this.activePosePartButton = headButton; - addDrawableChild(headButton); + this.initPartPicker(); + this.initCore(); + } - IconButtonWidget rightArmButton = new IconButtonWidget(offset + GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - - BUTTON_HEIGHT, 8, PosePart.RIGHT_ARM.getDisplayName(), (button) -> { - setActivePosePart(PosePart.RIGHT_ARM); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - addDrawableChild(rightArmButton); + private void initPartPicker() { + this.layout.bottomLeft.alignCenterX().spacing(2 * GuiUtil.PADDING); - IconButtonWidget bodyButton = new IconButtonWidget( - offset + GuiUtil.PADDING + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, - this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - - BUTTON_HEIGHT, 7, PosePart.BODY.getDisplayName(), (button) -> { - setActivePosePart(PosePart.BODY); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - addDrawableChild(bodyButton); + IconButtonWidget headButton = this.layout.bottomLeft.add(IconButtonWidget.builder(HEAD_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.HEAD)) + .build()); + headButton.active = false; + this.activePosePartButton = headButton; - IconButtonWidget leftArmButton = new IconButtonWidget( - offset + GuiUtil.PADDING + 2 * IconButtonWidget.WIDTH + 2 * PART_PAD_HORIZONTAL, - this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - - BUTTON_HEIGHT, 9, PosePart.LEFT_ARM.getDisplayName(), (button) -> { - setActivePosePart(PosePart.LEFT_ARM); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - addDrawableChild(leftArmButton); + LinearLayoutWidget torsoRow = LinearLayoutWidget.horizontal().spacing(GuiUtil.PADDING).alignCenterX(); + torsoRow.add(IconButtonWidget.builder(RIGHT_ARM_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.RIGHT_ARM)) + .build()); + torsoRow.add(IconButtonWidget.builder(BODY_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.BODY)) + .build()); + torsoRow.add(IconButtonWidget.builder(LEFT_ARM_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.LEFT_ARM)) + .build()); + this.layout.bottomLeft.add(torsoRow); - IconButtonWidget rightLegButton = new IconButtonWidget( - offset + GuiUtil.PADDING + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2, - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 11, - PosePart.RIGHT_LEG.getDisplayName(), (button) -> { - setActivePosePart(PosePart.RIGHT_LEG); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - addDrawableChild(rightLegButton); - - IconButtonWidget leftLegButton = new IconButtonWidget( - offset + GuiUtil.PADDING + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2 + IconButtonWidget.WIDTH + - PART_PAD_HORIZONTAL, - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 10, - PosePart.LEFT_LEG.getDisplayName(), (button) -> { - setActivePosePart(PosePart.LEFT_LEG); - this.activePosePartButton.active = true; - this.activePosePartButton = (IconButtonWidget) button; - this.activePosePartButton.active = false; - } - ); - addDrawableChild(leftLegButton); + LinearLayoutWidget feetRow = LinearLayoutWidget.horizontal().spacing(GuiUtil.PADDING).alignCenterX(); + feetRow.add(IconButtonWidget.builder(RIGHT_LEG_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.RIGHT_LEG)) + .build()); + feetRow.add(IconButtonWidget.builder(LEFT_LEG_ICON, ArmorStandsMod.MOD_ID) + .onPress((button) -> setActivePosePart(button, PosePart.LEFT_LEG)) + .build()); + this.layout.bottomLeft.add(feetRow); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.pose.mirror"), (button) -> { - ClientNetworking.sendSetPosePacket(new Pose(this.armorStand).mirror()); + this.layout.bottomLeft.add(ButtonWidget.builder(Text.translatable("armorstands.pose.mirror"), (button) -> { + ClientNetworking.sendSetPosePacket(new Pose(this.armorStand).mirror()); - this.pitchSlider.refresh(); - this.yawSlider.refresh(); - this.rollSlider.refresh(); - }) - .size(CONTROL_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); + this.pitchSlider.refresh(); + this.yawSlider.refresh(); + this.rollSlider.refresh(); + }).size(CONTROL_WIDTH, BUTTON_HEIGHT).build()); } - @Override - protected void initRight() { - super.initRight(); + private void initCore() { + this.posePartLabel = this.layout.bottomRight.add(LabelWidget.builder(this.textRenderer, + Text.translatable("armorstands.pose.editing", this.posePart.getDisplayName()) + ).build()); - addDrawableChild(CyclingButtonWidget.builder(SliderRange::getDisplayName) + this.layout.bottomRight.add(CyclingButtonWidget.builder(SliderRange::getDisplayName) .initially(SliderRange.FULL) .values(SliderRange.values()) .omitKeyText() - .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, - this.height - GuiUtil.PADDING - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - 3 * ROW_PAD - - 2 * LabelWidget.HEIGHT_WITH_PADDING, CONTROL_WIDTH, BUTTON_HEIGHT, - Text.translatable("armorstands.pose.range"), (button, value) -> { - this.pitchSlider.setRange(value.getMin(), value.getMax()); - this.yawSlider.setRange(value.getMin(), value.getMax()); - this.rollSlider.setRange(value.getMin(), value.getMax()); - } - )); - - this.posePartLabel = addLabel( - LabelWidget.builder(Text.translatable("armorstands.pose.editing", this.posePart.getDisplayName().getString()), - this.width - GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 4 * (GuiUtil.PADDING / 2) - 3 * ROW_PAD - - 2 * LabelWidget.HEIGHT_WITH_PADDING - ).shiftForPadding().alignedBottom().justifiedRight().build()); - - this.pitchSlider = addAdjustSlider(EulerAngleParameter.PITCH, 2); - this.yawSlider = addAdjustSlider(EulerAngleParameter.YAW, 1); - this.rollSlider = addAdjustSlider(EulerAngleParameter.ROLL, 0); + .build(Text.translatable("armorstands.pose.range"), (button, value) -> { + this.pitchSlider.setRange(value.getMin(), value.getMax()); + this.yawSlider.setRange(value.getMin(), value.getMax()); + this.rollSlider.setRange(value.getMin(), value.getMax()); + }), (adder) -> { + adder.layoutHook((parent, self) -> self.setDimensions(CONTROL_WIDTH, BUTTON_HEIGHT)); + adder.margin(Spacing.of(0, 0, 2 * GuiUtil.PADDING, 0)); + }); + + this.pitchSlider = addAdjustSlider(EulerAngleParameter.PITCH); + this.yawSlider = addAdjustSlider(EulerAngleParameter.YAW); + this.rollSlider = addAdjustSlider(EulerAngleParameter.ROLL); } - private AdjustPoseSliderWidget addAdjustSlider(EulerAngleParameter parameter, int index) { - int refRight = this.width - GuiUtil.PADDING; - int refLeft = refRight - CONTROL_WIDTH; - int refY = - this.height - GuiUtil.PADDING - SLIDER_HEIGHT - index * (SLIDER_HEIGHT + BUTTON_HEIGHT + (GuiUtil.PADDING / 2) + ROW_PAD); + private AdjustPoseSliderWidget addAdjustSlider(EulerAngleParameter parameter) { + AdjustPoseSliderWidget slider = new AdjustPoseSliderWidget( + CONTROL_WIDTH, SLIDER_HEIGHT, this.posePart, parameter, this.armorStand); - AdjustPoseSliderWidget slider = new AdjustPoseSliderWidget(refLeft, refY, CONTROL_WIDTH, SLIDER_HEIGHT, - this.posePart, parameter, this.armorStand + LinearLayoutWidget firstRow = LinearLayoutWidget.horizontal().alignBottom().spacing(GuiUtil.PADDING); + firstRow.add( + LabelWidget.builder(this.textRenderer, parameter.getDisplayName()).justifiedLeft().alignedBottom().build(), + (parent, self) -> { + self.setWidth(CONTROL_WIDTH - 3 * (BUTTON_WIDTH + parent.getSpacing())); + } ); - - addLabel(LabelWidget.builder(parameter.getDisplayName(), refLeft, refY - (GuiUtil.PADDING / 2)) - .alignedBottom() - .justifiedLeft() - .shiftForPadding() - .build()); - addDrawableChild(ButtonWidget.builder(Text.literal("-"), (button) -> slider.decrement()) + firstRow.add(ButtonWidget.builder(Text.literal("-"), (button) -> slider.decrement()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - 3 * BUTTON_WIDTH - 2 * (GuiUtil.PADDING / 2), refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.subtract"))) .build()); - addDrawableChild(ButtonWidget.builder(Text.literal("+"), (button) -> slider.increment()) + firstRow.add(ButtonWidget.builder(Text.literal("+"), (button) -> slider.increment()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - 2 * BUTTON_WIDTH - (GuiUtil.PADDING / 2), refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.add"))) .build()); - addDrawableChild(ButtonWidget.builder(Text.literal("0"), (button) -> slider.zero()) + firstRow.add(ButtonWidget.builder(Text.literal("0"), (button) -> slider.zero()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - BUTTON_WIDTH, refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.zero"))) .build()); - addDrawableChild(slider); + this.layout.bottomRight.add(firstRow, (adder) -> adder.margin(Spacing.of(GuiUtil.PADDING, 0, 0, 0))); + + this.layout.bottomRight.add(slider); return slider; } @@ -242,43 +208,27 @@ protected void handledScreenTick() { this.rollSlider.tick(); } - @Override - protected void renderActivePageButtonHighlight(DrawContext drawContext) { - super.renderActivePageButtonHighlight(drawContext); - - if (this.activePosePartButton == null) { - return; - } - - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - MatrixStack matrixStack = drawContext.getMatrices(); - matrixStack.push(); - matrixStack.translate(0, 0, 100); - drawContext.drawTexture(SELECTION_TEXTURE, this.activePosePartButton.getX() - 2, - this.activePosePartButton.getY() - 2, 0, 0, 24, 24, 24, 24 - ); - matrixStack.pop(); - } - - private void setActivePosePart(PosePart part) { + private void setActivePosePart(ButtonWidget button, PosePart part) { this.posePart = part; this.pitchSlider.setPart(part); this.yawSlider.setPart(part); this.rollSlider.setPart(part); - this.posePartLabel.setText( - Text.translatable("armorstands.pose.editing", this.posePart.getDisplayName().getString())); + this.posePartLabel.setText(Text.translatable("armorstands.pose.editing", this.posePart.getDisplayName())); + + if (this.activePosePartButton != null) { + this.activePosePartButton.active = true; + } + this.activePosePartButton = button; + this.activePosePartButton.active = false; } - private static enum SliderRange { + private enum SliderRange { FULL(-180, 180), HALF(-90, 90), TIGHT(-35, 35); private final int min; private final int max; - private SliderRange(int min, int max) { + SliderRange(int min, int max) { this.min = min; this.max = max; } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java index 94ce1d7..ce589c0 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java @@ -41,152 +41,157 @@ public ScreenType getScreenType() { return ScreenType.PRESETS; } - @Override - protected void initStart() { - super.initStart(); - - this.presetButtons.clear(); - } - - @Override - protected void initRight() { - super.initRight(); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.source.label"), this.width - GuiUtil.PADDING, - this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * (GuiUtil.PADDING / 2) - - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2) - ).alignedBottom().justifiedRight().shiftForPadding().build()); - addDrawableChild(CyclingButtonWidget.builder(Source::getDisplayName) - .values(Source.getSources()) - .initially(Source.ALL) - .omitKeyText() - .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, - this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2), CONTROL_WIDTH, CONTROL_HEIGHT, - Text.translatable("armorstands.presets.source.label"), (button, source) -> { - filter(source); - } - )); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.category.label"), this.width - GuiUtil.PADDING, - this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * (GuiUtil.PADDING / 2) - - IconButtonWidget.HEIGHT - ).alignedBottom().justifiedRight().shiftForPadding().build()); - addDrawableChild(CyclingButtonWidget.builder(Category::getDisplayName) - .values(Category.getCategories()) - .initially(Category.ALL) - .omitKeyText() - .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, - this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, CONTROL_WIDTH, CONTROL_HEIGHT, - Text.translatable("armorstands.presets.category.label"), (button, category) -> { - filter(category); - } - )); - - for (int i = BUTTONS_PER_PAGE; i > 0; i--) { - this.presetButtons.add(addDrawableChild(new PresetPoseButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, - this.height - GuiUtil.PADDING - i * CONTROL_HEIGHT - i * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, CONTROL_WIDTH, - CONTROL_HEIGHT - ))); - } - - this.prevPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 12, Text.translatable("armorstands.presets.previous"), - (button) -> previousPage() - )); - this.nextPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - IconButtonWidget.WIDTH, - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 13, Text.translatable("armorstands.presets.next"), - (button) -> nextPage() - )); - - int maxPage = - MathHelper.ceil(PosePreset.getPresets(this.source, this.category).size() / (float) BUTTONS_PER_PAGE) - 1; - this.pageLabel = addLabel( - LabelWidget.builder(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1), - this.width - GuiUtil.PADDING - CONTROL_WIDTH / 2, - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT / 2 - ).alignedMiddle().justifiedCenter().build()); - } - - @Override - protected void initEnd() { - updateFilters(); - } - - @Override - public boolean mouseScrolled( - double mouseX, double mouseY, double horizontalAmount, double verticalAmount - ) { - if (isMouseOverList(mouseX, mouseY)) { - if (verticalAmount < 0) { - nextPage(); - } else { - previousPage(); - } - return true; - } - return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); - } - - private void filter(Source source) { - this.source = source; - updateFilters(); - } - - private void filter(Category category) { - this.category = category; - updateFilters(); - } - - private void updateFilters() { - this.matchingPresets = PosePreset.getPresets(this.source, this.category); - setPage(0); - } - - private void setPage(int page) { - int maxPage = Math.max(0, MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1); - - this.page = page; - List presets = this.matchingPresets.subList(page * BUTTONS_PER_PAGE, - Math.min((page + 1) * BUTTONS_PER_PAGE, this.matchingPresets.size()) - ); - - for (int i = 0; i < BUTTONS_PER_PAGE; i++) { - if (i < presets.size()) { - this.presetButtons.get(i).setPose(presets.get(i)); - this.presetButtons.get(i).visible = true; - } else { - this.presetButtons.get(i).visible = false; - } - } - - if (this.presetButtons.contains(getFocused())) { - setFocused(this.presetButtons.get(0)); - } - - this.prevPageButton.active = this.page > 0; - this.nextPageButton.active = this.page < maxPage; - this.pageLabel.setText(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1)); - } - - private void nextPage() { - int maxPage = MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1; - if (this.page < maxPage) { - setPage(this.page + 1); - } - } - - private void previousPage() { - if (this.page > 0) { - setPage(this.page - 1); - } - } - - private boolean isMouseOverList(double mouseX, double mouseY) { - return mouseX >= this.width - GuiUtil.PADDING - CONTROL_WIDTH && mouseX < this.width - GuiUtil.PADDING && mouseY >= - this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - BUTTONS_PER_PAGE * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 1) * (GuiUtil.PADDING / 2) && mouseY < this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT; - } +// @Override +// protected void initStart() { +// super.initStart(); +// +// this.presetButtons.clear(); +// } +// +// @Override +// protected void initRight() { +// super.initRight(); +// +// // addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.source.label"), this.width - GuiUtil +// // .PADDING, +// // this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * +// // (GuiUtil.PADDING / 2) - +// // IconButtonWidget.HEIGHT - CONTROL_HEIGHT - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2) +// // ).alignedBottom().justifiedRight().shiftForPadding().build()); +// addDrawableChild(CyclingButtonWidget.builder(Source::getDisplayName) +// .values(Source.getSources()) +// .initially(Source.ALL) +// .omitKeyText() +// .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, +// this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - +// (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - +// LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2), CONTROL_WIDTH, CONTROL_HEIGHT, +// Text.translatable("armorstands.presets.source.label"), (button, source) -> { +// filter(source); +// } +// )); +// +// // addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.category.label"), this.width - GuiUtil +// // .PADDING, +// // this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * +// // (GuiUtil.PADDING / 2) - +// // IconButtonWidget.HEIGHT +// // ).alignedBottom().justifiedRight().shiftForPadding().build()); +// addDrawableChild(CyclingButtonWidget.builder(Category::getDisplayName) +// .values(Category.getCategories()) +// .initially(Category.ALL) +// .omitKeyText() +// .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, +// this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - +// (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, CONTROL_WIDTH, CONTROL_HEIGHT, +// Text.translatable("armorstands.presets.category.label"), (button, category) -> { +// filter(category); +// } +// )); +// +// for (int i = BUTTONS_PER_PAGE; i > 0; i--) { +// this.presetButtons.add(addDrawableChild(new PresetPoseButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, +// this.height - GuiUtil.PADDING - i * CONTROL_HEIGHT - i * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, +// CONTROL_WIDTH, CONTROL_HEIGHT +// ))); +// } +// +// this.prevPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, +// this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 12, Text.translatable("armorstands.presets.previous"), +// (button) -> previousPage() +// )); +// this.nextPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - IconButtonWidget.WIDTH, +// this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 13, Text.translatable("armorstands.presets.next"), +// (button) -> nextPage() +// )); +// +// int maxPage = +// MathHelper.ceil(PosePreset.getPresets(this.source, this.category).size() / (float) BUTTONS_PER_PAGE) - 1; +// // this.pageLabel = addLabel( +// // LabelWidget.builder(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1), +// // this.width - GuiUtil.PADDING - CONTROL_WIDTH / 2, +// // this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT / 2 +// // ).alignedMiddle().justifiedCenter().build()); +// } +// +// @Override +// protected void initEnd() { +// updateFilters(); +// } +// +// @Override +// public boolean mouseScrolled( +// double mouseX, double mouseY, double horizontalAmount, double verticalAmount +// ) { +// if (isMouseOverList(mouseX, mouseY)) { +// if (verticalAmount < 0) { +// nextPage(); +// } else { +// previousPage(); +// } +// return true; +// } +// return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); +// } +// +// private void filter(Source source) { +// this.source = source; +// updateFilters(); +// } +// +// private void filter(Category category) { +// this.category = category; +// updateFilters(); +// } +// +// private void updateFilters() { +// this.matchingPresets = PosePreset.getPresets(this.source, this.category); +// setPage(0); +// } +// +// private void setPage(int page) { +// int maxPage = Math.max(0, MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1); +// +// this.page = page; +// List presets = this.matchingPresets.subList(page * BUTTONS_PER_PAGE, +// Math.min((page + 1) * BUTTONS_PER_PAGE, this.matchingPresets.size()) +// ); +// +// for (int i = 0; i < BUTTONS_PER_PAGE; i++) { +// if (i < presets.size()) { +// this.presetButtons.get(i).setPose(presets.get(i)); +// this.presetButtons.get(i).visible = true; +// } else { +// this.presetButtons.get(i).visible = false; +// } +// } +// +// if (this.presetButtons.contains(getFocused())) { +// setFocused(this.presetButtons.get(0)); +// } +// +// this.prevPageButton.active = this.page > 0; +// this.nextPageButton.active = this.page < maxPage; +// // this.pageLabel.setText(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1)); +// } +// +// private void nextPage() { +// int maxPage = MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1; +// if (this.page < maxPage) { +// setPage(this.page + 1); +// } +// } +// +// private void previousPage() { +// if (this.page > 0) { +// setPage(this.page - 1); +// } +// } +// +// private boolean isMouseOverList(double mouseX, double mouseY) { +// return mouseX >= this.width - GuiUtil.PADDING - CONTROL_WIDTH && mouseX < this.width - GuiUtil.PADDING && mouseY >= +// this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - BUTTONS_PER_PAGE * CONTROL_HEIGHT - +// (BUTTONS_PER_PAGE + 1) * (GuiUtil.PADDING / 2) && +// mouseY < this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT; +// } } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java index f1579bb..39facc1 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java @@ -41,207 +41,207 @@ public ScreenType getScreenType() { return ScreenType.ROTATE; } - @Override - protected void initLeft() { - super.initLeft(); - - initCurrentStatus(); - initSnapButtons(); - initFaceButtons(); - } - - private void initCurrentStatus() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.player"), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.playerFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.client.player), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 2 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.playerRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.client.player), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 3 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.standFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.armorStand), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.standRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.armorStand), GuiUtil.PADDING, - GuiUtil.PADDING + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - } - - private void initSnapButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.snap"), GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 4 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING - ).shiftForPadding().justifiedLeft().alignedBottom().build()); - - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.SOUTH.getName()), - (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.SOUTH.asRotation())) - ) - .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING - ) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.NORTH.getName()), - (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.NORTH.asRotation())) - ) - .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), - this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING - ) - .build()); - - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.EAST.getName()), - (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.EAST.asRotation())) - ) - .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING - ) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.WEST.getName()), - (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.WEST.asRotation())) - ) - .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), - this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING - ) - .build()); - } - - private void initFaceButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.face"), GuiUtil.PADDING, - this.height - GuiUtil.PADDING - BUTTON_HEIGHT - (GuiUtil.PADDING / 2) - ).shiftForPadding().justifiedLeft().alignedBottom().build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.toward"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_TOWARD) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.away"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_AWAY) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.with"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_WITH) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + 2 * (BUTTON_WIDTH + (GuiUtil.PADDING / 2)), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .build()); - } - - @Override - protected void initRight() { - super.initRight(); - - addRowOfButtons(RotateDirection.CLOCKWISE, 1); - addRowOfButtons(RotateDirection.COUNTERCLOCKWISE, 0); - - this.rotateSlider = addDrawableChild(new RotateSliderWidget(this, this.width - GuiUtil.PADDING - SLIDER_WIDTH, - this.height - GuiUtil.PADDING - SLIDER_HEIGHT, SLIDER_WIDTH, SLIDER_HEIGHT, this.armorStand - )); - } - - private void addRowOfButtons(RotateDirection direction, int index) { - int refX = this.width - GuiUtil.PADDING - MINI_BUTTON_WIDTH; - int refY = this.height - GuiUtil.PADDING - SLIDER_HEIGHT - 2 * (GuiUtil.PADDING / 2) - MINI_BUTTON_HEIGHT - - index * (2 * (GuiUtil.PADDING / 2) + MINI_BUTTON_HEIGHT + LabelWidget.HEIGHT_WITH_PADDING); - String modifier = direction.equals(RotateDirection.CLOCKWISE) ? "+" : "-"; - - addLabel(LabelWidget.builder(direction.getLabel(), this.width - GuiUtil.PADDING, refY - (GuiUtil.PADDING / 2)) - .justifiedRight() - .alignedBottom() - .shiftForPadding() - .build()); - addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "1"), - (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset()) - ) - .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - 3 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) - .build()); - addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "5"), - (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 5) - ) - .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - 2 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) - .build()); - addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "15"), - (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 15) - ) - .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) - .build()); - addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "45"), - (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 45) - ) - .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX, refY) - .build()); - } - - @Override - public void handledScreenTick() { - super.handledScreenTick(); - - this.playerFacingLabel.setText(getCurrentFacingText(this.client.player)); - this.playerRotationLabel.setText(getCurrentRotationText(this.client.player)); - this.standFacingLabel.setText(getCurrentFacingText(this.armorStand)); - this.standRotationLabel.setText(getCurrentRotationText(this.armorStand)); - this.rotateSlider.tick(); - } - - @Override - public void updateYawOnClient(float yaw) { - if (this.rotateSlider != null && this.rotateSlider.isPending(this)) { - return; - } - - super.updateYawOnClient(yaw); - - if (this.rotateSlider != null) { - this.rotateSlider.setAngle(yaw); - } - } - - @Override - public void onPong() { - super.onPong(); - - if (this.rotateSlider != null) { - this.rotateSlider.onPong(); - } - } - - private Text getCurrentFacingText(Entity entity) { - float currentRotation = entity.getYaw(); - Direction currentFacing = Direction.fromRotation(currentRotation); - String towardsI18n = switch (currentFacing) { - case NORTH -> "negZ"; - case SOUTH -> "posZ"; - case WEST -> "negX"; - case EAST -> "posX"; - default -> "posX"; - }; - Text towards = Text.translatable("armorstands.current.facing." + towardsI18n); - return Text.translatable("armorstands.current.facing", currentFacing.toString(), towards.getString()); - } - - private Text getCurrentRotationText(Entity entity) { - float currentRotation = entity.getYaw(); - return Text.translatable("armorstands.current.rotation", - String.format(Locale.ROOT, "%.1f", MathHelper.wrapDegrees(currentRotation)) - ); - } +// @Override +// protected void initLeft() { +// super.initLeft(); +// +// initCurrentStatus(); +// initSnapButtons(); +// initFaceButtons(); +// } +// +// private void initCurrentStatus() { +//// addLabel(LabelWidget.builder(Text.translatable("armorstands.current.player"), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +//// +//// this.playerFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.client.player), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + 2 * LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +//// +//// this.playerRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.client.player), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + 3 * LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +//// +//// addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +//// +//// this.standFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.armorStand), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +//// +//// this.standRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.armorStand), GuiUtil.PADDING, +//// GuiUtil.PADDING + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING +//// ).alignedTop().justifiedLeft().shiftForPadding().build()); +// } +// +// private void initSnapButtons() { +//// addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.snap"), GuiUtil.PADDING, +//// this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 4 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING +//// ).shiftForPadding().justifiedLeft().alignedBottom().build()); +// +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.SOUTH.getName()), +// (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.SOUTH.asRotation())) +// ) +// .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, +// this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING +// ) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.NORTH.getName()), +// (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.NORTH.asRotation())) +// ) +// .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), +// this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING +// ) +// .build()); +// +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.EAST.getName()), +// (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.EAST.asRotation())) +// ) +// .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, +// this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING +// ) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.WEST.getName()), +// (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.WEST.asRotation())) +// ) +// .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), +// this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING +// ) +// .build()); +// } +// +// private void initFaceButtons() { +//// addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.face"), GuiUtil.PADDING, +//// this.height - GuiUtil.PADDING - BUTTON_HEIGHT - (GuiUtil.PADDING / 2) +//// ).shiftForPadding().justifiedLeft().alignedBottom().build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.toward"), +// (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_TOWARD) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.away"), +// (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_AWAY) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.with"), +// (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_WITH) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + 2 * (BUTTON_WIDTH + (GuiUtil.PADDING / 2)), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) +// .build()); +// } +// +// @Override +// protected void initRight() { +// super.initRight(); +// +// addRowOfButtons(RotateDirection.CLOCKWISE, 1); +// addRowOfButtons(RotateDirection.COUNTERCLOCKWISE, 0); +// +// this.rotateSlider = addDrawableChild(new RotateSliderWidget(this, this.width - GuiUtil.PADDING - SLIDER_WIDTH, +// this.height - GuiUtil.PADDING - SLIDER_HEIGHT, SLIDER_WIDTH, SLIDER_HEIGHT, this.armorStand +// )); +// } +// +// private void addRowOfButtons(RotateDirection direction, int index) { +// int refX = this.width - GuiUtil.PADDING - MINI_BUTTON_WIDTH; +// int refY = this.height - GuiUtil.PADDING - SLIDER_HEIGHT - 2 * (GuiUtil.PADDING / 2) - MINI_BUTTON_HEIGHT - +// index * (2 * (GuiUtil.PADDING / 2) + MINI_BUTTON_HEIGHT + LabelWidget.HEIGHT_WITH_PADDING); +// String modifier = direction.equals(RotateDirection.CLOCKWISE) ? "+" : "-"; +// +//// addLabel(LabelWidget.builder(direction.getLabel(), this.width - GuiUtil.PADDING, refY - (GuiUtil.PADDING / 2)) +//// .justifiedRight() +//// .alignedBottom() +//// .shiftForPadding() +//// .build()); +// addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "1"), +// (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset()) +// ) +// .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) +// .position(refX - 3 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "5"), +// (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 5) +// ) +// .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) +// .position(refX - 2 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "15"), +// (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 15) +// ) +// .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) +// .position(refX - ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "45"), +// (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 45) +// ) +// .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) +// .position(refX, refY) +// .build()); +// } +// +// @Override +// public void handledScreenTick() { +// super.handledScreenTick(); +// +//// this.playerFacingLabel.setText(getCurrentFacingText(this.client.player)); +//// this.playerRotationLabel.setText(getCurrentRotationText(this.client.player)); +//// this.standFacingLabel.setText(getCurrentFacingText(this.armorStand)); +//// this.standRotationLabel.setText(getCurrentRotationText(this.armorStand)); +// this.rotateSlider.tick(); +// } +// +// @Override +// public void updateYawOnClient(float yaw) { +// if (this.rotateSlider != null && this.rotateSlider.isPending(this)) { +// return; +// } +// +// super.updateYawOnClient(yaw); +// +// if (this.rotateSlider != null) { +// this.rotateSlider.setAngle(yaw); +// } +// } +// +// @Override +// public void onPong() { +// super.onPong(); +// +// if (this.rotateSlider != null) { +// this.rotateSlider.onPong(); +// } +// } +// +// private Text getCurrentFacingText(Entity entity) { +// float currentRotation = entity.getYaw(); +// Direction currentFacing = Direction.fromRotation(currentRotation); +// String towardsI18n = switch (currentFacing) { +// case NORTH -> "negZ"; +// case SOUTH -> "posZ"; +// case WEST -> "negX"; +// case EAST -> "posX"; +// default -> "posX"; +// }; +// Text towards = Text.translatable("armorstands.current.facing." + towardsI18n); +// return Text.translatable("armorstands.current.facing", currentFacing.toString(), towards.getString()); +// } +// +// private Text getCurrentRotationText(Entity entity) { +// float currentRotation = entity.getYaw(); +// return Text.translatable("armorstands.current.rotation", +// String.format(Locale.ROOT, "%.1f", MathHelper.wrapDegrees(currentRotation)) +// ); +// } public enum RotateDirection { CLOCKWISE(1, "armorstands.rotate.clockwise"), COUNTERCLOCKWISE(-1, "armorstands.rotate.counter"); diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java index 93975b9..d058310 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java @@ -34,112 +34,112 @@ public ScreenType getScreenType() { return ScreenType.UTILITIES; } - @Override - protected void initStart() { - super.initStart(); - - listeners.clear(); - refreshFlags(); - } - - @Override - protected void initLeft() { - super.initLeft(); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.utility.setup"), GuiUtil.PADDING, - this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - ).alignedBottom().justifiedLeft().shiftForPadding().build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.prepare"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PREPARE) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2)) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.prepare.tooltip"))) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.toolRack"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.TOOL_RACK) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), - this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - ) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.toolRack.tooltip"))) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.uprightItem"), - (button) -> ClientNetworking.sendUtilityActionPacket( - UtilityAction.UPRIGHT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2)) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.uprightItem.tooltip"))) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.flatItem"), - (button) -> ClientNetworking.sendUtilityActionPacket( - UtilityAction.FLAT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), - this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2) - ) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.flatItem.tooltip"))) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.block"), - (button) -> ClientNetworking.sendUtilityActionPacket( - UtilityAction.BLOCK.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.block.tooltip"))) - .build()); - addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.tool"), - (button) -> ClientNetworking.sendUtilityActionPacket( - UtilityAction.TOOL.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) - ) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) - .tooltip(Tooltip.of(Text.translatable("armorstands.utility.tool.tooltip"))) - .build()); - } - - @Override - protected void initRight() { - super.initRight(); - - List flags = ArmorStandFlag.getFlags(); - for (int i = flags.size() - 1; i >= 0; i--) { - addFlagToggleWidget(flags.get(flags.size() - i - 1), i); - } - } - - @Override - public void handledScreenTick() { - super.handledScreenTick(); - - refreshFlags(); - } - - private void refreshFlags() { - Arrays.stream(ArmorStandFlag.values()).forEach((flag) -> { - Consumer listener = listeners.getOrDefault(flag, (value) -> { - }); - - boolean curr = flag.getValue(this.armorStand); - boolean prev = currentValues.getOrDefault(flag, !curr); - - if (curr != prev) { - currentValues.put(flag, curr); - listener.accept(curr); - } - }); - } - - private void addFlagToggleWidget(ArmorStandFlag flag, int index) { - int xPos = this.width - GuiUtil.PADDING; - int yPos = this.height - (index + 1) * (GuiUtil.PADDING + FlagToggleWidget.WIDGET_HEIGHT); - - FlagToggleWidget widget = new FlagToggleWidget(this.textRenderer, flag, this.currentValues.get(flag), xPos, yPos); - - addDrawableChild(widget); - listeners.put(flag, widget::setValue); - } +// @Override +// protected void initStart() { +// super.initStart(); +// +// listeners.clear(); +// refreshFlags(); +// } +// +// @Override +// protected void initLeft() { +// super.initLeft(); +// +//// addLabel(LabelWidget.builder(Text.translatable("armorstands.utility.setup"), GuiUtil.PADDING, +//// this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) +//// ).alignedBottom().justifiedLeft().shiftForPadding().build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.prepare"), +// (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PREPARE) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2)) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.prepare.tooltip"))) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.toolRack"), +// (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.TOOL_RACK) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), +// this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) +// ) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.toolRack.tooltip"))) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.uprightItem"), +// (button) -> ClientNetworking.sendUtilityActionPacket( +// UtilityAction.UPRIGHT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2)) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.uprightItem.tooltip"))) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.flatItem"), +// (button) -> ClientNetworking.sendUtilityActionPacket( +// UtilityAction.FLAT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), +// this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2) +// ) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.flatItem.tooltip"))) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.block"), +// (button) -> ClientNetworking.sendUtilityActionPacket( +// UtilityAction.BLOCK.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.block.tooltip"))) +// .build()); +// addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.tool"), +// (button) -> ClientNetworking.sendUtilityActionPacket( +// UtilityAction.TOOL.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) +// ) +// .size(BUTTON_WIDTH, BUTTON_HEIGHT) +// .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) +// .tooltip(Tooltip.of(Text.translatable("armorstands.utility.tool.tooltip"))) +// .build()); +// } +// +// @Override +// protected void initRight() { +// super.initRight(); +// +// List flags = ArmorStandFlag.getFlags(); +// for (int i = flags.size() - 1; i >= 0; i--) { +// addFlagToggleWidget(flags.get(flags.size() - i - 1), i); +// } +// } +// +// @Override +// public void handledScreenTick() { +// super.handledScreenTick(); +// +// refreshFlags(); +// } +// +// private void refreshFlags() { +// Arrays.stream(ArmorStandFlag.values()).forEach((flag) -> { +// Consumer listener = listeners.getOrDefault(flag, (value) -> { +// }); +// +// boolean curr = flag.getValue(this.armorStand); +// boolean prev = currentValues.getOrDefault(flag, !curr); +// +// if (curr != prev) { +// currentValues.put(flag, curr); +// listener.accept(curr); +// } +// }); +// } +// +// private void addFlagToggleWidget(ArmorStandFlag flag, int index) { +// int xPos = this.width - GuiUtil.PADDING; +// int yPos = this.height - (index + 1) * (GuiUtil.PADDING + FlagToggleWidget.WIDGET_HEIGHT); +// +// FlagToggleWidget widget = new FlagToggleWidget(this.textRenderer, flag, this.currentValues.get(flag), xPos, yPos); +// +// addDrawableChild(widget); +// listeners.put(flag, widget::setValue); +// } } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/widget/AdjustPoseSliderWidget.java b/src/main/java/me/roundaround/armorstands/client/gui/widget/AdjustPoseSliderWidget.java index 02ab2b8..c9dbff6 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/widget/AdjustPoseSliderWidget.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/widget/AdjustPoseSliderWidget.java @@ -25,9 +25,9 @@ public class AdjustPoseSliderWidget extends SliderWidget { private Optional lastScroll = Optional.empty(); public AdjustPoseSliderWidget( - int x, int y, int width, int height, PosePart part, EulerAngleParameter parameter, ArmorStandEntity armorStand + int width, int height, PosePart part, EulerAngleParameter parameter, ArmorStandEntity armorStand ) { - super(x, y, width, height, Text.empty(), 0); + super(0, 0, width, height, Text.empty(), 0); this.part = part; this.parameter = parameter; diff --git a/src/main/java/me/roundaround/armorstands/client/gui/widget/ArmorStandLayoutWidget.java b/src/main/java/me/roundaround/armorstands/client/gui/widget/ArmorStandLayoutWidget.java new file mode 100644 index 0000000..a566729 --- /dev/null +++ b/src/main/java/me/roundaround/armorstands/client/gui/widget/ArmorStandLayoutWidget.java @@ -0,0 +1,58 @@ +package me.roundaround.armorstands.client.gui.widget; + +import me.roundaround.roundalib.client.gui.GuiUtil; +import me.roundaround.roundalib.client.gui.widget.layout.LinearLayoutWidget; +import me.roundaround.roundalib.client.gui.widget.layout.SizableLayoutWidget; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.Widget; + +import java.util.function.Consumer; + +@Environment(EnvType.CLIENT) +public class ArmorStandLayoutWidget extends SizableLayoutWidget { + public final LinearLayoutWidget topLeft; + public final LinearLayoutWidget bottomLeft; + public final LinearLayoutWidget navRow; + public final LinearLayoutWidget topRight; + public final LinearLayoutWidget bottomRight; + + private final Screen screen; + + public ArmorStandLayoutWidget(Screen screen) { + super(0, 0, screen.width, screen.height); + + this.screen = screen; + + this.topLeft = LinearLayoutWidget.vertical().spacing(GuiUtil.PADDING / 2).alignLeft().alignTop(); + this.bottomLeft = LinearLayoutWidget.vertical().spacing(GuiUtil.PADDING / 2).alignLeft().alignBottom(); + this.navRow = LinearLayoutWidget.horizontal().alignCenterX().alignBottom(); + this.topRight = LinearLayoutWidget.vertical().spacing(GuiUtil.PADDING / 2).alignRight().alignTop(); + this.bottomRight = LinearLayoutWidget.vertical().spacing(GuiUtil.PADDING / 2).alignRight().alignBottom(); + } + + @Override + public void forEachElement(Consumer consumer) { + this.topLeft.forEachElement(consumer); + this.bottomLeft.forEachElement(consumer); + this.navRow.forEachElement(consumer); + this.topRight.forEachElement(consumer); + this.bottomRight.forEachElement(consumer); + } + + @Override + public void refreshPositions() { + this.topLeft.setPosition(GuiUtil.PADDING, GuiUtil.PADDING); + this.bottomLeft.setPosition(GuiUtil.PADDING, this.screen.height - GuiUtil.PADDING); + this.navRow.setPosition(this.screen.width / 2, this.screen.height - 1); + this.topRight.setPosition(this.screen.width - GuiUtil.PADDING, GuiUtil.PADDING); + this.bottomRight.setPosition(this.screen.width - GuiUtil.PADDING, this.screen.height - GuiUtil.PADDING); + + this.topLeft.refreshPositions(); + this.bottomLeft.refreshPositions(); + this.navRow.refreshPositions(); + this.topRight.refreshPositions(); + this.bottomRight.refreshPositions(); + } +} diff --git a/src/main/java/me/roundaround/armorstands/client/gui/widget/FlagToggleWidget.java b/src/main/java/me/roundaround/armorstands/client/gui/widget/FlagToggleWidget.java index 65a1e58..6e52a46 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/widget/FlagToggleWidget.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/widget/FlagToggleWidget.java @@ -29,7 +29,7 @@ public class FlagToggleWidget extends PressableWidget { public FlagToggleWidget( TextRenderer textRenderer, ArmorStandFlag flag, boolean initialValue, int x, int y ) { - super(x, y, 100, WIDGET_HEIGHT, flag.getDisplayName()); + super(0, 0, 100, WIDGET_HEIGHT, flag.getDisplayName()); this.flag = flag; this.inverted = flag.invertControl(); diff --git a/src/main/java/me/roundaround/armorstands/client/gui/widget/MoveButtonWidget.java b/src/main/java/me/roundaround/armorstands/client/gui/widget/MoveButtonWidget.java deleted file mode 100644 index 06a35a0..0000000 --- a/src/main/java/me/roundaround/armorstands/client/gui/widget/MoveButtonWidget.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.roundaround.armorstands.client.gui.widget; - -import me.roundaround.armorstands.client.network.ClientNetworking; -import me.roundaround.armorstands.util.MoveMode; -import me.roundaround.armorstands.util.MoveUnits; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; -import net.minecraft.util.math.Direction; - -public class MoveButtonWidget extends ButtonWidget { - public final Direction direction; - public final int amount; - - private MoveMode mode = MoveMode.RELATIVE; - private MoveUnits units = MoveUnits.PIXELS; - - public MoveButtonWidget( - int x, int y, int width, int height, Direction direction, int amount, MoveMode mode, MoveUnits units - ) { - super(x, y, width, height, getText(amount, units), (rawButton) -> { - MoveButtonWidget button = (MoveButtonWidget) rawButton; - ClientNetworking.sendAdjustPosPacket(button.direction, button.amount, button.mode, button.units); - }, ButtonWidget.DEFAULT_NARRATION_SUPPLIER); - - this.direction = direction; - this.amount = amount; - this.mode = mode; - this.units = units; - } - - public void setMode(MoveMode mode) { - this.mode = mode; - setUnits(this.mode.getDefaultUnits()); - } - - public void setUnits(MoveUnits units) { - this.units = units; - setMessage(getText(this.amount, this.units)); - } - - public static Text getText(int amount, MoveUnits units) { - return units.getButtonText(amount); - } - - public static Text getDirectionText(Direction direction, MoveMode mode) { - return mode.getDirectionText(direction); - } -} diff --git a/src/main/java/me/roundaround/armorstands/client/gui/widget/NavigationButtonWidget.java b/src/main/java/me/roundaround/armorstands/client/gui/widget/NavigationButtonWidget.java deleted file mode 100644 index d695303..0000000 --- a/src/main/java/me/roundaround/armorstands/client/gui/widget/NavigationButtonWidget.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.roundaround.armorstands.client.gui.widget; - -import me.roundaround.armorstands.client.gui.screen.AbstractArmorStandScreen; -import me.roundaround.armorstands.client.network.ClientNetworking; -import me.roundaround.armorstands.network.ScreenType; - -public class NavigationButtonWidget extends IconButtonWidget { - private final ScreenType screenType; - private final boolean clickable; - - public NavigationButtonWidget( - AbstractArmorStandScreen parent, int x, int y, ScreenType screenType - ) { - super(x, y, screenType.getUIndex(), screenType.getDisplayName(), (button) -> { - if (parent.getScreenType() == screenType) { - return; - } - - ClientNetworking.sendRequestScreenPacket(parent.getArmorStand(), screenType); - }); - - this.screenType = screenType; - this.clickable = parent.getScreenType() != screenType; - this.active = clickable; - } - - public ScreenType getScreenType() { - return this.screenType; - } - - public boolean isMouseOverIgnoreState(double mouseX, double mouseY) { - return mouseX >= this.getX() && mouseY >= this.getY() && mouseX < (this.getX() + this.width) && - mouseY < (this.getY() + this.height); - } - - @Override - public boolean isHovered() { - return this.clickable && super.isHovered(); - } -} diff --git a/src/main/java/me/roundaround/armorstands/network/ScreenType.java b/src/main/java/me/roundaround/armorstands/network/ScreenType.java index 241229e..f109a94 100644 --- a/src/main/java/me/roundaround/armorstands/network/ScreenType.java +++ b/src/main/java/me/roundaround/armorstands/network/ScreenType.java @@ -1,6 +1,9 @@ package me.roundaround.armorstands.network; import io.netty.buffer.ByteBuf; +import me.roundaround.roundalib.asset.icon.BuiltinIcon; +import me.roundaround.roundalib.asset.icon.CustomIcon; +import me.roundaround.roundalib.asset.icon.Icon; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.Text; @@ -10,12 +13,12 @@ import java.util.function.IntFunction; public enum ScreenType { - UTILITIES(0, "utilities"), - MOVE(1, "move"), - ROTATE(2, "rotate"), - POSE(3, "pose"), - PRESETS(4, "presets"), - INVENTORY(5, "inventory"); + UTILITIES(0, "utilities", new CustomIcon("flag", 20)), + MOVE(1, "move", BuiltinIcon.MOVE_18), + ROTATE(2, "rotate", BuiltinIcon.ROTATE_18), + POSE(3, "pose", BuiltinIcon.SLIDERS_18), + PRESETS(4, "presets", new CustomIcon("pose", 20)), + INVENTORY(5, "inventory", new CustomIcon("inventory", 20)); public static final IntFunction ID_TO_VALUE_FUNCTION = ValueLists.createIdToValueFunction( ScreenType::getId, values(), ValueLists.OutOfBoundsHandling.ZERO); @@ -24,10 +27,12 @@ public enum ScreenType { private final int id; private final String name; + private final Icon icon; - ScreenType(int id, String name) { + ScreenType(int id, String name, Icon icon) { this.id = id; this.name = name; + this.icon = icon; } public int getId() { @@ -38,8 +43,8 @@ public String getName() { return this.name; } - public int getUIndex() { - return this.id; + public Icon getIcon() { + return this.icon; } public Text getDisplayName() { diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/body.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/body.png new file mode 100644 index 0000000..795cd01 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/body.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/copy.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/copy.png new file mode 100644 index 0000000..71b8e7e Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/copy.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/flag.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/flag.png new file mode 100644 index 0000000..a3966f3 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/flag.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/head.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/head.png new file mode 100644 index 0000000..20113da Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/head.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/inventory.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/inventory.png new file mode 100644 index 0000000..1f21896 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/inventory.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftarm.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftarm.png new file mode 100644 index 0000000..07c169a Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftarm.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftleg.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftleg.png new file mode 100644 index 0000000..1e95429 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/leftleg.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/paste.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/paste.png new file mode 100644 index 0000000..7758b5a Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/paste.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/pose.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/pose.png new file mode 100644 index 0000000..ed78afa Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/pose.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightarm.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightarm.png new file mode 100644 index 0000000..5236a8e Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightarm.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightleg.png b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightleg.png new file mode 100644 index 0000000..68eab05 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/icon/rightleg.png differ diff --git a/src/main/resources/assets/armorstands/textures/gui/sprites/selection.png b/src/main/resources/assets/armorstands/textures/gui/sprites/selection.png new file mode 100644 index 0000000..457ce25 Binary files /dev/null and b/src/main/resources/assets/armorstands/textures/gui/sprites/selection.png differ