forked from Clones/Controlify
sodium compat
This commit is contained in:
@ -0,0 +1,24 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import me.jellysquid.mods.sodium.client.gui.widgets.AbstractWidget;
|
||||
import net.minecraft.client.gui.ComponentPath;
|
||||
import net.minecraft.client.gui.components.events.GuiEventListener;
|
||||
import net.minecraft.client.gui.navigation.FocusNavigationEvent;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
@Mixin(AbstractWidget.class)
|
||||
public abstract class AbstractWidgetMixin implements GuiEventListener {
|
||||
@Shadow protected abstract void drawRect(double x1, double y1, double x2, double y2, int color);
|
||||
|
||||
@Shadow protected abstract void playClickSound();
|
||||
|
||||
@Shadow public abstract boolean isFocused();
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ComponentPath nextFocusPath(FocusNavigationEvent focusNavigationEvent) {
|
||||
return !this.isFocused() ? ComponentPath.leaf(this) : null;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import me.jellysquid.mods.sodium.client.gui.options.Option;
|
||||
import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement;
|
||||
import me.jellysquid.mods.sodium.client.util.Dim2i;
|
||||
import net.minecraft.client.gui.ComponentPath;
|
||||
import net.minecraft.client.gui.navigation.FocusNavigationEvent;
|
||||
import net.minecraft.client.gui.navigation.ScreenRectangle;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(ControlElement.class)
|
||||
public abstract class ControlElementMixin<T> extends AbstractWidgetMixin {
|
||||
|
||||
@Shadow @Final protected Option<T> option;
|
||||
@Shadow @Final protected Dim2i dim;
|
||||
|
||||
@Inject(method = "render", at = @At("TAIL"))
|
||||
private void renderFocusRect(PoseStack matrixStack, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
||||
if (this.isFocused()) {
|
||||
int x1 = this.dim.x();
|
||||
int y1 = this.dim.y();
|
||||
int x2 = this.dim.getLimitX();
|
||||
int y2 = this.dim.getLimitY();
|
||||
|
||||
this.drawRect(x1, y1, x2, y1 + 1, -1);
|
||||
this.drawRect(x1, y2 - 1, x2, y2, -1);
|
||||
this.drawRect(x1, y1, x1 + 1, y2, -1);
|
||||
this.drawRect(x2 - 1, y1, x2, y2, -1);;
|
||||
}
|
||||
}
|
||||
|
||||
@ModifyExpressionValue(method = "render", at = @At(value = "FIELD", target = "Lme/jellysquid/mods/sodium/client/gui/options/control/ControlElement;hovered:Z", opcode = Opcodes.GETFIELD, ordinal = 0))
|
||||
private boolean shouldShortenName(boolean hovered) {
|
||||
return hovered || this.isFocused();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ComponentPath nextFocusPath(FocusNavigationEvent focusNavigationEvent) {
|
||||
if (!this.option.isAvailable())
|
||||
return null;
|
||||
return super.nextFocusPath(focusNavigationEvent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ScreenRectangle getRectangle() {
|
||||
return new ScreenRectangle(this.dim.x(), this.dim.y(), this.dim.width(), this.dim.height());
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import dev.isxander.controlify.compatibility.sodium.CycleControlProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import org.spongepowered.asm.mixin.*;
|
||||
|
||||
@Pseudo
|
||||
@Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.CyclingControl$CyclingControlElement")
|
||||
public abstract class CycleControlElementMixin<T extends Enum<T>> extends ControlElementMixin<T> implements ComponentProcessorProvider {
|
||||
@Shadow private int currentIndex;
|
||||
@Final @Shadow private T[] allowedValues;
|
||||
|
||||
@Unique private final ComponentProcessor controlify$componentProcessor
|
||||
= new CycleControlProcessor(this::cycle);
|
||||
|
||||
@Override
|
||||
public ComponentProcessor componentProcessor() {
|
||||
return controlify$componentProcessor;
|
||||
}
|
||||
|
||||
private void cycle(boolean backwards) {
|
||||
if (backwards) {
|
||||
this.currentIndex = (this.currentIndex - 1 + this.allowedValues.length) % this.allowedValues.length;
|
||||
} else {
|
||||
this.currentIndex = (this.option.getValue().ordinal() + 1) % this.allowedValues.length;
|
||||
}
|
||||
this.option.setValue(this.allowedValues[this.currentIndex]);
|
||||
this.playClickSound();
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.compatibility.sodium.ButtonProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import me.jellysquid.mods.sodium.client.gui.widgets.FlatButtonWidget;
|
||||
import me.jellysquid.mods.sodium.client.util.Dim2i;
|
||||
import net.minecraft.client.gui.ComponentPath;
|
||||
import net.minecraft.client.gui.navigation.FocusNavigationEvent;
|
||||
import net.minecraft.client.gui.navigation.ScreenRectangle;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(FlatButtonWidget.class)
|
||||
public abstract class FlatButtonWidgetMixin extends AbstractWidgetMixin implements ComponentProcessorProvider {
|
||||
@Shadow @Final private Dim2i dim;
|
||||
@Shadow private boolean visible;
|
||||
@Shadow private boolean enabled;
|
||||
@Shadow @Final private Runnable action;
|
||||
|
||||
@Unique private final ComponentProcessor controlify$componentProcessor
|
||||
= new ButtonProcessor(() -> action.run());
|
||||
|
||||
@Inject(method = "render", at = @At("TAIL"))
|
||||
private void renderFocusRect(PoseStack matrixStack, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
||||
if (this.enabled && this.isFocused()) {
|
||||
int x1 = this.dim.x();
|
||||
int y1 = this.dim.y();
|
||||
int x2 = this.dim.getLimitX();
|
||||
int y2 = this.dim.getLimitY();
|
||||
|
||||
this.drawRect(x1, y1, x2, y1 + 1, -1);
|
||||
this.drawRect(x1, y2 - 1, x2, y2, -1);
|
||||
this.drawRect(x1, y1, x1 + 1, y2, -1);
|
||||
this.drawRect(x2 - 1, y1, x2, y2, -1);;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ComponentPath nextFocusPath(FocusNavigationEvent focusNavigationEvent) {
|
||||
if (!visible || !enabled)
|
||||
return null;
|
||||
return super.nextFocusPath(focusNavigationEvent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ScreenRectangle getRectangle() {
|
||||
return new ScreenRectangle(this.dim.x(), this.dim.y(), this.dim.width(), this.dim.height());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentProcessor componentProcessor() {
|
||||
return controlify$componentProcessor;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import dev.isxander.controlify.compatibility.sodium.SliderControlProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.SliderControl$Button")
|
||||
public abstract class SliderControlElementMixin extends ControlElementMixin<Integer> implements ComponentProcessorProvider {
|
||||
@Shadow public abstract int getIntValue();
|
||||
@Shadow @Final private int interval;
|
||||
@Shadow protected abstract void setValue(double d);
|
||||
@Shadow public abstract double getThumbPositionForValue(int value);
|
||||
|
||||
@Unique private final ComponentProcessor controlify$componentProcessor
|
||||
= new SliderControlProcessor(this::incrementSlider);
|
||||
|
||||
@ModifyExpressionValue(method = "render", at = @At(value = "FIELD", target = "Lme/jellysquid/mods/sodium/client/gui/options/control/SliderControl$Button;hovered:Z", opcode = Opcodes.GETFIELD))
|
||||
private boolean shouldRenderSlider(boolean hovered) {
|
||||
return hovered || this.isFocused();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentProcessor componentProcessor() {
|
||||
return controlify$componentProcessor;
|
||||
}
|
||||
|
||||
private void incrementSlider(boolean reverse) {
|
||||
int inc = reverse ? -1 : 1;
|
||||
this.setValue(this.getThumbPositionForValue(this.getIntValue() + inc * this.interval));
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
||||
import me.jellysquid.mods.sodium.client.gui.options.OptionPage;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(SodiumOptionsGUI.class)
|
||||
public interface SodiumOptionsGUIAccessor {
|
||||
@Accessor
|
||||
List<OptionPage> getPages();
|
||||
|
||||
@Accessor
|
||||
OptionPage getCurrentPage();
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import dev.isxander.controlify.compatibility.sodium.SodiumGuiScreenProcessor;
|
||||
import dev.isxander.controlify.screenop.ScreenProcessor;
|
||||
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
|
||||
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
||||
import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(value = SodiumOptionsGUI.class, remap = false)
|
||||
public abstract class SodiumOptionsGUIMixin extends Screen implements ScreenProcessorProvider {
|
||||
@Shadow @Final private List<ControlElement<?>> controls;
|
||||
|
||||
@Unique private final SodiumGuiScreenProcessor controlify$screenProcessor
|
||||
= new SodiumGuiScreenProcessor((SodiumOptionsGUI) (Object) this);
|
||||
|
||||
protected SodiumOptionsGUIMixin(Component title) {
|
||||
super(title);
|
||||
}
|
||||
|
||||
@Inject(method = "rebuildGUIOptions", at = @At("RETURN"))
|
||||
private void focusFirstButton(CallbackInfo ci) {
|
||||
this.setInitialFocus(controls.get(0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ScreenProcessor<?> screenProcessor() {
|
||||
return controlify$screenProcessor;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package dev.isxander.controlify.mixins.compat.sodium;
|
||||
|
||||
import dev.isxander.controlify.compatibility.sodium.TickBoxControlProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Pseudo;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
|
||||
@Pseudo
|
||||
@Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.TickBoxControl$TickBoxControlElement")
|
||||
public abstract class TickBoxControlElementMixin extends ControlElementMixin<Boolean> implements ComponentProcessorProvider {
|
||||
@Unique private final ComponentProcessor controlify$componentProcessor
|
||||
= new TickBoxControlProcessor(this::toggle);
|
||||
|
||||
@Override
|
||||
public ComponentProcessor componentProcessor() {
|
||||
return controlify$componentProcessor;
|
||||
}
|
||||
|
||||
private void toggle() {
|
||||
this.option.setValue(!this.option.getValue());
|
||||
this.playClickSound();
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package dev.isxander.controlify.mixins.feature.screenop.yacl;
|
||||
package dev.isxander.controlify.mixins.compat.yacl;
|
||||
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import dev.isxander.controlify.screenop.compat.yacl.CyclingControllerElementComponentProcessor;
|
||||
import dev.isxander.controlify.compatibility.yacl.CyclingControllerElementComponentProcessor;
|
||||
import dev.isxander.yacl.gui.controllers.cycling.CyclingControllerElement;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
@ -1,8 +1,8 @@
|
||||
package dev.isxander.controlify.mixins.feature.screenop.yacl;
|
||||
package dev.isxander.controlify.mixins.compat.yacl;
|
||||
|
||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
|
||||
import dev.isxander.controlify.screenop.compat.yacl.SliderControllerElementComponentProcessor;
|
||||
import dev.isxander.controlify.compatibility.yacl.SliderControllerElementComponentProcessor;
|
||||
import dev.isxander.yacl.gui.controllers.slider.SliderControllerElement;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
@ -1,8 +1,8 @@
|
||||
package dev.isxander.controlify.mixins.feature.screenop.yacl;
|
||||
package dev.isxander.controlify.mixins.compat.yacl;
|
||||
|
||||
import dev.isxander.controlify.screenop.ScreenProcessor;
|
||||
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
|
||||
import dev.isxander.controlify.screenop.compat.yacl.YACLScreenProcessor;
|
||||
import dev.isxander.controlify.compatibility.yacl.YACLScreenProcessor;
|
||||
import dev.isxander.yacl.gui.YACLScreen;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
Reference in New Issue
Block a user