aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/gui')
-rw-r--r--src/main/kotlin/moe/nea/firmament/gui/ConfigGui.kt94
-rw-r--r--src/main/kotlin/moe/nea/firmament/gui/WGridPanelWithPadding.kt33
-rw-r--r--src/main/kotlin/moe/nea/firmament/gui/repogui.kt36
3 files changed, 163 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/firmament/gui/ConfigGui.kt b/src/main/kotlin/moe/nea/firmament/gui/ConfigGui.kt
new file mode 100644
index 0000000..6acf68a
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/gui/ConfigGui.kt
@@ -0,0 +1,94 @@
+package moe.nea.firmament.gui
+
+import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
+import io.github.cottonmc.cotton.gui.widget.WButton
+import io.github.cottonmc.cotton.gui.widget.WLabel
+import io.github.cottonmc.cotton.gui.widget.WTextField
+import io.github.cottonmc.cotton.gui.widget.WToggleButton
+import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment
+import io.github.cottonmc.cotton.gui.widget.data.Insets
+import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment
+import moe.nea.firmament.Firmament
+import moe.nea.firmament.util.data.DataHolder
+import net.minecraft.text.Text
+import kotlin.reflect.KMutableProperty1
+
+class ConfigGui<K>(val holder: DataHolder<K>, val build: ConfigGui<K>.() -> Unit) : LightweightGuiDescription() {
+ private val root = WGridPanelWithPadding(verticalPadding = 4)
+ private val reloadables = mutableListOf<(() -> Unit)>()
+
+ init {
+ setRootPanel(root)
+ root.insets = Insets.ROOT_PANEL
+ build()
+ reload()
+ }
+
+ fun title(text: Text) {
+ if (col != 0) {
+ Firmament.logger.warn("Set title not at the top of the ConfigGui")
+ }
+ val label = WLabel(text)
+ label.verticalAlignment = VerticalAlignment.TOP
+ label.horizontalAlignment = HorizontalAlignment.CENTER
+ root.add(label, 0, col, 11, 1)
+ col++
+ }
+
+ private fun label(text: Text) {
+ val label = WLabel(text)
+ label.verticalAlignment = VerticalAlignment.CENTER
+ root.add(label, 0, col, 5, 1)
+ }
+
+ fun toggle(text: Text, prop: KMutableProperty1<K, Boolean>) {
+ val toggle = WToggleButton(text)
+ reloadables.add { toggle.toggle = prop.get(holder.data) }
+ toggle.setOnToggle {
+ prop.set(holder.data, true)
+ holder.markDirty()
+ }
+ root.add(toggle, 5, col, 6, 1)
+ label(text)
+ col++
+ }
+
+ fun button(text: Text, buttonText: Text, runnable: () -> Unit) {
+ val button = WButton(buttonText)
+ button.setOnClick {
+ runnable.invoke()
+ }
+ root.add(button, 5, col, 6, 1)
+ label(text)
+ col++
+ }
+
+ fun textfield(
+ text: Text,
+ background: Text,
+ prop: KMutableProperty1<K, String>,
+ maxLength: Int = 255
+ ) {
+ val textfield = WTextField(background)
+ textfield.isEditable = true
+ reloadables.add {
+ textfield.text = prop.get(holder.data)
+ }
+ textfield.maxLength = maxLength
+ textfield.setChangedListener {
+ prop.set(holder.data, it)
+ holder.markDirty()
+ }
+ root.add(textfield, 5, col, 6, 11)
+ label(text)
+ col++
+ }
+
+ fun reload() {
+ reloadables.forEach { it.invoke() }
+ }
+
+ private var col = 0
+
+
+}
diff --git a/src/main/kotlin/moe/nea/firmament/gui/WGridPanelWithPadding.kt b/src/main/kotlin/moe/nea/firmament/gui/WGridPanelWithPadding.kt
new file mode 100644
index 0000000..255b80d
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/gui/WGridPanelWithPadding.kt
@@ -0,0 +1,33 @@
+package moe.nea.firmament.gui
+
+import io.github.cottonmc.cotton.gui.widget.WPanelWithInsets
+import io.github.cottonmc.cotton.gui.widget.WWidget
+import io.github.cottonmc.cotton.gui.widget.data.Insets
+
+class WGridPanelWithPadding(
+ val grid: Int = 18,
+ val verticalPadding: Int = 0,
+ val horizontalPadding: Int = 0,
+) : WPanelWithInsets() {
+
+ private inline val vertOffset get() = grid + verticalPadding
+ private inline val horiOffset get() = grid + horizontalPadding
+
+ fun add(w: WWidget, x: Int, y: Int, width: Int = 1, height: Int = 1) {
+ children.add(w)
+ w.parent = this
+ w.setLocation(x * horiOffset + insets.left, y * vertOffset + insets.top)
+ if (w.canResize())
+ w.setSize(
+ grid + (horiOffset * (width - 1)),
+ grid + (vertOffset * (height - 1)),
+ )
+ expandToFit(w, insets)
+ }
+
+ override fun setInsets(insets: Insets): WGridPanelWithPadding {
+ super.setInsets(insets)
+ return this
+ }
+
+}
diff --git a/src/main/kotlin/moe/nea/firmament/gui/repogui.kt b/src/main/kotlin/moe/nea/firmament/gui/repogui.kt
new file mode 100644
index 0000000..da681e4
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/gui/repogui.kt
@@ -0,0 +1,36 @@
+package moe.nea.firmament.gui
+
+import net.minecraft.text.Text
+import moe.nea.firmament.repo.RepoManager
+
+fun repoGui(): ConfigGui<RepoManager.Config> {
+ return ConfigGui(RepoManager) {
+ title(Text.translatable("firmament.gui.repo.title"))
+ toggle(Text.translatable("firmament.gui.repo.autoupdate"), RepoManager.Config::autoUpdate)
+ textfield(
+ Text.translatable("firmament.gui.repo.username"),
+ Text.translatable("firmament.gui.repo.hint.username"),
+ RepoManager.Config::user,
+ maxLength = 255
+ )
+ textfield(
+ Text.translatable("firmament.gui.repo.reponame"),
+ Text.translatable("firmament.gui.repo.hint.reponame"),
+ RepoManager.Config::repo
+ )
+ textfield(
+ Text.translatable("firmament.gui.repo.branch"),
+ Text.translatable("firmament.gui.repo.hint.branch"),
+ RepoManager.Config::branch
+ )
+ button(
+ Text.translatable("firmament.gui.repo.reset.label"),
+ Text.translatable("firmament.gui.repo.reset"),
+ ) {
+ RepoManager.data.user = "NotEnoughUpdates"
+ RepoManager.data.repo = "NotEnoughUpdates-REPO"
+ RepoManager.data.branch = "dangerous"
+ reload()
+ }
+ }
+}