Make image preview scalable
This commit is contained in:
@@ -22,10 +22,14 @@ import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
||||
import io.github.cottonmc.cotton.gui.widget.WLabel
|
||||
import io.github.cottonmc.cotton.gui.widget.WWidget
|
||||
import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment
|
||||
import net.minecraft.client.gui.screen.Screen
|
||||
import net.minecraft.text.Text
|
||||
|
||||
class GuiAppender(val width: Int) {
|
||||
class GuiAppender(val width: Int, val screenAccessor: () -> Screen) {
|
||||
private var row = 0
|
||||
|
||||
|
||||
|
||||
internal val panel = WGridPanel().also { it.setGaps(4, 4) }
|
||||
internal val reloadables = mutableListOf<(() -> Unit)>()
|
||||
fun set(x: Int, y: Int, w: Int, h: Int, widget: WWidget) {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package moe.nea.firmament.gui.config
|
||||
|
||||
import io.github.cottonmc.cotton.gui.widget.WButton
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonElement
|
||||
import kotlinx.serialization.json.decodeFromJsonElement
|
||||
import kotlinx.serialization.json.encodeToJsonElement
|
||||
import net.minecraft.text.MutableText
|
||||
import net.minecraft.text.Text
|
||||
import moe.nea.firmament.jarvis.JarvisIntegration
|
||||
import moe.nea.firmament.util.MC
|
||||
|
||||
class HudMetaHandler(val config: ManagedConfig, val label: MutableText, val width: Int, val height: Int) :
|
||||
ManagedConfig.OptionHandler<HudMeta> {
|
||||
override fun toJson(element: HudMeta): JsonElement? {
|
||||
return Json.encodeToJsonElement(element.position)
|
||||
}
|
||||
|
||||
override fun fromJson(element: JsonElement): HudMeta {
|
||||
return HudMeta(Json.decodeFromJsonElement(element), label, width, height)
|
||||
}
|
||||
|
||||
override fun emitGuiElements(opt: ManagedConfig.Option<HudMeta>, guiAppender: GuiAppender) {
|
||||
guiAppender.appendLabeledRow(opt.labelText, WButton(Text.translatable("firmament.hud.edit", label))
|
||||
.also {
|
||||
it.setOnClick {
|
||||
MC.screen = JarvisIntegration.jarvis.getHudEditor(
|
||||
guiAppender.screenAccessor.invoke(),
|
||||
listOf(opt.value)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
46
src/main/kotlin/moe/nea/firmament/gui/config/JAnyHud.kt
Normal file
46
src/main/kotlin/moe/nea/firmament/gui/config/JAnyHud.kt
Normal file
@@ -0,0 +1,46 @@
|
||||
package moe.nea.firmament.gui.config
|
||||
|
||||
import moe.nea.jarvis.api.JarvisHud
|
||||
import moe.nea.jarvis.api.JarvisScalable
|
||||
import kotlinx.serialization.Serializable
|
||||
import net.minecraft.text.Text
|
||||
|
||||
@Serializable
|
||||
data class HudPosition(
|
||||
var x: Double,
|
||||
var y: Double,
|
||||
var scale: Float,
|
||||
)
|
||||
|
||||
|
||||
data class HudMeta(
|
||||
val position: HudPosition,
|
||||
private val label: Text,
|
||||
private val width: Int,
|
||||
private val height: Int,
|
||||
) : JarvisScalable, JarvisHud {
|
||||
override fun getX(): Double = position.x
|
||||
|
||||
override fun setX(newX: Double) {
|
||||
position.x = newX
|
||||
}
|
||||
|
||||
override fun getY(): Double = position.y
|
||||
|
||||
override fun setY(newY: Double) {
|
||||
position.y = newY
|
||||
}
|
||||
|
||||
override fun getLabel(): Text = label
|
||||
|
||||
override fun getWidth(): Int = width
|
||||
|
||||
override fun getHeight(): Int = height
|
||||
|
||||
override fun getScale(): Float = position.scale
|
||||
|
||||
override fun setScale(newScale: Float) {
|
||||
position.scale = newScale
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,6 +21,7 @@ package moe.nea.firmament.gui.config
|
||||
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
|
||||
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
|
||||
import io.github.cottonmc.cotton.gui.widget.data.Insets
|
||||
import moe.nea.jarvis.api.Point
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.JsonElement
|
||||
@@ -150,6 +151,19 @@ abstract class ManagedConfig(val name: String) {
|
||||
}
|
||||
|
||||
|
||||
protected fun position(
|
||||
propertyName: String,
|
||||
width: Int,
|
||||
height: Int,
|
||||
default: () -> Point,
|
||||
): Option<HudMeta> {
|
||||
val label = Text.translatable("firmament.config.${name}.${propertyName}")
|
||||
return option(propertyName, {
|
||||
val p = default()
|
||||
HudMeta(HudPosition(p.x, p.y, 1F), label, width, height)
|
||||
}, HudMetaHandler(this, label, width, height))
|
||||
}
|
||||
|
||||
protected fun integer(
|
||||
propertyName: String,
|
||||
min: Int,
|
||||
@@ -175,18 +189,26 @@ abstract class ManagedConfig(val name: String) {
|
||||
|
||||
fun getConfigEditor(parent: Screen? = null): CottonClientScreen {
|
||||
val lwgd = LightweightGuiDescription()
|
||||
val guiapp = GuiAppender(20)
|
||||
var screen: Screen? = null
|
||||
val guiapp = GuiAppender(20, { requireNotNull(screen) { "Screen Accessor called too early" } })
|
||||
latestGuiAppender = guiapp
|
||||
guiapp.panel.insets = Insets.ROOT_PANEL
|
||||
sortedOptions.forEach { it.appendToGui(guiapp) }
|
||||
guiapp.reloadables.forEach { it() }
|
||||
lwgd.setRootPanel(guiapp.panel)
|
||||
return object : CottonClientScreen(lwgd) {
|
||||
override fun close() {
|
||||
latestGuiAppender = null
|
||||
MC.screen = parent
|
||||
screen =
|
||||
object : CottonClientScreen(lwgd) {
|
||||
override fun init() {
|
||||
latestGuiAppender = guiapp
|
||||
super.init()
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
latestGuiAppender = null
|
||||
MC.screen = parent
|
||||
}
|
||||
}
|
||||
}
|
||||
return screen
|
||||
}
|
||||
|
||||
fun showConfigEditor(parent: Screen? = null) {
|
||||
|
||||
Reference in New Issue
Block a user