Skip to content

Commit a8ee30b

Browse files
committed
additional button guides for most options screens
1 parent 64c5678 commit a8ee30b

File tree

5 files changed

+149
-0
lines changed

5 files changed

+149
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dev.isxander.controlify.mixins.feature.screenop.impl.outofgame;
2+
3+
import com.llamalad7.mixinextras.expression.Definition;
4+
import com.llamalad7.mixinextras.expression.Expression;
5+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
6+
import dev.isxander.controlify.screenop.ScreenProcessor;
7+
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
8+
import dev.isxander.controlify.screenop.compat.vanilla.OptionsScreenProcessor;
9+
import net.minecraft.client.gui.components.Button;
10+
import net.minecraft.client.gui.screens.options.OptionsScreen;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Unique;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
15+
@Mixin(OptionsScreen.class)
16+
public class OptionsScreenMixin implements ScreenProcessorProvider {
17+
@Unique
18+
private Button doneButton;
19+
20+
@Unique
21+
private final OptionsScreenProcessor screenProcessor = new OptionsScreenProcessor(
22+
(OptionsScreen) (Object) this,
23+
() -> this.doneButton
24+
);
25+
26+
@Definition(id = "builder", method = "Lnet/minecraft/client/gui/components/Button;builder(Lnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/components/Button$OnPress;)Lnet/minecraft/client/gui/components/Button$Builder;")
27+
@Definition(id = "GUI_DONE", field = "Lnet/minecraft/network/chat/CommonComponents;GUI_DONE:Lnet/minecraft/network/chat/Component;")
28+
@Definition(id = "build", method = "Lnet/minecraft/client/gui/components/Button$Builder;build()Lnet/minecraft/client/gui/components/Button;")
29+
@Expression("builder(GUI_DONE, ?).?(?).build()")
30+
@ModifyExpressionValue(method = "init", at = @At("MIXINEXTRAS:EXPRESSION"))
31+
private Button captureDoneButton(Button button) {
32+
this.doneButton = button;
33+
return button;
34+
}
35+
36+
@Override
37+
public ScreenProcessor<?> screenProcessor() {
38+
return screenProcessor;
39+
}
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dev.isxander.controlify.mixins.feature.screenop.impl.outofgame;
2+
3+
import com.llamalad7.mixinextras.expression.Definition;
4+
import com.llamalad7.mixinextras.expression.Expression;
5+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
6+
import dev.isxander.controlify.screenop.ScreenProcessor;
7+
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
8+
import dev.isxander.controlify.screenop.compat.vanilla.OptionsSubScreenProcessor;
9+
import net.minecraft.client.gui.components.Button;
10+
import net.minecraft.client.gui.screens.options.OptionsSubScreen;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Unique;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
15+
@Mixin(OptionsSubScreen.class)
16+
public class OptionsSubScreenMixin implements ScreenProcessorProvider {
17+
@Unique
18+
private Button doneButton;
19+
20+
@Unique
21+
private final OptionsSubScreenProcessor<OptionsSubScreen> screenProcessor = new OptionsSubScreenProcessor<>(
22+
(OptionsSubScreen) (Object) this,
23+
() -> this.doneButton
24+
);
25+
26+
@Definition(id = "builder", method = "Lnet/minecraft/client/gui/components/Button;builder(Lnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/components/Button$OnPress;)Lnet/minecraft/client/gui/components/Button$Builder;")
27+
@Definition(id = "GUI_DONE", field = "Lnet/minecraft/network/chat/CommonComponents;GUI_DONE:Lnet/minecraft/network/chat/Component;")
28+
@Definition(id = "build", method = "Lnet/minecraft/client/gui/components/Button$Builder;build()Lnet/minecraft/client/gui/components/Button;")
29+
@Expression("builder(GUI_DONE, ?).?(?).build()")
30+
@ModifyExpressionValue(method = "addFooter", at = @At("MIXINEXTRAS:EXPRESSION"))
31+
private Button captureDoneButton(Button button) {
32+
this.doneButton = button;
33+
return button;
34+
}
35+
36+
@Override
37+
public ScreenProcessor<?> screenProcessor() {
38+
return screenProcessor;
39+
}
40+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.isxander.controlify.screenop.compat.vanilla;
2+
3+
import dev.isxander.controlify.api.buttonguide.ButtonGuideApi;
4+
import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate;
5+
import dev.isxander.controlify.bindings.ControlifyBindings;
6+
import dev.isxander.controlify.screenop.ScreenProcessor;
7+
import net.minecraft.client.gui.components.Button;
8+
import net.minecraft.client.gui.screens.options.OptionsScreen;
9+
import net.minecraft.client.gui.screens.options.OptionsSubScreen;
10+
11+
import java.util.function.Supplier;
12+
13+
public class OptionsScreenProcessor extends ScreenProcessor<OptionsScreen> {
14+
private final Supplier<Button> doneButtonSupplier;
15+
16+
public OptionsScreenProcessor(OptionsScreen screen, Supplier<Button> doneButtonSupplier) {
17+
super(screen);
18+
this.doneButtonSupplier = doneButtonSupplier;
19+
}
20+
21+
@Override
22+
public void onWidgetRebuild() {
23+
super.onWidgetRebuild();
24+
25+
Button doneButton = doneButtonSupplier.get();
26+
if (doneButton != null) {
27+
ButtonGuideApi.addGuideToButton(
28+
doneButton,
29+
ControlifyBindings.GUI_BACK,
30+
ButtonGuidePredicate.always()
31+
);
32+
}
33+
}
34+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package dev.isxander.controlify.screenop.compat.vanilla;
2+
3+
import dev.isxander.controlify.api.buttonguide.ButtonGuideApi;
4+
import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate;
5+
import dev.isxander.controlify.bindings.ControlifyBindings;
6+
import dev.isxander.controlify.screenop.ScreenProcessor;
7+
import net.minecraft.client.gui.components.Button;
8+
import net.minecraft.client.gui.screens.options.OptionsSubScreen;
9+
10+
import java.util.function.Supplier;
11+
12+
public class OptionsSubScreenProcessor<T extends OptionsSubScreen> extends ScreenProcessor<T> {
13+
private final Supplier<Button> doneButtonSupplier;
14+
15+
public OptionsSubScreenProcessor(T screen, Supplier<Button> doneButtonSupplier) {
16+
super(screen);
17+
this.doneButtonSupplier = doneButtonSupplier;
18+
}
19+
20+
@Override
21+
public void onWidgetRebuild() {
22+
super.onWidgetRebuild();
23+
24+
Button doneButton = doneButtonSupplier.get();
25+
if (doneButton != null) {
26+
ButtonGuideApi.addGuideToButton(
27+
doneButton,
28+
ControlifyBindings.GUI_BACK,
29+
ButtonGuidePredicate.always()
30+
);
31+
}
32+
}
33+
}

src/main/resources/controlify.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@
9191
"feature.screenop.impl.outofgame.JoinMultiplayerScreenMixin",
9292
"feature.screenop.impl.outofgame.LanguageSelectionListEntryMixin",
9393
"feature.screenop.impl.outofgame.ManageServerScreenMixin",
94+
"feature.screenop.impl.outofgame.OptionsScreenMixin",
9495
"feature.screenop.impl.outofgame.OptionsSubScreenAccessor",
96+
"feature.screenop.impl.outofgame.OptionsSubScreenMixin",
9597
"feature.screenop.impl.outofgame.PauseScreenAccessor",
9698
"feature.screenop.impl.outofgame.PauseScreenMixin",
9799
"feature.screenop.impl.outofgame.SelectWorldScreenAccessor",

0 commit comments

Comments
 (0)