WIP: Terrible MoulConfig rewrite

This commit is contained in:
Linnea Gräf
2024-06-15 19:54:47 +02:00
parent df0a0ded97
commit dff1f9c0e2
10 changed files with 245 additions and 60 deletions

View File

@@ -16,7 +16,7 @@ plugins {
kotlin("jvm") version "1.9.23" kotlin("jvm") version "1.9.23"
kotlin("plugin.serialization") version "1.9.23" kotlin("plugin.serialization") version "1.9.23"
// id("com.bnorm.power.kotlin-power-assert") version "0.13.0" // id("com.bnorm.power.kotlin-power-assert") version "0.13.0"
id("dev.architectury.loom") version "1.6.394" id("dev.architectury.loom") version "1.6.397"
id("com.github.johnrengelman.shadow") version "8.1.1" id("com.github.johnrengelman.shadow") version "8.1.1"
id("moe.nea.licenseextractificator") id("moe.nea.licenseextractificator")
// id("io.github.juuxel.loom-vineflower") version "1.11.0" // id("io.github.juuxel.loom-vineflower") version "1.11.0"
@@ -76,6 +76,7 @@ repositories {
} }
maven( "https://repo.hypixel.net/repository/Hypixel/") maven( "https://repo.hypixel.net/repository/Hypixel/")
maven("https://maven.azureaaron.net/snapshots") maven("https://maven.azureaaron.net/snapshots")
mavenLocal()
} }
kotlin { kotlin {

View File

@@ -29,7 +29,7 @@ hotswap_agent = "1.4.2-SNAPSHOT"
mixinextras = "0.3.5" mixinextras = "0.3.5"
jarvis = "1.1.1" jarvis = "1.1.1"
nealisp = "1.0.0" nealisp = "1.0.0"
moulconfig = "3.0.0-beta.12" moulconfig = "9999.9999.9999"
manninghamMills = "2.4.1" manninghamMills = "2.4.1"
[libraries] [libraries]

View File

@@ -4,6 +4,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -0,0 +1,74 @@
/*
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.gui
import io.github.notenoughupdates.moulconfig.common.MyResourceLocation
import io.github.notenoughupdates.moulconfig.deps.libninepatch.NinePatch
import io.github.notenoughupdates.moulconfig.gui.GuiComponent
import io.github.notenoughupdates.moulconfig.gui.GuiImmediateContext
import io.github.notenoughupdates.moulconfig.gui.MouseEvent
import io.github.notenoughupdates.moulconfig.gui.component.PanelComponent
import io.github.notenoughupdates.moulconfig.observer.GetSetter
class FirmButtonComponent(
child: GuiComponent,
val action: Runnable,
val isEnabled: GetSetter<Boolean> = GetSetter.constant(true)
) : PanelComponent(child) {
/* TODO: make use of vanillas built in nine slicer */
val hoveredBg = NinePatch.builder(MyResourceLocation("minecraft", "textures/gui/sprites/widget/button_highlighted.png"))
.cornerSize(5)
.cornerUv(5 / 200F, 5 / 20F)
.mode(NinePatch.Mode.STRETCHING)
.build()
val unhoveredBg = NinePatch.builder(MyResourceLocation("minecraft", "textures/gui/sprites/widget/button.png"))
.cornerSize(5)
.cornerUv(5 / 200F, 5 / 20F)
.mode(NinePatch.Mode.STRETCHING)
.build()
val disabledBg = NinePatch.builder(MyResourceLocation("minecraft", "textures/gui/sprites/widget/button_disabled.png"))
.cornerSize(5)
.cornerUv(5 / 200F, 5 / 20F)
.mode(NinePatch.Mode.STRETCHING)
.build()
var isClicking = false
override fun mouseEvent(mouseEvent: MouseEvent, context: GuiImmediateContext): Boolean {
if (!isEnabled.get()) return false
if (isClicking) {
if (mouseEvent is MouseEvent.Click && !mouseEvent.mouseState && mouseEvent.mouseButton == 0) {
isClicking = false
if (context.isHovered) {
action.run()
}
return true
}
}
if (!context.isHovered) return false
if (mouseEvent !is MouseEvent.Click) return false
if (mouseEvent.mouseState && mouseEvent.mouseButton == 0) {
isClicking = true
return true
}
return false
}
override fun render(context: GuiImmediateContext) {
context.renderContext.pushMatrix()
context.renderContext.drawNinePatch(
if (!isEnabled.get()) disabledBg
else if (context.isHovered || isClicking) hoveredBg
else unhoveredBg,
0f, 0f, context.width, context.height
)
context.renderContext.translate(insets.toFloat(), insets.toFloat(), 0f)
element.render(getChildContext(context))
context.renderContext.popMatrix()
}
}

View File

@@ -0,0 +1,43 @@
/*
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.gui
import io.github.notenoughupdates.moulconfig.gui.GuiComponent
import io.github.notenoughupdates.moulconfig.gui.GuiImmediateContext
import io.github.notenoughupdates.moulconfig.gui.KeyboardEvent
import io.github.notenoughupdates.moulconfig.gui.MouseEvent
import io.github.notenoughupdates.moulconfig.observer.GetSetter
import java.util.function.BiFunction
class FixedComponent(
val fixedWidth: GetSetter<Int>,
val fixedHeight: GetSetter<Int>,
val component: GuiComponent,
) : GuiComponent() {
override fun getWidth(): Int = fixedWidth.get()
override fun getHeight(): Int = fixedHeight.get()
override fun <T : Any?> foldChildren(initial: T, visitor: BiFunction<GuiComponent, T, T>): T {
return visitor.apply(component, initial)
}
fun fixContext(context: GuiImmediateContext): GuiImmediateContext =
context.translated(0, 0, fixedWidth.get(), fixedHeight.get())
override fun render(context: GuiImmediateContext) {
component.render(fixContext(context))
}
override fun mouseEvent(mouseEvent: MouseEvent, context: GuiImmediateContext): Boolean {
return component.mouseEvent(mouseEvent, fixContext(context))
}
override fun keyboardEvent(event: KeyboardEvent, context: GuiImmediateContext): Boolean {
return component.keyboardEvent(event, fixContext(context))
}
}

View File

@@ -1,29 +1,21 @@
/* /*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe> * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package moe.nea.firmament.gui.config package moe.nea.firmament.gui.config
import io.github.cottonmc.cotton.gui.client.BackgroundPainter import io.github.notenoughupdates.moulconfig.observer.ObservableList
import io.github.cottonmc.cotton.gui.client.CottonClientScreen import io.github.notenoughupdates.moulconfig.xml.Bind
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
import io.github.cottonmc.cotton.gui.widget.WBox
import io.github.cottonmc.cotton.gui.widget.WButton
import io.github.cottonmc.cotton.gui.widget.WLabel
import io.github.cottonmc.cotton.gui.widget.WScrollPanel
import io.github.cottonmc.cotton.gui.widget.data.Axis
import io.github.cottonmc.cotton.gui.widget.data.Insets
import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.gui.WFixedPanel
import moe.nea.firmament.gui.WSplitPanel
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.ScreenUtil.setScreenLater
import net.minecraft.client.gui.screen.Screen import net.minecraft.client.gui.screen.Screen
import net.minecraft.text.Text import net.minecraft.text.Text
import kotlin.streams.asSequence import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.MoulConfigUtils
import moe.nea.firmament.util.ScreenUtil.setScreenLater
object AllConfigsGui { object AllConfigsGui {
@@ -32,45 +24,25 @@ object AllConfigsGui {
RepoManager.Config RepoManager.Config
) + FeatureManager.allFeatures.mapNotNull { it.config } ) + FeatureManager.allFeatures.mapNotNull { it.config }
fun makeScreen(parent: Screen? = null): CottonClientScreen { fun <T> List<T>.toObservableList(): ObservableList<T> = ObservableList(this)
val lwgd = LightweightGuiDescription()
var screen: CottonClientScreen? = null
val configs = allConfigs
val box = WBox(Axis.VERTICAL)
configs.forEach { config ->
val panel = WSplitPanel(
WLabel(Text.translatable("firmament.config.${config.name}")),
WButton(Text.translatable("firmanent.config.edit")).also {
it.setOnClick {
config.showConfigEditor(screen)
}
it.setSize(40, 18)
}
)
panel.insets = Insets.ROOT_PANEL
panel.backgroundPainter = BackgroundPainter.VANILLA
box.add((panel))
}
box.streamChildren().asSequence()
.forEach { it.setSize(380, 0) }
lwgd.setRootPanel(WBox(
Axis.VERTICAL
).also {
it.insets = Insets.ROOT_PANEL
box.layout()
it.add(WFixedPanel((WScrollPanel((box)).also {
it.verticalScrollBar.scrollingSpeed = 12
it.setSize(400, 300)
})))
it.setSize(400, 300)
})
screen = object : CottonClientScreen(lwgd) { class MainMapping(val allConfigs: List<ManagedConfig>) {
override fun close() { @get:Bind("configs")
MC.screen = parent val configs = allConfigs.map { EntryMapping(it) }.toObservableList()
class EntryMapping(val config: ManagedConfig) {
@Bind
fun name() = Text.translatable("firmament.config.${config.name}").string
@Bind
fun openEditor() {
config.showConfigEditor(MC.screen)
} }
} }
return screen }
fun makeScreen(parent: Screen? = null): Screen {
return MoulConfigUtils.loadScreen("config/main", MainMapping(allConfigs), parent)
} }
fun showAllGuis() { fun showAllGuis() {

View File

@@ -1,5 +1,6 @@
/* /*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe> * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -7,7 +8,10 @@
package moe.nea.firmament.util package moe.nea.firmament.util
import io.github.notenoughupdates.moulconfig.common.MyResourceLocation import io.github.notenoughupdates.moulconfig.common.MyResourceLocation
import io.github.notenoughupdates.moulconfig.gui.CloseEventListener
import io.github.notenoughupdates.moulconfig.gui.GuiComponentWrapper
import io.github.notenoughupdates.moulconfig.gui.GuiContext import io.github.notenoughupdates.moulconfig.gui.GuiContext
import io.github.notenoughupdates.moulconfig.observer.GetSetter
import io.github.notenoughupdates.moulconfig.xml.ChildCount import io.github.notenoughupdates.moulconfig.xml.ChildCount
import io.github.notenoughupdates.moulconfig.xml.XMLContext import io.github.notenoughupdates.moulconfig.xml.XMLContext
import io.github.notenoughupdates.moulconfig.xml.XMLGuiLoader import io.github.notenoughupdates.moulconfig.xml.XMLGuiLoader
@@ -17,7 +21,10 @@ import java.io.File
import javax.xml.namespace.QName import javax.xml.namespace.QName
import me.shedaniel.math.Color import me.shedaniel.math.Color
import org.w3c.dom.Element import org.w3c.dom.Element
import net.minecraft.client.gui.screen.Screen
import moe.nea.firmament.gui.BarComponent import moe.nea.firmament.gui.BarComponent
import moe.nea.firmament.gui.FirmButtonComponent
import moe.nea.firmament.gui.FixedComponent
object MoulConfigUtils { object MoulConfigUtils {
val firmUrl = "http://firmament.nea.moe/moulconfig" val firmUrl = "http://firmament.nea.moe/moulconfig"
@@ -62,6 +69,51 @@ object MoulConfigUtils {
return mapOf("progress" to true, "total" to true, "emptyColor" to true, "fillColor" to true) return mapOf("progress" to true, "total" to true, "emptyColor" to true, "fillColor" to true)
} }
}) })
uni.registerLoader(object : XMLGuiLoader.Basic<FirmButtonComponent> {
override fun getName(): QName {
return QName(firmUrl, "Button")
}
override fun createInstance(context: XMLContext<*>, element: Element): FirmButtonComponent {
return FirmButtonComponent(
context.getChildFragment(element),
context.getMethodFromAttribute(element, QName("onClick")),
context.getPropertyFromAttribute(element, QName("enabled"), Boolean::class.java)
?: GetSetter.constant(true)
)
}
override fun getChildCount(): ChildCount {
return ChildCount.ONE
}
override fun getAttributeNames(): Map<String, Boolean> {
return mapOf("onClick" to true, "enabled" to false)
}
})
uni.registerLoader(object : XMLGuiLoader.Basic<FixedComponent> {
override fun createInstance(context: XMLContext<*>, element: Element): FixedComponent {
return FixedComponent(
context.getPropertyFromAttribute(element, QName("width"), Int::class.java)
?: error("Requires width specified"),
context.getPropertyFromAttribute(element, QName("height"), Int::class.java)
?: error("Requires height specified"),
context.getChildFragment(element)
)
}
override fun getName(): QName {
return QName(firmUrl, "Fixed")
}
override fun getChildCount(): ChildCount {
return ChildCount.ONE
}
override fun getAttributeNames(): Map<String, Boolean> {
return mapOf("width" to true, "height" to true)
}
})
} }
fun generateXSD( fun generateXSD(
@@ -86,6 +138,16 @@ object MoulConfigUtils {
""".trimIndent()) """.trimIndent())
} }
fun loadScreen(name: String, bindTo: Any, parent: Screen?): Screen {
return object : GuiComponentWrapper(loadGui(name, bindTo)) {
override fun close() {
if (context.onBeforeClose() == CloseEventListener.CloseAction.NO_OBJECTIONS_TO_CLOSE) {
client!!.setScreen(parent)
}
}
}
}
fun loadGui(name: String, bindTo: Any): GuiContext { fun loadGui(name: String, bindTo: Any): GuiContext {
return GuiContext(universe.load(bindTo, MyResourceLocation("firmament", "gui/$name.xml"))) return GuiContext(universe.load(bindTo, MyResourceLocation("firmament", "gui/$name.xml")))
} }

View File

@@ -6,8 +6,7 @@ SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
SPDX-License-Identifier: GPL-3.0-or-later SPDX-License-Identifier: GPL-3.0-or-later
--> -->
<Root xmlns="http://notenoughupdates.org/moulconfig" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <Root xmlns="http://notenoughupdates.org/moulconfig">
xsi:schemaLocation="http://notenoughupdates.org/moulconfig https://raw.githubusercontent.com/NotEnoughUpdates/MoulConfig/master/MoulConfig.xsd">
<Panel background="VANILLA" insets="10"> <Panel background="VANILLA" insets="10">
<Column> <Column>
<Row> <Row>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<Root xmlns="http://notenoughupdates.org/moulconfig"
xmlns:firm="http://firmament.nea.moe/moulconfig">
<Center>
<Panel background="VANILLA" insets="10">
<Column>
<Text text="Firmament Config"/>
<ScrollPanel width="400" height="300">
<Array data="@configs">
<firm:Fixed width="380" height="30">
<Panel background="VANILLA">
<Center>
<Row>
<Center>
<Text text="@name"/>
</Center>
<firm:Button onClick="@openEditor">
<Text text="Edit"/>
</firm:Button>
</Row>
</Center>
</Panel>
</firm:Fixed>
</Array>
</ScrollPanel>
</Column>
</Panel>
</Center>
</Root>

View File

@@ -6,9 +6,7 @@ SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
SPDX-License-Identifier: GPL-3.0-or-later SPDX-License-Identifier: GPL-3.0-or-later
--> -->
<Root xmlns="http://notenoughupdates.org/moulconfig" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <Root xmlns="http://notenoughupdates.org/moulconfig" xmlns:firm="http://firmament.nea.moe/moulconfig">
xmlns:firm="http://firmament.nea.moe/moulconfig"
xsi:schemaLocation="http://notenoughupdates.org/moulconfig https://raw.githubusercontent.com/NotEnoughUpdates/MoulConfig/master/MoulConfig.xsd">
<Column> <Column>
<Row> <Row>
<firm:Bar progress="@moneyCurrent" total="@moneyMax" fillColor="#bbbb00" emptyColor="#909000"/> <firm:Bar progress="@moneyCurrent" total="@moneyMax" fillColor="#bbbb00" emptyColor="#909000"/>