1
0
forked from Clones/Controlify

🧹 Minor cleanup to the button guide api

This commit is contained in:
isXander
2023-06-26 17:42:05 +01:00
parent e524631438
commit 245ebb7edd
9 changed files with 62 additions and 25 deletions

View File

@ -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 <T extends AbstractButton> void addGuideToButton(
T button,
Function<ControllerBindings<?>, ControllerBinding> binding,
BindingSupplier binding,
ButtonRenderPosition position,
ButtonGuidePredicate<T> 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 <T extends AbstractButton> void addGuideToButtonBuiltin(
T button,
Function<ControllerBindings<?>, ControllerBinding> binding,
ButtonRenderPosition position,
ButtonGuidePredicate<T> renderPredicate) {
ButtonGuideRenderer.registerBindingForButton(button, controller -> binding.apply(controller.bindings()), position, renderPredicate);
}
}

View File

@ -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<T extends AbstractButton> {
void setButtonGuide(RenderData<T> renderData);
static <T extends AbstractButton> void registerBindingForButton(T button, Function<ControllerBindings<?>, ControllerBinding> binding, ButtonRenderPosition position, ButtonGuidePredicate<T> renderPredicate) {
static <T extends AbstractButton> void registerBindingForButton(T button, BindingSupplier binding, ButtonRenderPosition position, ButtonGuidePredicate<T> renderPredicate) {
((ButtonGuideRenderer<T>) button).setButtonGuide(new RenderData<>(binding, position, renderPredicate));
}
record RenderData<T extends AbstractButton>(Function<ControllerBindings<?>, ControllerBinding> binding, ButtonRenderPosition position, ButtonGuidePredicate<T> renderPredicate) {
record RenderData<T extends AbstractButton>(BindingSupplier binding, ButtonRenderPosition position, ButtonGuidePredicate<T> renderPredicate) {
}
}

View File

@ -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() {

View File

@ -19,6 +19,6 @@ public class YACLScreenCategoryTabMixin {
@Inject(method = "<init>", 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);
}
}

View File

@ -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();
}
}

View File

@ -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<CreateWorldScreen> processor = new CreateWorldScreenProcessor((CreateWorldScreen) (Object) this, this::onCreate);
@Unique private final ScreenProcessor<CreateWorldScreen> 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;
}

View File

@ -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 extends GuiEventListener & Renderable> 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 extends GuiEventListener & Renderable> 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;
}
}

View File

@ -36,19 +36,19 @@ public class PauseScreenProcessor extends ScreenProcessor<PauseScreen> {
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,

View File

@ -34,13 +34,13 @@ public class TitleScreenProcessor extends ScreenProcessor<TitleScreen> {
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,