Remove UI prefix, start Window implementation

This commit is contained in:
Shadowfacts 2019-06-21 19:02:08 -04:00
parent 215949eabe
commit e28daf3b4a
Signed by: shadowfacts
GPG Key ID: 94A5AB95422746E5
11 changed files with 134 additions and 98 deletions

View File

@ -13,7 +13,7 @@ object ASMR: ModInitializer {
CommandRegistry.INSTANCE.register(false) { dispatcher ->
val command = CommandManager.literal("uitest").executes {
try {
MinecraftClient.getInstance().openScreen(UITest())
MinecraftClient.getInstance().openScreen(TestScreen())
} catch (e: Throwable) {
e.printStackTrace()
}

View File

@ -0,0 +1,52 @@
package net.shadowfacts.asmr
import net.shadowfacts.kiwidsl.dsl
import net.shadowfacts.shadowui.Screen
import net.shadowfacts.shadowui.View
import net.shadowfacts.shadowui.Window
import net.shadowfacts.shadowui.util.Color
class TestScreen: Screen() {
init {
windows.add(Window().apply {
val red = addView(View().apply {
backgroundColor = Color(0xff0000)
})
val green = addView(View().apply {
backgroundColor = Color(0x00ff00)
})
val blue = addView(View().apply {
backgroundColor = Color(0x0000ff)
})
val purple = green.addSubview(View().apply {
backgroundColor = Color(0x800080)
})
solver.dsl {
red.leftAnchor equalTo 0
red.widthAnchor equalTo 200
red.topAnchor equalTo 0
red.heightAnchor equalTo 100
green.leftAnchor equalTo (red.leftAnchor + red.widthAnchor + 20)
green.widthAnchor equalTo red.widthAnchor
green.topAnchor equalTo 0
green.heightAnchor equalTo (red.heightAnchor + 100)
blue.leftAnchor equalTo green.leftAnchor
blue.widthAnchor equalTo green.widthAnchor
blue.topAnchor equalTo (green.topAnchor + green.heightAnchor)
blue.heightAnchor equalTo 50
purple.widthAnchor equalTo 100
purple.heightAnchor equalTo 100
purple.centerXAnchor equalTo green.centerXAnchor
purple.centerYAnchor equalTo green.centerYAnchor
}
layout()
})
}
}

View File

@ -1,54 +0,0 @@
package net.shadowfacts.asmr
import net.shadowfacts.kiwidsl.dsl
import net.shadowfacts.shadowui.UIScreen
import net.shadowfacts.shadowui.UIView
import net.shadowfacts.shadowui.util.Color
class UITest: UIScreen() {
init {
val red = UIView().apply {
backgroundColor = Color(0xff0000)
addView(this)
}
val green = UIView().apply {
backgroundColor = Color(0x00ff00)
addView(this)
}
val blue = UIView().apply {
backgroundColor = Color(0x0000ff)
addView(this)
}
val purple = UIView().apply {
backgroundColor = Color(0x800080)
green.addSubview(this)
}
solver.dsl {
red.leftAnchor equalTo 0
red.widthAnchor equalTo 200
red.topAnchor equalTo 0
red.heightAnchor equalTo 100
green.leftAnchor equalTo (red.leftAnchor + red.widthAnchor + 20)
green.widthAnchor equalTo red.widthAnchor
green.topAnchor equalTo 0
green.heightAnchor equalTo (red.heightAnchor + 100)
blue.leftAnchor equalTo green.leftAnchor
blue.widthAnchor equalTo green.widthAnchor
blue.topAnchor equalTo (green.topAnchor + green.heightAnchor)
blue.heightAnchor equalTo 50
purple.widthAnchor equalTo 100
purple.heightAnchor equalTo 100
purple.centerXAnchor equalTo green.centerXAnchor
purple.centerYAnchor equalTo green.centerYAnchor
}
layout()
}
}

View File

@ -2,7 +2,7 @@ package net.shadowfacts.shadowui
import no.birkett.kiwi.Variable
class LayoutVariable(val owner: UIView, val property: String): Variable("LayoutVariable") {
class LayoutVariable(val owner: View, val property: String): Variable("LayoutVariable") {
override fun getName() = "$owner.$property"

View File

@ -0,0 +1,27 @@
package net.shadowfacts.shadowui
import net.minecraft.client.gui.screen.Screen
import net.minecraft.network.chat.TextComponent
import net.shadowfacts.shadowui.geometry.Point
import no.birkett.kiwi.Solver
open class Screen: Screen(TextComponent("Screen")) {
val windows = mutableListOf<Window>()
fun addWindow(window: Window, index: Int? = null) {
if (index != null) {
windows.add(index, window)
} else {
windows.add(window)
}
}
override fun render(mouseX: Int, mouseY: Int, delta: Float) {
val mouse = Point(mouseX, mouseY)
windows.forEach {
it.draw(mouse, delta)
}
}
}

View File

@ -1,28 +0,0 @@
package net.shadowfacts.shadowui
import net.minecraft.client.gui.screen.Screen
import net.minecraft.network.chat.TextComponent
import no.birkett.kiwi.Solver
open class UIScreen: Screen(TextComponent("UIScreen")) {
val solver = Solver()
val views = mutableListOf<UIView>()
fun addView(view: UIView) {
views.add(view)
view.solver = solver
view.wasAdded()
}
fun layout() {
solver.updateVariables()
views.forEach(UIView::didLayout)
}
override fun render(mouseX: Int, mouseY: Int, delta: Float) {
views.forEach(UIView::draw)
}
}

View File

@ -2,12 +2,12 @@ package net.shadowfacts.shadowui
import com.mojang.blaze3d.platform.GlStateManager
import net.shadowfacts.kiwidsl.dsl
import net.shadowfacts.shadowui.geometry.UIRect
import net.shadowfacts.shadowui.geometry.Rect
import net.shadowfacts.shadowui.util.Color
import net.shadowfacts.shadowui.util.RenderHelper
import no.birkett.kiwi.Solver
class UIView {
class View {
lateinit var solver: Solver
@ -22,21 +22,23 @@ class UIView {
val centerYAnchor = LayoutVariable(this, "centerY")
// The rectangle for this view in the coordinate system of the parent view.
lateinit var frame: UIRect
lateinit var frame: Rect
// The rectangle for this view in its own coordinate system.
lateinit var bounds: UIRect
lateinit var bounds: Rect
var backgroundColor = Color(0xff0000)
var parent: UIView? = null
val subviews = mutableListOf<UIView>()
var parent: View? = null
val subviews = mutableListOf<View>()
fun addSubview(view: UIView) {
fun addSubview(view: View): View {
subviews.add(view)
view.parent = this
view.solver = solver
view.wasAdded()
return view
}
fun wasAdded() {
@ -53,12 +55,12 @@ class UIView {
}
fun didLayout() {
subviews.forEach(UIView::didLayout)
subviews.forEach(View::didLayout)
val parentLeft = parent?.leftAnchor?.value ?: 0.0
val parentTop = parent?.topAnchor?.value ?: 0.0
frame = UIRect(leftAnchor.value - parentLeft, topAnchor.value - parentTop, widthAnchor.value, heightAnchor.value)
bounds = UIRect(0.0, 0.0, widthAnchor.value, heightAnchor.value)
frame = Rect(leftAnchor.value - parentLeft, topAnchor.value - parentTop, widthAnchor.value, heightAnchor.value)
bounds = Rect(0.0, 0.0, widthAnchor.value, heightAnchor.value)
}
fun draw() {
@ -69,7 +71,7 @@ class UIView {
drawContent()
subviews.forEach(UIView::draw)
subviews.forEach(View::draw)
GlStateManager.popMatrix()
}

View File

@ -0,0 +1,30 @@
package net.shadowfacts.shadowui
import net.shadowfacts.shadowui.geometry.Point
import no.birkett.kiwi.Solver
class Window {
var solver = Solver()
val views = mutableListOf<View>()
fun <T: View> addView(view: T): T {
views.add(view)
view.solver = solver
view.wasAdded()
return view
}
fun layout() {
solver.updateVariables()
views.forEach(View::didLayout)
}
fun draw(mouse: Point, delta: Float) {
views.forEach(View::draw)
}
}

View File

@ -0,0 +1,7 @@
package net.shadowfacts.shadowui.geometry
class Point(val x: Double, val y: Double) {
constructor(x: Int, y: Int): this(x.toDouble(), y.toDouble())
}

View File

@ -1,6 +1,6 @@
package net.shadowfacts.shadowui.geometry
data class UIRect(val left: Double, val top: Double, val width: Double, val height: Double) {
data class Rect(val left: Double, val top: Double, val width: Double, val height: Double) {
val right: Double
get() = left + width

View File

@ -1,11 +1,11 @@
package net.shadowfacts.shadowui.util
import net.minecraft.client.gui.DrawableHelper
import net.shadowfacts.shadowui.geometry.UIRect
import net.shadowfacts.shadowui.geometry.Rect
object RenderHelper {
fun fill(rect: UIRect, color: Color) {
fun fill(rect: Rect, color: Color) {
DrawableHelper.fill(rect.left.toInt(), rect.top.toInt(), rect.right.toInt(), rect.bottom.toInt(), color.argb)
}