From db06b454b1bc5e28746c08ab582ba074d385e657 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Thu, 27 Jun 2019 19:12:35 -0400 Subject: [PATCH] Start DialogView --- .../net/shadowfacts/asmr/TestCacaoScreen.kt | 12 ++ .../net/shadowfacts/cacao/CacaoScreen.kt | 1 + .../net/shadowfacts/cacao/view/DialogView.kt | 115 ++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt diff --git a/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt b/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt index 447afa0..c5b1281 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt @@ -41,6 +41,18 @@ class TestCacaoScreen: CacaoScreen() { ).apply { handler = { println("dropdown value: ${it.value}") + val dialog = DialogView( + "New redstone mode", + it.value.name, + arrayOf(DialogView.DefaultButtonType.OK), + Texture(Identifier("textures/block/birch_log_top.png"), 0, 0, 16, 16), + buttonCallback = { _, window -> + window.removeFromScreen() + } + ) + val dialogWindow = Window() + dialogWindow.addView(dialog) + this@TestCacaoScreen.addWindow(dialogWindow) } }) diff --git a/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt b/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt index 288f718..709d343 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt @@ -38,6 +38,7 @@ open class CacaoScreen: Screen(TextComponent("CacaoScreen")) { fun addWindow(window: T, index: Int = _windows.size): T { _windows.add(index, window) window.screen = this + window.resize(width, height) return window } diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt b/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt new file mode 100644 index 0000000..0fe7bf3 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt @@ -0,0 +1,115 @@ +package net.shadowfacts.cacao.view + +import net.minecraft.ChatFormat +import net.shadowfacts.cacao.Window +import net.shadowfacts.cacao.geometry.Axis +import net.shadowfacts.cacao.util.Color +import net.shadowfacts.cacao.util.texture.NinePatchTexture +import net.shadowfacts.cacao.util.texture.Texture +import net.shadowfacts.cacao.view.button.Button +import net.shadowfacts.kiwidsl.dsl + +/** + * @author shadowfacts + */ +class DialogView( + val title: String, + val message: String, + val buttonTypes: Array, + val iconTexture: Texture?, + val buttonCallback: (ButtonType, Window) -> Unit +): View() { + + interface ButtonType { + val localizedName: String + } + + enum class DefaultButtonType: ButtonType { + CANCEL, CONFIRM, OK, CLOSE; + + override val localizedName: String + get() = name.toLowerCase().capitalize() // todo: actually localize me + } + + private lateinit var background: NinePatchView + private lateinit var hStack: StackView + private var iconView: TextureView? = null + private lateinit var vStack: StackView + private lateinit var messageLabel: Label + private var buttonContainer: View? = null + private var buttonStack: StackView? = null + + override fun wasAdded() { + background = addSubview(NinePatchView(NinePatchTexture.PANEL_BG).apply { zIndex = -1.0 }) + + hStack = addSubview(StackView(Axis.HORIZONTAL, StackView.Distribution.LEADING)) + + if (iconTexture != null) { + iconView = hStack.addArrangedSubview(TextureView(iconTexture)) + } + + vStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL)) + + vStack.addArrangedSubview(Label(ChatFormat.BOLD.toString() + title, shadow = false).apply { + textColor = Color(0x404040) + }) + messageLabel = vStack.addArrangedSubview(Label(message, shadow = false).apply { + textColor = Color(0x404040) + }) + + if (buttonTypes.isNotEmpty()) { + buttonContainer = vStack.addArrangedSubview(View()) + buttonStack = buttonContainer!!.addSubview(StackView(Axis.HORIZONTAL)) + for (type in buttonTypes) { + buttonStack!!.addArrangedSubview(Button(Label(type.localizedName)).apply { + handler = { + this@DialogView.buttonCallback(type, this@DialogView.window) + } + }) + } + } + + super.wasAdded() + } + + override fun createInternalConstraints() { + super.createInternalConstraints() + + solver.dsl { + centerXAnchor equalTo window.centerXAnchor + centerYAnchor equalTo window.centerYAnchor + + widthAnchor greaterThanOrEqualTo 150 + + background.leftAnchor equalTo leftAnchor - 8 + background.rightAnchor equalTo rightAnchor + 8 + background.topAnchor equalTo topAnchor - 8 + background.bottomAnchor equalTo bottomAnchor + 8 + + hStack.leftAnchor equalTo leftAnchor + hStack.rightAnchor equalTo rightAnchor + hStack.topAnchor equalTo topAnchor + hStack.bottomAnchor equalTo bottomAnchor + + if (iconView != null) { + hStack.bottomAnchor greaterThanOrEqualTo iconView!!.bottomAnchor + } + hStack.bottomAnchor greaterThanOrEqualTo vStack.bottomAnchor + + if (iconView != null) { + iconView!!.widthAnchor equalTo 30 + iconView!!.heightAnchor equalTo 30 + } + + messageLabel.heightAnchor greaterThanOrEqualTo 50 + + if (buttonContainer != null) { + buttonStack!!.heightAnchor equalTo buttonContainer!!.heightAnchor + buttonStack!!.centerYAnchor equalTo buttonContainer!!.centerYAnchor + + buttonStack!!.rightAnchor equalTo buttonContainer!!.rightAnchor + } + } + } + +} \ No newline at end of file