forked from Clones/Controlify
🧹 Minor cleanup to the button guide api
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user