DonutChart.kt 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package eu.mjdev.desktop.components.charts
  2. import androidx.compose.animation.core.AnimationSpec
  3. import androidx.compose.animation.core.TweenSpec
  4. import androidx.compose.desktop.ui.tooling.preview.Preview
  5. import androidx.compose.runtime.Composable
  6. import androidx.compose.runtime.LaunchedEffect
  7. import androidx.compose.runtime.getValue
  8. import androidx.compose.runtime.setValue
  9. import androidx.compose.ui.Modifier
  10. import androidx.compose.ui.graphics.Color
  11. import androidx.compose.ui.text.TextStyle
  12. import com.aay.compose.baseComponents.model.LegendPosition
  13. import com.aay.compose.donutChart.DonutChart
  14. import com.aay.compose.donutChart.model.PieChartData
  15. import eu.mjdev.desktop.extensions.Compose.rememberState
  16. import kotlinx.coroutines.delay
  17. import kotlinx.coroutines.isActive
  18. @Suppress("FunctionName")
  19. @Preview
  20. @Composable
  21. fun DonutChart(
  22. modifier: Modifier = Modifier,
  23. title: String = "",
  24. textColor: Color = Color.White,
  25. outerCircularColor: Color = Color.White,
  26. innerCircularColor: Color = Color.White,
  27. ratioLineColor: Color = Color.White,
  28. animationDuration: Int = 3000,
  29. refreshTimeout: Long = 5000L,
  30. animation: AnimationSpec<Float> = TweenSpec(durationMillis = animationDuration),
  31. legendPosition: LegendPosition = LegendPosition.BOTTOM,
  32. dataHandler: () -> List<PieChartData>
  33. ) {
  34. var data by rememberState(dataHandler())
  35. val textStyle by rememberState(TextStyle(color = textColor))
  36. DonutChart(
  37. modifier = modifier,
  38. pieChartData = data,
  39. centerTitle = title,
  40. centerTitleStyle = textStyle,
  41. descriptionStyle = textStyle,
  42. textRatioStyle = textStyle,
  43. outerCircularColor = outerCircularColor,
  44. innerCircularColor = innerCircularColor,
  45. ratioLineColor = ratioLineColor,
  46. animation = animation,
  47. legendPosition = legendPosition
  48. )
  49. LaunchedEffect(Unit) {
  50. while (isActive) {
  51. dataHandler().let { newData ->
  52. if (data != newData) {
  53. data = newData
  54. }
  55. }
  56. delay(refreshTimeout)
  57. }
  58. }
  59. }