2
0

GridPlaced.kt 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package eu.mjdev.desktop.components.grid
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.runtime.Composable
  4. import androidx.compose.ui.Modifier
  5. import androidx.compose.ui.layout.Layout
  6. import androidx.compose.ui.unit.Constraints
  7. import eu.mjdev.desktop.components.grid.base.*
  8. import eu.mjdev.desktop.components.grid.base.Measure.calculateCellPlaces
  9. import eu.mjdev.desktop.components.grid.base.Measure.measure
  10. import kotlin.math.min
  11. @Composable
  12. fun GridPlaced(
  13. modifier: Modifier = Modifier,
  14. cells: GridPlacedCells = GridPlacedCells(2, 2),
  15. placementPolicy: GridPlacedPlacementPolicy = GridPlacedPlacementPolicy.DEFAULT,
  16. content: GridPlacedScope.() -> Unit = {}
  17. ) {
  18. val scopeContent: GridPlacedScopeImpl = GridPlacedScopeImpl(cells, placementPolicy).apply(content)
  19. val displayContent: List<GridPlacedContent> = scopeContent.data.toList()
  20. Layout(
  21. modifier = modifier,
  22. content = {
  23. displayContent.forEach { cnt -> cnt.item(GridPlacedItemScopeImpl) }
  24. }
  25. ) { measurables, constraints ->
  26. check(constraints.maxWidth != Constraints.Infinity) { "Infinity width not allowed in GridPad" }
  27. check(constraints.maxHeight != Constraints.Infinity) { "Infinity height not allowed in GridPad" }
  28. val cellPlaces = calculateCellPlaces(cells, width = constraints.maxWidth, height = constraints.maxHeight)
  29. val placeables = measurables.measure(displayContent, cellPlaces, constraints)
  30. val layoutWidth = if (cells.columnsTotalSize.weight == 0f) {
  31. min(constraints.maxWidth, cells.columnsTotalSize.fixed.roundToPx())
  32. } else {
  33. constraints.maxWidth
  34. }
  35. val layoutHeight = if (cells.rowsTotalSize.weight == 0f) {
  36. min(constraints.maxHeight, cells.rowsTotalSize.fixed.roundToPx())
  37. } else {
  38. constraints.maxHeight
  39. }
  40. layout(layoutWidth, layoutHeight) {
  41. placeables.forEachIndexed { index, placeable ->
  42. val contentMetaInfo = displayContent[index]
  43. val cellPlaceInfo = cellPlaces[contentMetaInfo.top][contentMetaInfo.left]
  44. placeable.placeRelative(x = cellPlaceInfo.x, y = cellPlaceInfo.y)
  45. }
  46. }
  47. }
  48. }
  49. @Preview
  50. @Composable
  51. fun GridPlacedPreview() = GridPlaced()