Add View intrinsic content size
This commit is contained in:
parent
e28daf3b4a
commit
349c09f630
|
@ -4,6 +4,7 @@ import net.shadowfacts.kiwidsl.dsl
|
||||||
import net.shadowfacts.shadowui.Screen
|
import net.shadowfacts.shadowui.Screen
|
||||||
import net.shadowfacts.shadowui.View
|
import net.shadowfacts.shadowui.View
|
||||||
import net.shadowfacts.shadowui.Window
|
import net.shadowfacts.shadowui.Window
|
||||||
|
import net.shadowfacts.shadowui.geometry.Size
|
||||||
import net.shadowfacts.shadowui.util.Color
|
import net.shadowfacts.shadowui.util.Color
|
||||||
|
|
||||||
class TestScreen: Screen() {
|
class TestScreen: Screen() {
|
||||||
|
@ -22,6 +23,7 @@ class TestScreen: Screen() {
|
||||||
val purple = green.addSubview(View().apply {
|
val purple = green.addSubview(View().apply {
|
||||||
backgroundColor = Color(0x800080)
|
backgroundColor = Color(0x800080)
|
||||||
})
|
})
|
||||||
|
purple.intrinsicContentSize = Size(width = 150.0, height = 150.0)
|
||||||
|
|
||||||
solver.dsl {
|
solver.dsl {
|
||||||
red.leftAnchor equalTo 0
|
red.leftAnchor equalTo 0
|
||||||
|
@ -39,8 +41,8 @@ class TestScreen: Screen() {
|
||||||
blue.topAnchor equalTo (green.topAnchor + green.heightAnchor)
|
blue.topAnchor equalTo (green.topAnchor + green.heightAnchor)
|
||||||
blue.heightAnchor equalTo 50
|
blue.heightAnchor equalTo 50
|
||||||
|
|
||||||
purple.widthAnchor equalTo 100
|
// purple.widthAnchor equalTo 100
|
||||||
purple.heightAnchor equalTo 100
|
// purple.heightAnchor equalTo 100
|
||||||
purple.centerXAnchor equalTo green.centerXAnchor
|
purple.centerXAnchor equalTo green.centerXAnchor
|
||||||
purple.centerYAnchor equalTo green.centerYAnchor
|
purple.centerYAnchor equalTo green.centerYAnchor
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,10 @@ package net.shadowfacts.shadowui
|
||||||
import com.mojang.blaze3d.platform.GlStateManager
|
import com.mojang.blaze3d.platform.GlStateManager
|
||||||
import net.shadowfacts.kiwidsl.dsl
|
import net.shadowfacts.kiwidsl.dsl
|
||||||
import net.shadowfacts.shadowui.geometry.Rect
|
import net.shadowfacts.shadowui.geometry.Rect
|
||||||
|
import net.shadowfacts.shadowui.geometry.Size
|
||||||
import net.shadowfacts.shadowui.util.Color
|
import net.shadowfacts.shadowui.util.Color
|
||||||
import net.shadowfacts.shadowui.util.RenderHelper
|
import net.shadowfacts.shadowui.util.RenderHelper
|
||||||
|
import no.birkett.kiwi.Constraint
|
||||||
import no.birkett.kiwi.Solver
|
import no.birkett.kiwi.Solver
|
||||||
|
|
||||||
class View {
|
class View {
|
||||||
|
@ -26,6 +28,14 @@ class View {
|
||||||
// The rectangle for this view in its own coordinate system.
|
// The rectangle for this view in its own coordinate system.
|
||||||
lateinit var bounds: Rect
|
lateinit var bounds: Rect
|
||||||
|
|
||||||
|
var intrinsicContentSize: Size? = null
|
||||||
|
set(value) {
|
||||||
|
updateIntrinsicContentSizeConstraints(intrinsicContentSize, value)
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
private var intrinsicContentSizeWidthConstraint: Constraint? = null
|
||||||
|
private var intrinsicContentSizeHeightConstraint: Constraint? = null
|
||||||
|
|
||||||
var backgroundColor = Color(0xff0000)
|
var backgroundColor = Color(0xff0000)
|
||||||
|
|
||||||
var parent: View? = null
|
var parent: View? = null
|
||||||
|
@ -54,6 +64,19 @@ class View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateIntrinsicContentSizeConstraints(old: Size?, new: Size?) {
|
||||||
|
if (old != null) {
|
||||||
|
solver.removeConstraint(intrinsicContentSizeWidthConstraint!!)
|
||||||
|
solver.removeConstraint(intrinsicContentSizeHeightConstraint!!)
|
||||||
|
}
|
||||||
|
if (new != null) {
|
||||||
|
solver.dsl {
|
||||||
|
this@View.intrinsicContentSizeWidthConstraint = (widthAnchor.equalTo(new.width, strength = WEAK))
|
||||||
|
this@View.intrinsicContentSizeHeightConstraint = (heightAnchor.equalTo(new.height, strength = WEAK))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun didLayout() {
|
fun didLayout() {
|
||||||
subviews.forEach(View::didLayout)
|
subviews.forEach(View::didLayout)
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,29 @@ package net.shadowfacts.shadowui.geometry
|
||||||
|
|
||||||
data class Rect(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
|
val right: Double by lazy {
|
||||||
get() = left + width
|
left + width
|
||||||
val bottom: Double
|
}
|
||||||
get() = top + height
|
val bottom: Double by lazy {
|
||||||
|
top + height
|
||||||
|
}
|
||||||
|
|
||||||
val midX: Double
|
val midX: Double by lazy {
|
||||||
get() = left + width / 2
|
left + width / 2
|
||||||
val midY: Double
|
}
|
||||||
get() = top + height / 2
|
val midY: Double by lazy {
|
||||||
|
top + height / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
val origin: Point by lazy {
|
||||||
|
Point(left, top)
|
||||||
|
}
|
||||||
|
val center: Point by lazy {
|
||||||
|
Point(midX, midY)
|
||||||
|
}
|
||||||
|
|
||||||
|
val size: Size by lazy {
|
||||||
|
Size(width, height)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
package net.shadowfacts.shadowui.geometry
|
||||||
|
|
||||||
|
data class Size(val width: Double, val height: Double)
|
Loading…
Reference in New Issue