@@ -25,15 +25,15 @@ import androidx.compose.ui.platform.LocalContext
2525import androidx.compose.ui.semantics.contentDescription
2626import androidx.compose.ui.semantics.semantics
2727import androidx.compose.ui.unit.dp
28+ import co.yml.charts.common.components.accessibility.AccessibilityBottomSheetDialog
29+ import co.yml.charts.common.components.accessibility.SliceInfo
30+ import co.yml.charts.common.extensions.collectIsTalkbackEnabledAsState
31+ import co.yml.charts.common.model.PlotType
2832import co.yml.charts.ui.piechart.models.PieChartConfig
2933import co.yml.charts.ui.piechart.models.PieChartData
3034import co.yml.charts.ui.piechart.utils.convertTouchEventPointToAngle
3135import co.yml.charts.ui.piechart.utils.proportion
3236import co.yml.charts.ui.piechart.utils.sweepAngles
33- import co.yml.charts.common.components.accessibility.AccessibilityBottomSheetDialog
34- import co.yml.charts.common.components.accessibility.SliceInfo
35- import co.yml.charts.common.extensions.collectIsTalkbackEnabledAsState
36- import co.yml.charts.common.model.PlotType
3737import kotlinx.coroutines.launch
3838import kotlin.math.roundToInt
3939
@@ -88,8 +88,8 @@ fun DonutPieChart(
8888 Surface (
8989 modifier = modifier
9090 ) {
91- BoxWithConstraints (
92- modifier = modifier
91+ val boxModifier = if (pieChartConfig.isClickOnSliceEnabled) {
92+ modifier
9393 .aspectRatio(1f )
9494 .semantics {
9595 contentDescription = pieChartConfig.accessibilityConfig.chartDescription
@@ -100,7 +100,17 @@ fun DonutPieChart(
100100 accessibilitySheetState.show()
101101 }
102102 }
103- }) {
103+ }
104+ } else {
105+ modifier
106+ .aspectRatio(1f )
107+ .semantics {
108+ contentDescription = pieChartConfig.accessibilityConfig.chartDescription
109+ }
110+ }
111+ BoxWithConstraints (
112+ modifier = boxModifier
113+ ) {
104114
105115 val sideSize = Integer .min(constraints.maxWidth, constraints.maxHeight)
106116 val padding = (sideSize * pieChartConfig.chartPadding) / 100f
@@ -118,12 +128,11 @@ fun DonutPieChart(
118128 }
119129 }
120130
121- Canvas (
122- modifier = Modifier
131+ val canvasModifier = if (pieChartConfig.isClickOnSliceEnabled) {
132+ Modifier
123133 .width(sideSize.dp)
124134 .height(sideSize.dp)
125135 .pointerInput(true ) {
126-
127136 detectTapGestures {
128137 val clickedAngle = convertTouchEventPointToAngle(
129138 sideSize.toFloat(),
@@ -133,14 +142,23 @@ fun DonutPieChart(
133142 )
134143 progressSize.forEachIndexed { index, item ->
135144 if (clickedAngle <= item) {
136- if (activePie != index)
137- activePie = index
145+ activePie = if (activePie != index)
146+ index
147+ else
148+ - 1
138149 onSliceClick(pieChartData.slices[index])
139150 return @detectTapGestures
140151 }
141152 }
142153 }
143154 }
155+ } else {
156+ Modifier
157+ .width(sideSize.dp)
158+ .height(sideSize.dp)
159+ }
160+ Canvas (
161+ modifier = canvasModifier
144162
145163 ) {
146164
@@ -177,6 +195,54 @@ fun DonutPieChart(
177195 }
178196 )
179197 }
198+
199+ when {
200+ activePie != - 1 && pieChartConfig.percentVisible -> {
201+ drawContext.canvas.nativeCanvas.apply {
202+ val fontSize = pieChartConfig.percentageFontSize.toPx()
203+ this .drawText(
204+ " ${proportions[activePie].roundToInt()} %" ,
205+ (sideSize / 2 ) + fontSize / 4 , (sideSize / 2 ) + fontSize / 3 ,
206+ Paint ().apply {
207+ color = pieChartConfig.percentColor.toArgb()
208+ textSize = fontSize
209+ textAlign = Paint .Align .CENTER
210+ typeface = pieChartConfig.percentageTypeface
211+ }
212+ )
213+ }
214+ }
215+ activePie == - 1 && pieChartConfig.isSumVisible -> {
216+ drawContext.canvas.nativeCanvas.apply {
217+ val fontSize = pieChartConfig.percentageFontSize.toPx()
218+ val paint = Paint ().apply {
219+ color = pieChartConfig.percentColor.toArgb()
220+ textSize = fontSize
221+ textAlign = Paint .Align .CENTER
222+ typeface = pieChartConfig.percentageTypeface
223+ }
224+ val x: Float = (sideSize / 2 ).toFloat()
225+ var y: Float = (sideSize / 2 ).toFloat() + fontSize / 3
226+ if (pieChartConfig.sumUnit.isNotEmpty()){
227+ y - = (paint.fontSpacing / 4 )
228+ }
229+ this .drawText(
230+ " $sumOfValues " ,
231+ x,
232+ y,
233+ paint
234+ )
235+ y + = paint.fontSpacing
236+ this .drawText(
237+ pieChartConfig.sumUnit,
238+ x,
239+ y,
240+ paint
241+ )
242+ }
243+ }
244+
245+ }
180246 }
181247 }
182248 if (isTalkBackEnabled) {
0 commit comments