PowerBlock.kt 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package eu.mjdev.desktop.components.custom
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.Image
  4. import androidx.compose.foundation.background
  5. import androidx.compose.foundation.layout.*
  6. import androidx.compose.foundation.shape.CircleShape
  7. import androidx.compose.material.Button
  8. import androidx.compose.material.ButtonDefaults
  9. import androidx.compose.material.icons.Icons
  10. import androidx.compose.material.icons.filled.SettingsPower
  11. import androidx.compose.runtime.Composable
  12. import androidx.compose.ui.Alignment
  13. import androidx.compose.ui.Modifier
  14. import androidx.compose.ui.graphics.Color
  15. import androidx.compose.ui.graphics.ColorFilter
  16. import androidx.compose.ui.unit.Dp
  17. import androidx.compose.ui.unit.dp
  18. import eu.mjdev.desktop.extensions.ColorUtils.alpha
  19. import eu.mjdev.desktop.extensions.Compose.noElevation
  20. import eu.mjdev.desktop.extensions.Compose.transparent
  21. import eu.mjdev.desktop.extensions.Modifier.circleBorder
  22. import eu.mjdev.desktop.extensions.Modifier.circleShadow
  23. import eu.mjdev.desktop.extensions.Modifier.clipCircle
  24. import eu.mjdev.desktop.extensions.Modifier.rectShadow
  25. import eu.mjdev.desktop.helpers.shape.BarShape
  26. import eu.mjdev.desktop.provider.DesktopScope.Companion.withDesktopScope
  27. @Composable
  28. fun PowerBlock(
  29. backgroundColor: Color = Color.Transparent,
  30. shadowColor: Color = Color.Black.copy(alpha = 0.3f),
  31. bottomBoxHeight: Dp = 128.dp,
  32. iconHeight: Dp = 64.dp,
  33. onPowerButtonClick: () -> Unit = {}
  34. ) = withDesktopScope {
  35. Column(
  36. modifier = Modifier.fillMaxWidth()
  37. ) {
  38. BoxWithConstraints(
  39. modifier = Modifier
  40. .fillMaxWidth()
  41. .height(bottomBoxHeight),
  42. contentAlignment = Alignment.BottomCenter
  43. ) {
  44. val shape = BarShape(
  45. offset = (minWidth / 2).value,
  46. circleRadius = 24.dp,
  47. cornerRadius = 4.dp,
  48. circleGap = 8.dp,
  49. )
  50. Box(
  51. modifier = Modifier
  52. .fillMaxWidth()
  53. .height(iconHeight)
  54. .rectShadow(color = shadowColor)
  55. .background(backgroundColor, shape)
  56. )
  57. Button(
  58. modifier = Modifier
  59. .padding(bottom = 36.dp)
  60. .size(64.dp)
  61. .clipCircle()
  62. .circleBorder(2.dp, textColor.alpha(0.5f))
  63. .circleShadow(4.dp, Color.Black),
  64. contentPadding = PaddingValues(1.dp),
  65. onClick = onPowerButtonClick,
  66. colors = ButtonDefaults.transparent(),
  67. elevation = ButtonDefaults.noElevation()
  68. ) {
  69. Image(
  70. modifier = Modifier
  71. .size(64.dp)
  72. .background(backgroundColor, CircleShape)
  73. .clipCircle()
  74. .padding(8.dp),
  75. imageVector = Icons.Filled.SettingsPower,
  76. contentDescription = "",
  77. colorFilter = ColorFilter.tint(textColor)
  78. )
  79. }
  80. }
  81. }
  82. }
  83. @Preview
  84. @Composable
  85. fun PowerBlockPreview() = PowerBlock()