[enhancement] Enum setting displaying (#1661)

This commit is contained in:
Xiaro 2020-12-03 20:58:36 -05:00 committed by GitHub
parent aff0e19145
commit fc2c17dc74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 151 additions and 166 deletions

View File

@ -1,161 +0,0 @@
package me.zeroeightsix.kami.gui.kami.component;
import me.zeroeightsix.kami.gui.kami.Stretcherlayout;
import me.zeroeightsix.kami.gui.rgui.component.Component;
import me.zeroeightsix.kami.gui.rgui.component.container.OrganisedContainer;
import me.zeroeightsix.kami.gui.rgui.component.use.CheckButton;
import me.zeroeightsix.kami.gui.rgui.component.use.Slider;
import me.zeroeightsix.kami.gui.rgui.render.theme.Theme;
import me.zeroeightsix.kami.module.Module;
import me.zeroeightsix.kami.setting.Setting;
import me.zeroeightsix.kami.setting.impl.BooleanSetting;
import me.zeroeightsix.kami.setting.impl.EnumSetting;
import me.zeroeightsix.kami.setting.impl.numerical.DoubleSetting;
import me.zeroeightsix.kami.setting.impl.numerical.FloatSetting;
import me.zeroeightsix.kami.setting.impl.numerical.IntegerSetting;
import me.zeroeightsix.kami.setting.impl.numerical.NumberSetting;
import me.zeroeightsix.kami.util.Bind;
import java.util.Arrays;
/**
* Created by 086 on 6/08/2017.
*/
public class SettingsPanel extends OrganisedContainer {
Module module;
public SettingsPanel(Theme theme, Module module) {
super(theme, new Stretcherlayout(1));
setAffectLayout(false);
this.module = module;
prepare();
}
@Override
public void renderChildren() {
super.renderChildren();
}
public Module getModule() {
return module;
}
private void prepare() {
getChildren().clear();
if (module == null) {
setVisible(false);
return;
}
if (!module.getFullSettingList().isEmpty()) {
for (Setting setting : module.getFullSettingList()) {
if (!setting.isVisible()) continue;
String name = setting.getName();
boolean isNumber = setting instanceof NumberSetting;
boolean isBoolean = setting instanceof BooleanSetting;
boolean isEnum = setting instanceof EnumSetting;
if (setting.getValue() instanceof Bind) {
addChild(new BindButton(setting.getName(), null, module, setting));
}
if (isNumber) {
NumberSetting numberSetting = (NumberSetting) setting;
boolean isBound = numberSetting.isBound();
// Terrible terrible bug fix.
// I know, these parseDoubles look awful, but any conversions I tried here would end up with weird floating point conversion errors.
// This is really the easiest solution..
double value = Double.parseDouble(numberSetting.getValue().toString());
if (!isBound) {
UnboundSlider slider = new UnboundSlider(value, name, setting instanceof IntegerSetting);
slider.addPoof(new Slider.SliderPoof<UnboundSlider, Slider.SliderPoof.SliderPoofInfo>() {
@Override
public void execute(UnboundSlider component, SliderPoofInfo info) {
if (setting instanceof IntegerSetting)
setting.setValue((int) info.getNewValue());
else if (setting instanceof FloatSetting)
setting.setValue((float) info.getNewValue());
else if (setting instanceof DoubleSetting)
setting.setValue(info.getNewValue());
setModule(module);
}
});
if (numberSetting.getMax() != null) slider.setMax(numberSetting.getMax().doubleValue());
if (numberSetting.getMin() != null) slider.setMin(numberSetting.getMin().doubleValue());
addChild(slider);
} else {
double min = numberSetting.getMin().doubleValue();
double max = numberSetting.getMax().doubleValue();
double step;
if (numberSetting.getStep() != null) step = numberSetting.getStep().doubleValue();
else step = Slider.getDefaultStep(min, max);
Slider slider = new Slider(
value, min, max,
step,
name,
setting instanceof IntegerSetting);
slider.addPoof(new Slider.SliderPoof<Slider, Slider.SliderPoof.SliderPoofInfo>() {
@Override
public void execute(Slider component, SliderPoofInfo info) {
if (setting instanceof IntegerSetting)
setting.setValue((int) info.getNewValue());
else if (setting instanceof FloatSetting)
setting.setValue((float) info.getNewValue());
else if (setting instanceof DoubleSetting)
setting.setValue(info.getNewValue());
}
});
addChild(slider);
}
} else if (isBoolean) {
CheckButton checkButton = new CheckButton(name, null);
checkButton.setToggled(((BooleanSetting) setting).getValue());
checkButton.addPoof(new CheckButton.CheckButtonPoof<CheckButton, CheckButton.CheckButtonPoof.CheckButtonPoofInfo>() {
@Override
public void execute(CheckButton checkButton1, CheckButtonPoofInfo info) {
if (info.getAction() == CheckButtonPoofInfo.CheckButtonPoofInfoAction.TOGGLE) {
setting.setValue(checkButton.isToggled());
setModule(module);
}
}
});
addChild(checkButton);
} else if (isEnum) {
Class<? extends Enum> type = ((EnumSetting) setting).clazz;
Object[] con = type.getEnumConstants();
String[] modes = Arrays.stream(con).map(o -> o.toString().toUpperCase()).toArray(String[]::new);
EnumButton enumbutton = new EnumButton(name, null, modes);
enumbutton.addPoof(new EnumButton.EnumbuttonIndexPoof<EnumButton, EnumButton.EnumbuttonIndexPoof.EnumbuttonInfo>() {
@Override
public void execute(EnumButton component, EnumbuttonInfo info) {
setting.setValue(con[info.getNewIndex()]);
setModule(module);
}
});
enumbutton.setIndex(Arrays.asList(con).indexOf(setting.getValue()));
addChild(enumbutton);
}
}
}
if (children.isEmpty()) {
setVisible(false);
return;
} else {
setVisible(true);
return;
}
}
public void setModule(Module module) {
this.module = module;
setMinimumWidth((int) (getParent().getWidth() * .9f));
prepare();
setAffectLayout(false);
for (Component component : children) {
component.setWidth(getWidth() - 10);
component.setX(5);
}
}
}

View File

@ -0,0 +1,144 @@
package me.zeroeightsix.kami.gui.kami.component
import me.zeroeightsix.kami.gui.kami.Stretcherlayout
import me.zeroeightsix.kami.gui.kami.component.EnumButton.EnumbuttonIndexPoof
import me.zeroeightsix.kami.gui.kami.component.EnumButton.EnumbuttonIndexPoof.EnumbuttonInfo
import me.zeroeightsix.kami.gui.rgui.component.container.OrganisedContainer
import me.zeroeightsix.kami.gui.rgui.component.use.CheckButton
import me.zeroeightsix.kami.gui.rgui.component.use.CheckButton.CheckButtonPoof
import me.zeroeightsix.kami.gui.rgui.component.use.CheckButton.CheckButtonPoof.CheckButtonPoofInfo
import me.zeroeightsix.kami.gui.rgui.component.use.Slider
import me.zeroeightsix.kami.gui.rgui.component.use.Slider.SliderPoof
import me.zeroeightsix.kami.gui.rgui.component.use.Slider.SliderPoof.SliderPoofInfo
import me.zeroeightsix.kami.gui.rgui.render.theme.Theme
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.Setting
import me.zeroeightsix.kami.setting.impl.BooleanSetting
import me.zeroeightsix.kami.setting.impl.EnumSetting
import me.zeroeightsix.kami.setting.impl.numerical.DoubleSetting
import me.zeroeightsix.kami.setting.impl.numerical.FloatSetting
import me.zeroeightsix.kami.setting.impl.numerical.IntegerSetting
import me.zeroeightsix.kami.setting.impl.numerical.NumberSetting
import me.zeroeightsix.kami.util.Bind
import org.kamiblue.commons.utils.DisplayEnum
import java.util.*
/**
* Created by 086 on 6/08/2017.
*/
class SettingsPanel(theme: Theme?, module: Module?) : OrganisedContainer(theme, Stretcherlayout(1)) {
var module: Module? = module
set(value) {
field = value
minimumWidth = (parent.width * .9f).toInt()
prepare()
setAffectLayout(false)
for (component in children) {
component.width = width - 10
component.x = 5
}
}
private fun prepare() {
getChildren().clear()
val module = module
if (module == null) {
isVisible = false
return
}
if (module.fullSettingList.isNotEmpty()) {
for (setting in module.fullSettingList) {
if (!setting.isVisible) continue
val name = setting.name
if (setting.value is Bind) {
@Suppress("UNCHECKED_CAST")
addChild(BindButton(setting.name, null, module, setting as Setting<Bind>))
} else if (setting is NumberSetting<*>) {
val isBound = setting.isBound
// Terrible terrible bug fix.
// I know, these parseDoubles look awful, but any conversions I tried here would end up with weird floating point conversion errors.
// This is really the easiest solution..
val value = setting.value.toString().toDouble()
if (!isBound) {
val slider = UnboundSlider(value, name, setting is IntegerSetting)
slider.addPoof(object : SliderPoof<UnboundSlider, SliderPoofInfo>() {
override fun execute(component: UnboundSlider, info: SliderPoofInfo) {
when (setting) {
is IntegerSetting -> setting.value = info.newValue.toInt()
is FloatSetting -> setting.value = info.newValue.toFloat()
is DoubleSetting -> setting.value = info.newValue
}
}
})
if (setting.max != null) slider.setMax(setting.max.toDouble())
if (setting.min != null) slider.setMin(setting.min.toDouble())
addChild(slider)
} else {
val min = setting.min.toDouble()
val max = setting.max.toDouble()
val step = if (setting.step != null) setting.step.toDouble()
else Slider.getDefaultStep(min, max)
val slider = Slider(value, min, max, step, name, setting is IntegerSetting)
slider.addPoof(object : SliderPoof<Slider, SliderPoofInfo>() {
override fun execute(component: Slider, info: SliderPoofInfo) {
when (setting) {
is IntegerSetting -> setting.value = info.newValue.toInt()
is FloatSetting -> setting.value = info.newValue.toFloat()
is DoubleSetting -> setting.value = info.newValue
}
}
})
addChild(slider)
}
} else if (setting is BooleanSetting) {
val checkButton = CheckButton(name, null)
checkButton.isToggled = setting.value
checkButton.addPoof(object : CheckButtonPoof<CheckButton, CheckButtonPoofInfo>() {
override fun execute(checkButton1: CheckButton, info: CheckButtonPoofInfo) {
if (info.action == CheckButtonPoofInfo.CheckButtonPoofInfoAction.TOGGLE) {
setting.value = checkButton.isToggled
this@SettingsPanel.module = module
}
}
})
addChild(checkButton)
} else if (setting is EnumSetting<*>) {
val enumClass = setting.clazz
val enumValues = enumClass.enumConstants
val modes = enumValues.map { if (it is DisplayEnum) it.displayName else it.name }.toTypedArray()
val enumButton = EnumButton(name, null, modes)
enumButton.addPoof(object : EnumbuttonIndexPoof<EnumButton, EnumbuttonInfo>() {
override fun execute(component: EnumButton, info: EnumbuttonInfo) {
setting.value = enumValues[info.getNewIndex()]
this@SettingsPanel.module = module
}
})
enumButton.setIndex(enumValues.indexOf(setting.value))
addChild(enumButton)
}
}
}
isVisible = children.isNotEmpty()
}
}

View File

@ -23,6 +23,7 @@ import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.event.InputUpdateEvent
import net.minecraftforge.fml.common.gameevent.InputEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.kamiblue.commons.utils.DisplayEnum
import org.lwjgl.input.Keyboard
import kotlin.math.abs
import kotlin.math.cos
@ -35,15 +36,16 @@ import kotlin.math.sin
description = "Leave your body and transcend into the realm of the gods"
)
object Freecam : Module() {
private val directionMode = register(Settings.e<FlightMode>("FlightMode", FlightMode.CREATIVE))
private val horizontalSpeed = register(Settings.floatBuilder("HorizontalSpeed").withValue(20f).withRange(1f, 50f).withStep(1f))
private val verticalSpeed = register(Settings.floatBuilder("VerticalSpeed").withValue(20f).withRange(1f, 50f).withStep(1f).withVisibility { directionMode.value == DirectionMode.CREATIVE })
private val verticalSpeed = register(Settings.floatBuilder("VerticalSpeed").withValue(20f).withRange(1f, 50f).withStep(1f).withVisibility { directionMode.value == FlightMode.CREATIVE })
private val autoRotate = register(Settings.b("AutoRotate", true))
private val arrowKeyMove = register(Settings.b("ArrowKeyMove", true))
private val disableOnDisconnect = register(Settings.b("DisconnectDisable", true))
private val directionMode = register(Settings.e<DirectionMode>("DirectionMode", DirectionMode.CREATIVE))
private enum class DirectionMode {
CREATIVE, SOURCE
private enum class FlightMode(override val displayName: String) : DisplayEnum {
CREATIVE("Creative"),
THREE_DEE("3D")
}
private var prevThirdPersonViewSetting = -1
@ -214,7 +216,7 @@ object Freecam : Module() {
val yawRad = Math.toRadians(rotationYaw - RotationUtils.getRotationFromVec(Vec3d(moveStrafing.toDouble(), 0.0, moveForward.toDouble())).x)
val speed = (horizontalSpeed.value / 20f) * min(abs(moveForward) + abs(moveStrafing), 1f)
if (directionMode.value == DirectionMode.SOURCE) {
if (directionMode.value == FlightMode.THREE_DEE) {
val pitchRad = Math.toRadians(rotationPitch.toDouble()) * moveForward
motionX = -sin(yawRad) * cos(pitchRad) * speed
motionY = -sin(pitchRad) * speed