aboutsummaryrefslogtreecommitdiff
path: root/src/compat/yacl/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/compat/yacl/java')
-rw-r--r--src/compat/yacl/java/KeybindingController.kt25
-rw-r--r--src/compat/yacl/java/YaclIntegration.kt100
2 files changed, 89 insertions, 36 deletions
diff --git a/src/compat/yacl/java/KeybindingController.kt b/src/compat/yacl/java/KeybindingController.kt
index 204d521..3714455 100644
--- a/src/compat/yacl/java/KeybindingController.kt
+++ b/src/compat/yacl/java/KeybindingController.kt
@@ -6,10 +6,13 @@ import dev.isxander.yacl3.api.utils.Dimension
import dev.isxander.yacl3.gui.AbstractWidget
import dev.isxander.yacl3.gui.YACLScreen
import dev.isxander.yacl3.gui.controllers.ControllerWidget
-import net.minecraft.text.Text
+import net.minecraft.client.input.MouseButtonEvent
+import net.minecraft.client.input.KeyEvent
+import net.minecraft.network.chat.Component
import moe.nea.firmament.gui.config.KeyBindingHandler
import moe.nea.firmament.gui.config.KeyBindingStateManager
import moe.nea.firmament.gui.config.ManagedOption
+import moe.nea.firmament.keybindings.GenericInputButton
import moe.nea.firmament.keybindings.SavedKeyBinding
class KeybindingController(
@@ -21,7 +24,7 @@ class KeybindingController(
return option
}
- override fun formatValue(): Text {
+ override fun formatValue(): Component {
return option.pendingValue().format()
}
@@ -52,16 +55,16 @@ class KeybindingWidget(
return 130
}
- override fun getValueText(): Text {
+ override fun getValueText(): Component {
return sm.label
}
- override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
- return sm.keyboardEvent(keyCode, true)
+ override fun keyPressed(keyEvent: KeyEvent): Boolean {
+ return sm.keyboardEvent(GenericInputButton.of(keyEvent), true)
}
- override fun keyReleased(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
- return sm.keyboardEvent(keyCode, false)
+ override fun keyReleased(keyEvent: KeyEvent): Boolean {
+ return sm.keyboardEvent(GenericInputButton.of(keyEvent), false)
}
override fun unfocus() {
@@ -73,11 +76,11 @@ class KeybindingWidget(
if (!focused) sm.onLostFocus()
}
- override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
- if (button == 0 && isHovered) {
- sm.onClick()
+ override fun mouseClicked(mouseButtonEvent: MouseButtonEvent, doubleClick: Boolean): Boolean {
+ if (isHovered) {
+ sm.onClick(mouseButtonEvent.button())
return true
}
- return super.mouseClicked(mouseX, mouseY, button)
+ return super.mouseClicked(mouseButtonEvent, doubleClick)
}
}
diff --git a/src/compat/yacl/java/YaclIntegration.kt b/src/compat/yacl/java/YaclIntegration.kt
index 45a0d02..e10b8c4 100644
--- a/src/compat/yacl/java/YaclIntegration.kt
+++ b/src/compat/yacl/java/YaclIntegration.kt
@@ -9,6 +9,7 @@ import dev.isxander.yacl3.api.Option
import dev.isxander.yacl3.api.OptionDescription
import dev.isxander.yacl3.api.OptionGroup
import dev.isxander.yacl3.api.YetAnotherConfigLib
+import dev.isxander.yacl3.api.controller.ColorControllerBuilder
import dev.isxander.yacl3.api.controller.ControllerBuilder
import dev.isxander.yacl3.api.controller.DoubleSliderControllerBuilder
import dev.isxander.yacl3.api.controller.EnumControllerBuilder
@@ -17,16 +18,19 @@ import dev.isxander.yacl3.api.controller.StringControllerBuilder
import dev.isxander.yacl3.api.controller.TickBoxControllerBuilder
import dev.isxander.yacl3.api.controller.ValueFormatter
import dev.isxander.yacl3.gui.YACLScreen
-import dev.isxander.yacl3.gui.tab.ListHolderWidget
+import io.github.notenoughupdates.moulconfig.ChromaColour
+import java.awt.Color
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import kotlin.time.DurationUnit
-import net.minecraft.client.gui.Element
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.text.Text
+import net.minecraft.client.gui.components.events.GuiEventListener
+import net.minecraft.client.gui.screens.Screen
+import net.minecraft.client.gui.components.AbstractContainerWidget
+import net.minecraft.network.chat.Component
import moe.nea.firmament.gui.config.BooleanHandler
import moe.nea.firmament.gui.config.ChoiceHandler
import moe.nea.firmament.gui.config.ClickHandler
+import moe.nea.firmament.gui.config.ColourHandler
import moe.nea.firmament.gui.config.DurationHandler
import moe.nea.firmament.gui.config.EnumRenderer
import moe.nea.firmament.gui.config.FirmamentConfigScreenProvider
@@ -34,11 +38,13 @@ import moe.nea.firmament.gui.config.HudMeta
import moe.nea.firmament.gui.config.HudMetaHandler
import moe.nea.firmament.gui.config.IntegerHandler
import moe.nea.firmament.gui.config.KeyBindingHandler
-import moe.nea.firmament.gui.config.ManagedConfig
+import moe.nea.firmament.util.data.ManagedConfig
import moe.nea.firmament.gui.config.ManagedOption
import moe.nea.firmament.gui.config.StringHandler
import moe.nea.firmament.keybindings.SavedKeyBinding
import moe.nea.firmament.util.FirmFormatters
+import moe.nea.firmament.util.getRGBAWithoutAnimation
+import moe.nea.firmament.util.toChromaWithoutAnimation
@AutoService(FirmamentConfigScreenProvider::class)
@@ -56,20 +62,22 @@ class YaclIntegration : FirmamentConfigScreenProvider {
OptionGroup.createBuilder()
.name(it.labelText)
.options(buildOptions(it.sortedOptions))
- .build())
+ .build()
+ )
}
}
.build()
}
fun buildOptions(options: List<ManagedOption<*>>): Collection<Option<*>> =
- options.map { buildOption(it) }
+ options.flatMap { buildOption(it) }
- private fun <T : Any> buildOption(managedOption: ManagedOption<T>): Option<*> {
+ private fun <T : Any> buildOption(managedOption: ManagedOption<T>): Collection<Option<*>> {
val handler = managedOption.handler
- val binding = Binding.generic(managedOption.default(),
- managedOption::value,
- { managedOption.value = it; managedOption.element.save() })
+ val binding = Binding.generic(
+ managedOption.default(),
+ managedOption::value,
+ { managedOption.value = it; managedOption.element.markDirty() })
fun <T> createDefaultBinding(function: (Option<T>) -> ControllerBuilder<T>): Option.Builder<T> {
return Option.createBuilder<T>()
@@ -78,47 +86,89 @@ class YaclIntegration : FirmamentConfigScreenProvider {
.binding(binding as Binding<T>)
.controller { function(it) }
}
+
+ fun Option<out Any>.single() = listOf(this)
+ fun ButtonOption.Builder.single() = build().single()
+ fun Option.Builder<out Any>.single() = build().single()
when (handler) {
is ClickHandler -> return ButtonOption.createBuilder()
.name(managedOption.labelText)
.action { t, u ->
handler.runnable()
}
- .build()
+ .single()
is HudMetaHandler -> return ButtonOption.createBuilder()
.name(managedOption.labelText)
.action { t, u ->
handler.openEditor(managedOption as ManagedOption<HudMeta>, t)
}
- .build()
+ .single()
is ChoiceHandler<*> -> return createDefaultBinding {
createChoiceBinding(handler as ChoiceHandler<*>, managedOption as ManagedOption<*>, it as Option<*>)
- }.build()
+ }.single()
+
+ is ColourHandler -> {
+ managedOption as ManagedOption<ChromaColour>
+ val colorBinding =
+ Binding.generic(
+ managedOption.default().getRGBAWithoutAnimation(),
+ { managedOption.value.getRGBAWithoutAnimation() },
+ {
+ managedOption.value =
+ it.toChromaWithoutAnimation(managedOption.value.timeForFullRotationInMillis)
+ managedOption.element.markDirty()
+ })
+ val speedBinding =
+ Binding.generic(
+ managedOption.default().timeForFullRotationInMillis,
+ { managedOption.value.timeForFullRotationInMillis },
+ {
+ managedOption.value = managedOption.value.copy(timeForFullRotationInMillis = it)
+ managedOption.element.markDirty()
+ }
+ )
+
+ return listOf(
+ Option.createBuilder<Color>()
+ .name(managedOption.labelText)
+ .binding(colorBinding)
+ .controller {
+ ColorControllerBuilder.create(it)
+ .allowAlpha(true)
+ }
+ .build(),
+ Option.createBuilder<Int>()
+ .name(managedOption.labelText)
+ .binding(speedBinding)
+ .controller { IntegerSliderControllerBuilder.create(it).range(0, 60_000).step(10) }
+ .build(),
+ )
+ }
- is BooleanHandler -> return createDefaultBinding(TickBoxControllerBuilder::create).build()
- is StringHandler -> return createDefaultBinding(StringControllerBuilder::create).build()
+ is BooleanHandler -> return createDefaultBinding(TickBoxControllerBuilder::create).single()
+ is StringHandler -> return createDefaultBinding(StringControllerBuilder::create).single()
is IntegerHandler -> return createDefaultBinding {
IntegerSliderControllerBuilder.create(it).range(handler.min, handler.max).step(1)
- }.build()
+ }.single()
is DurationHandler -> return Option.createBuilder<Double>()
.name(managedOption.labelText)
.binding((binding as Binding<Duration>).xmap({ it.toDouble(DurationUnit.SECONDS) }, { it.seconds }))
.controller {
DoubleSliderControllerBuilder.create(it)
- .formatValue { Text.literal(FirmFormatters.formatTimespan(it.seconds)) }
+ .formatValue { Component.literal(FirmFormatters.formatTimespan(it.seconds)) }
.step(0.1)
.range(handler.min.toDouble(DurationUnit.SECONDS), handler.max.toDouble(DurationUnit.SECONDS))
}
- .build()
+ .single()
is KeyBindingHandler -> return createDefaultBinding {
KeybindingBuilder(it, managedOption as ManagedOption<SavedKeyBinding>)
- }.build()
+ }.single()
- else -> return LabelOption.create(Text.literal("This option is currently unhandled for this config menu. Please report this as a bug."))
+ else -> return listOf(LabelOption.create(Component.literal("This option is currently unhandled for this config menu. Please report this as a bug.")))
}
}
@@ -146,7 +196,7 @@ class YaclIntegration : FirmamentConfigScreenProvider {
fun buildConfig(): YetAnotherConfigLib {
return YetAnotherConfigLib.createBuilder()
- .title(Text.literal("Firmament"))
+ .title(Component.literal("Firmament"))
.categories(buildCategories())
.build()
}
@@ -154,11 +204,11 @@ class YaclIntegration : FirmamentConfigScreenProvider {
override val key: String
get() = "yacl"
- override fun open(parent: Screen?): Screen {
+ override fun open(search: String?, parent: Screen?): Screen {
return object : YACLScreen(buildConfig(), parent) {
- override fun setFocused(focused: Element?) {
+ override fun setFocused(focused: GuiEventListener?) {
if (this.focused is KeybindingWidget &&
- focused is ListHolderWidget<*>
+ focused is AbstractContainerWidget
) {
return
}