Make image preview scalable

This commit is contained in:
nea
2023-07-23 01:35:16 +02:00
parent cdf3938b77
commit 91febc31ad
9 changed files with 158 additions and 23 deletions

View File

@@ -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) {

View File

@@ -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)
)
}
})
}
}

View 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
}
}

View File

@@ -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) {