Add layout modes to grid panel
This commit is contained in:
parent
a48aaf52ae
commit
e6c9708652
@ -21,22 +21,80 @@ open class GridPanel<out S : Screen>(
|
||||
) : EditablePanel<S>(screen, parent, x, y, width, height) {
|
||||
var columns: Int = columns
|
||||
set(value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
if (field != value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
}
|
||||
}
|
||||
|
||||
var rows: Int = rows
|
||||
set(value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
if (field != value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
}
|
||||
}
|
||||
|
||||
var gravity: RenderGravity = RenderGravity.CENTER_CENTER
|
||||
set(value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
if (field != value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
}
|
||||
}
|
||||
|
||||
var layout: Layout = Layout.TOP_LEFT
|
||||
set(value) {
|
||||
if (field != value) {
|
||||
field = value
|
||||
invalidateLayout()
|
||||
}
|
||||
}
|
||||
|
||||
enum class Layout {
|
||||
TOP_LEFT {
|
||||
override fun rows(last: Int): IntIterator {
|
||||
return (0 until last).iterator()
|
||||
}
|
||||
|
||||
override fun columns(last: Int): IntIterator {
|
||||
return (0 until last).iterator()
|
||||
}
|
||||
},
|
||||
|
||||
TOP_RIGHT {
|
||||
override fun rows(last: Int): IntIterator {
|
||||
return (0 until last).iterator()
|
||||
}
|
||||
|
||||
override fun columns(last: Int): IntIterator {
|
||||
return (last - 1 downTo 1).iterator()
|
||||
}
|
||||
},
|
||||
BOTTOM_LEFT {
|
||||
override fun rows(last: Int): IntIterator {
|
||||
return (last - 1 downTo 1).iterator()
|
||||
}
|
||||
|
||||
override fun columns(last: Int): IntIterator {
|
||||
return (0 until last).iterator()
|
||||
}
|
||||
},
|
||||
|
||||
BOTTOM_RIGHT {
|
||||
override fun rows(last: Int): IntIterator {
|
||||
return (last - 1 downTo 1).iterator()
|
||||
}
|
||||
|
||||
override fun columns(last: Int): IntIterator {
|
||||
return (last - 1 downTo 1).iterator()
|
||||
}
|
||||
};
|
||||
|
||||
abstract fun rows(last: Int): IntIterator
|
||||
abstract fun columns(last: Int): IntIterator
|
||||
}
|
||||
|
||||
override fun sizeToContents() {
|
||||
if (visibleChildren.isEmpty()) {
|
||||
// nothing to size against
|
||||
@ -50,11 +108,11 @@ open class GridPanel<out S : Screen>(
|
||||
|
||||
val children = visibleChildren.iterator().filter { it.dock == Dock.NONE }
|
||||
|
||||
for (row in 0 until rows) {
|
||||
for (row in layout.rows(rows)) {
|
||||
var maxHeight = 0f
|
||||
var rowWidth = 0f
|
||||
|
||||
for (column in 0 until columns) {
|
||||
for (column in layout.columns(columns)) {
|
||||
val nextChild = children.maybe() ?: break
|
||||
rowWidth += nextChild.width + nextChild.dockMargin.horizontal
|
||||
maxHeight = max(maxHeight, nextChild.height + nextChild.dockMargin.vertical)
|
||||
@ -75,11 +133,11 @@ open class GridPanel<out S : Screen>(
|
||||
var totalWidth = 0f
|
||||
var totalHeight = 0f
|
||||
|
||||
for (row in 0 until rows) {
|
||||
for (row in layout.rows(rows)) {
|
||||
var maxHeight = 0f
|
||||
var width = 0f
|
||||
|
||||
for (column in 0 until columns) {
|
||||
for (column in layout.columns(columns)) {
|
||||
val child = children.maybe() ?: break
|
||||
width += child.dockedWidth
|
||||
maxHeight = maxHeight.coerceAtLeast(child.dockedHeight)
|
||||
@ -96,11 +154,11 @@ open class GridPanel<out S : Screen>(
|
||||
totalWidth = 0f
|
||||
totalHeight = 0f
|
||||
|
||||
for (row in 0 until rows) {
|
||||
for (row in layout.rows(rows)) {
|
||||
var maxHeight = 0f
|
||||
var width = 0f
|
||||
|
||||
for (column in 0 until columns) {
|
||||
for (column in layout.columns(columns)) {
|
||||
val child = children.maybe() ?: break
|
||||
child.x = alignX + width
|
||||
child.y = alignY + totalHeight
|
||||
|
Loading…
Reference in New Issue
Block a user