diff --git a/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideApi.java b/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideApi.java index 4b20bf9..7c55088 100644 --- a/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideApi.java +++ b/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideApi.java @@ -1,5 +1,6 @@ package dev.isxander.controlify.api.buttonguide; +import dev.isxander.controlify.api.bind.BindingSupplier; import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.gui.ButtonGuideRenderer; @@ -19,16 +20,34 @@ public final class ButtonGuideApi { * Custom behaviour should be handled inside a {@link dev.isxander.controlify.screenop.ScreenProcessor} or {@link dev.isxander.controlify.screenop.ComponentProcessor} * * @param button button to render the guide for - * @param binding gets the binding to render + * @param binding the custom binding to render * @param position where the guide should be rendered relative to the button * @param renderPredicate whether the guide should be rendered */ public static void addGuideToButton( T button, - Function, ControllerBinding> binding, + BindingSupplier binding, ButtonRenderPosition position, ButtonGuidePredicate renderPredicate) { ButtonGuideRenderer.registerBindingForButton(button, binding, position, renderPredicate); } + + /** + * Makes the button render the image of the binding specified. + * This does not invoke the button press on binding trigger, only renders the guide. + * Custom behaviour should be handled inside a {@link dev.isxander.controlify.screenop.ScreenProcessor} or {@link dev.isxander.controlify.screenop.ComponentProcessor} + * + * @param button button to render the guide for + * @param binding gets the binding to render + * @param position where the guide should be rendered relative to the button + * @param renderPredicate whether the guide should be rendered + */ + public static void addGuideToButtonBuiltin( + T button, + Function, ControllerBinding> binding, + ButtonRenderPosition position, + ButtonGuidePredicate renderPredicate) { + ButtonGuideRenderer.registerBindingForButton(button, controller -> binding.apply(controller.bindings()), position, renderPredicate); + } } diff --git a/src/main/java/dev/isxander/controlify/gui/ButtonGuideRenderer.java b/src/main/java/dev/isxander/controlify/gui/ButtonGuideRenderer.java index 01c5179..6adcc2b 100644 --- a/src/main/java/dev/isxander/controlify/gui/ButtonGuideRenderer.java +++ b/src/main/java/dev/isxander/controlify/gui/ButtonGuideRenderer.java @@ -1,23 +1,20 @@ package dev.isxander.controlify.gui; -import dev.isxander.controlify.api.bind.ControllerBinding; +import dev.isxander.controlify.api.bind.BindingSupplier; import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate; import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition; -import dev.isxander.controlify.bindings.ControllerBindings; import net.minecraft.client.gui.components.AbstractButton; -import java.util.function.Function; - /** * @see dev.isxander.controlify.mixins.feature.guide.screen.AbstractButtonMixin */ public interface ButtonGuideRenderer { void setButtonGuide(RenderData renderData); - static void registerBindingForButton(T button, Function, ControllerBinding> binding, ButtonRenderPosition position, ButtonGuidePredicate renderPredicate) { + static void registerBindingForButton(T button, BindingSupplier binding, ButtonRenderPosition position, ButtonGuidePredicate renderPredicate) { ((ButtonGuideRenderer) button).setButtonGuide(new RenderData<>(binding, position, renderPredicate)); } - record RenderData(Function, ControllerBinding> binding, ButtonRenderPosition position, ButtonGuidePredicate renderPredicate) { + record RenderData(BindingSupplier binding, ButtonRenderPosition position, ButtonGuidePredicate renderPredicate) { } } diff --git a/src/main/java/dev/isxander/controlify/gui/screen/ControllerCarouselScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/ControllerCarouselScreen.java index 28bd5df..5403917 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/ControllerCarouselScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/ControllerCarouselScreen.java @@ -90,8 +90,8 @@ public class ControllerCarouselScreen extends Screen implements ScreenController grid.arrangeElements(); FrameLayout.centerInRectangle(grid, 0, this.height - 36, this.width, 36); - ButtonGuideApi.addGuideToButton(globalSettingsButton, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); - ButtonGuideApi.addGuideToButton(doneButton, bindings -> bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin(globalSettingsButton, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin(doneButton, bindings -> bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); } public void refreshControllers() { diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/yacl/YACLScreenCategoryTabMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/yacl/YACLScreenCategoryTabMixin.java index 3e25fe7..b56c908 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/yacl/YACLScreenCategoryTabMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/compat/yacl/YACLScreenCategoryTabMixin.java @@ -19,6 +19,6 @@ public class YACLScreenCategoryTabMixin { @Inject(method = "", at = @At("RETURN")) private void onConstructCategory(YACLScreen this$0, ConfigCategory category, CallbackInfo ci) { - ButtonGuideApi.addGuideToButton(saveFinishedButton, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin(saveFinishedButton, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractButtonMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractButtonMixin.java index 22512a4..5b7cdd9 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractButtonMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractButtonMixin.java @@ -68,11 +68,11 @@ public abstract class AbstractButtonMixin extends AbstractWidgetMixin implements && this.isActive() && Controlify.instance().currentInputMode().isController() && Controlify.instance().getCurrentController().map(c -> c.config().showScreenGuide).orElse(false) - && !renderData.binding().apply(Controlify.instance().currentController().bindings()).isUnbound() + && !renderData.binding().onController(Controlify.instance().getCurrentController().orElseThrow()).isUnbound() && renderData.renderPredicate().shouldDisplay((AbstractButton) (Object) this); } private BindRenderer getBind() { - return renderData.binding().apply(Controlify.instance().currentController().bindings()).renderer(); + return renderData.binding().onController(Controlify.instance().getCurrentController().orElseThrow()).renderer(); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java index 658835c..60e064e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java @@ -1,8 +1,8 @@ package dev.isxander.controlify.mixins.feature.screenop.vanilla; +import dev.isxander.controlify.api.buttonguide.ButtonGuideApi; import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate; import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition; -import dev.isxander.controlify.gui.ButtonGuideRenderer; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.CreateWorldScreenProcessor; @@ -19,17 +19,28 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; public abstract class CreateWorldScreenMixin implements ScreenProcessorProvider { @Shadow protected abstract void onCreate(); - @Unique private final ScreenProcessor processor = new CreateWorldScreenProcessor((CreateWorldScreen) (Object) this, this::onCreate); + @Unique private final ScreenProcessor processor + = new CreateWorldScreenProcessor((CreateWorldScreen) (Object) this, this::onCreate); @ModifyArg(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/layouts/GridLayout$RowHelper;addChild(Lnet/minecraft/client/gui/layouts/LayoutElement;)Lnet/minecraft/client/gui/layouts/LayoutElement;", ordinal = 1)) private LayoutElement modifyCancelButton(LayoutElement button) { - ButtonGuideRenderer.registerBindingForButton((AbstractButton) button, bindings -> bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin( + (AbstractButton) button, + bindings -> bindings.GUI_BACK, + ButtonRenderPosition.TEXT, + ButtonGuidePredicate.ALWAYS + ); return button; } @ModifyArg(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/layouts/GridLayout$RowHelper;addChild(Lnet/minecraft/client/gui/layouts/LayoutElement;)Lnet/minecraft/client/gui/layouts/LayoutElement;", ordinal = 0)) private LayoutElement modifyCreateButton(LayoutElement button) { - ButtonGuideRenderer.registerBindingForButton((AbstractButton) button, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin( + (AbstractButton) button, + bindings -> bindings.GUI_ABSTRACT_ACTION_1, + ButtonRenderPosition.TEXT, + ButtonGuidePredicate.ALWAYS + ); return button; } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java index 9917e29..fb819b6 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java @@ -1,8 +1,8 @@ package dev.isxander.controlify.mixins.feature.screenop.vanilla; +import dev.isxander.controlify.api.buttonguide.ButtonGuideApi; import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate; import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition; -import dev.isxander.controlify.gui.ButtonGuideRenderer; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.SelectWorldScreenProcessor; @@ -25,13 +25,23 @@ public class SelectWorldScreenMixin implements ScreenProcessorProvider { @ModifyArg(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/SelectWorldScreen;addRenderableWidget(Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;", ordinal = 5)) private T modifyCancelButton(T button) { - ButtonGuideRenderer.registerBindingForButton((AbstractButton) button, bindings -> bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin( + (AbstractButton) button, + bindings -> bindings.GUI_BACK, + ButtonRenderPosition.TEXT, + ButtonGuidePredicate.ALWAYS + ); return button; } @ModifyArg(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/SelectWorldScreen;addRenderableWidget(Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;", ordinal = 1)) private T modifyCreateButton(T button) { - ButtonGuideRenderer.registerBindingForButton((AbstractButton) button, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + ButtonGuideApi.addGuideToButtonBuiltin( + (AbstractButton) button, + bindings -> bindings.GUI_ABSTRACT_ACTION_1, + ButtonRenderPosition.TEXT, + ButtonGuidePredicate.ALWAYS + ); return button; } } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java index 8599172..227f76a 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java @@ -36,19 +36,19 @@ public class PauseScreenProcessor extends ScreenProcessor { public void onWidgetRebuild() { super.onWidgetRebuild(); - ButtonGuideApi.addGuideToButton( + ButtonGuideApi.addGuideToButtonBuiltin( (AbstractButton) getWidget("menu.returnToGame").orElseThrow(), bindings -> bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS ); - ButtonGuideApi.addGuideToButton( + ButtonGuideApi.addGuideToButtonBuiltin( (AbstractButton) getWidget("menu.options").orElseThrow(), bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS ); - ButtonGuideApi.addGuideToButton( + ButtonGuideApi.addGuideToButtonBuiltin( disconnectButtonSupplier.get(), bindings -> bindings.GUI_ABSTRACT_ACTION_2, ButtonRenderPosition.TEXT, diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java index de335c6..923897c 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java @@ -34,13 +34,13 @@ public class TitleScreenProcessor extends ScreenProcessor { super.onWidgetRebuild(); AbstractButton quitButton = (AbstractButton) getWidget("menu.quit").orElseThrow(); - ButtonGuideApi.addGuideToButton( + ButtonGuideApi.addGuideToButtonBuiltin( quitButton, bindings -> quitButton.isFocused() ? bindings.GUI_PRESS : bindings.GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS ); - ButtonGuideApi.addGuideToButton( + ButtonGuideApi.addGuideToButtonBuiltin( (AbstractButton) getWidget("menu.options").orElseThrow(), bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT,