Guest User

Untitled

a guest
Apr 12th, 2023
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.59 KB | None | 0 0
  1. package org.chsrobotics.dash
  2.  
  3. import androidx.compose.runtime.Composable
  4. import androidx.compose.runtime.Stable
  5. import androidx.compose.ui.Modifier
  6. import androidx.compose.ui.layout.Layout
  7. import androidx.compose.ui.layout.Measurable
  8. import androidx.compose.ui.layout.ParentDataModifier
  9. import androidx.compose.ui.unit.Constraints
  10. import androidx.compose.ui.unit.Density
  11.  
  12. data class GridLayout(
  13.     val column: Int,
  14.     val row: Int,
  15.     val columnSpan: Int,
  16.     val rowSpan: Int
  17. )
  18.  
  19. interface GridScope {
  20.     @Stable
  21.     fun Modifier.grid(column: Int, row: Int, columnSpan: Int = 1, rowSpan: Int = 1) = this.then(
  22.         GridData(column, row, columnSpan, rowSpan)
  23.     )
  24.     @Stable
  25.     fun Modifier.grid(layout: GridLayout) = this.then(
  26.         GridData(layout.column, layout.row, layout.columnSpan, layout.rowSpan)
  27.     )
  28.  
  29.     companion object : GridScope
  30. }
  31.  
  32. private class GridData(
  33.     val column: Int,
  34.     val row: Int,
  35.     val columnSpan: Int,
  36.     val rowSpan: Int,
  37. ) : ParentDataModifier {
  38.  
  39.     override fun Density.modifyParentData(parentData: Any?): Any = this@GridData
  40.  
  41.     override fun equals(other: Any?): Boolean {
  42.         if (this === other) return true
  43.         if (javaClass != other?.javaClass) return false
  44.  
  45.         other as GridData
  46.  
  47.         if (columnSpan != other.columnSpan) return false
  48.         if (rowSpan != other.rowSpan) return false
  49.  
  50.         return true
  51.     }
  52.  
  53.     override fun hashCode(): Int {
  54.         var result = columnSpan
  55.         result = 31 * result + rowSpan
  56.         return result
  57.     }
  58. }
  59.  
  60. private val Measurable.gridData: GridData?
  61.     get() = parentData as? GridData
  62.  
  63. private val Measurable.columnSpan: Int
  64.     get() = gridData?.columnSpan ?: 1
  65.  
  66. private val Measurable.rowSpan: Int
  67.     get() = gridData?.rowSpan ?: 1
  68.  
  69. data class GridInfo(
  70.     val numChildren: Int,
  71.     val columnSpan: Int,
  72.     val rowSpan: Int,
  73. )
  74.  
  75. @Composable
  76. fun Grid(
  77.     columns: Int,
  78.     rows: Int,
  79.     modifier: Modifier = Modifier,
  80.     content: @Composable GridScope.() -> Unit,
  81. ) {
  82.     println("CALLING GRId")
  83.     check(columns > 0) { "Columns must be greater than 0" }
  84.     check(rows > 0) { "Rows must be greater than 0" }
  85.     Layout(
  86.         content = { GridScope.content() },
  87.         modifier = modifier,
  88.     ) { measurables, constraints ->
  89.         val standardGrid = GridData(0, 0, 1, 1)
  90.         val spans = measurables.map { measurable -> measurable.gridData ?: standardGrid }
  91.  
  92.         spans.forEach {
  93.             println(it.column)
  94.         }
  95.  
  96.         // build constraints
  97.         val baseConstraints = Constraints.fixed(
  98.             width = constraints.maxWidth / columns,
  99.             height = constraints.maxHeight / rows,
  100.         )
  101.         val cellConstraints = measurables.map { measurable ->
  102.             val columnSpan = measurable.columnSpan
  103.             val rowSpan = measurable.rowSpan
  104.             Constraints.fixed(
  105.                 width = baseConstraints.maxWidth * columnSpan,
  106.                 height = baseConstraints.maxHeight * rowSpan
  107.             )
  108.         }
  109.  
  110.         // measure children
  111.         val placeables = measurables.mapIndexed { index, measurable ->
  112.             measurable.measure(cellConstraints[index])
  113.         }
  114.  
  115.         layout(
  116.             width = constraints.maxWidth,
  117.             height = constraints.maxHeight,
  118.         ) {
  119.             placeables.forEachIndexed { i, placeable ->
  120.                 placeable.placeRelative(
  121.                     x = spans[i].column * baseConstraints.maxWidth,
  122.                     y = spans[i].row * baseConstraints.maxHeight
  123.                 )
  124.             }
  125.         }
  126.     }
  127. }
  128.  
Advertisement
Add Comment
Please, Sign In to add comment