diff options
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/gui')
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/gui/ConfigGui.kt | 94 | ||||
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/gui/WGridPanelWithPadding.kt | 33 | ||||
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/gui/repogui.kt | 36 |
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() + } + } +} |