Skip to content

Commit 600d755

Browse files
display sum with unit on demand, enable click on slice on demand
1 parent 856e7f5 commit 600d755

File tree

3 files changed

+91
-17
lines changed

3 files changed

+91
-17
lines changed

YChartsLib/src/main/java/co/yml/charts/ui/piechart/charts/DonuPieChart.kt renamed to YChartsLib/src/main/java/co/yml/charts/ui/piechart/charts/DonutPieChart.kt

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ import androidx.compose.ui.platform.LocalContext
2525
import androidx.compose.ui.semantics.contentDescription
2626
import androidx.compose.ui.semantics.semantics
2727
import 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
2832
import co.yml.charts.ui.piechart.models.PieChartConfig
2933
import co.yml.charts.ui.piechart.models.PieChartData
3034
import co.yml.charts.ui.piechart.utils.convertTouchEventPointToAngle
3135
import co.yml.charts.ui.piechart.utils.proportion
3236
import 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
3737
import kotlinx.coroutines.launch
3838
import 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) {

YChartsLib/src/main/java/co/yml/charts/ui/piechart/models/PieChartConfig.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import androidx.compose.ui.unit.Dp
88
import androidx.compose.ui.unit.TextUnit
99
import androidx.compose.ui.unit.dp
1010
import androidx.compose.ui.unit.sp
11+
import co.yml.charts.common.model.AccessibilityConfig
1112
import co.yml.charts.ui.piechart.PieChartConstants
1213
import co.yml.charts.ui.piechart.PieChartConstants.DEFAULT_PADDING
1314
import co.yml.charts.ui.piechart.PieChartConstants.DEFAULT_SLICE_LABEL_TEXT_SIZE
1415
import co.yml.charts.ui.piechart.PieChartConstants.DEFAULT_START_ANGLE
1516
import co.yml.charts.ui.piechart.PieChartConstants.DEFAULT_STROKE_WIDTH
16-
import co.yml.charts.common.model.AccessibilityConfig
1717

1818
/**
1919
* PieChartConfig data class used to mention all config related param required to draw PieChart.
@@ -36,6 +36,9 @@ import co.yml.charts.common.model.AccessibilityConfig
3636
* @param sliceLabelEllipsizeAt: Position at which the label will be truncated or ellipsized
3737
* @param chartPadding: Padding for the Pie chart/Donut Chart
3838
* @param accessibilityConfig: Configs related to accessibility service defined here in [AccessibilityConfig]
39+
* @param isSumVisible: When no slice is selected show the sum of values
40+
* @param isClickOnSliceEnabled: Enable/Disable the click on slice
41+
* @param sumUnit: The unit of the sum of values
3942
*/
4043
data class PieChartConfig(
4144
val startAngle: Float = DEFAULT_START_ANGLE,
@@ -58,5 +61,8 @@ data class PieChartConfig(
5861
val chartPadding: Int = DEFAULT_PADDING,
5962
val accessibilityConfig: AccessibilityConfig = AccessibilityConfig(
6063
chartDescription = PieChartConstants.DESCRIPTION
61-
)
64+
),
65+
val isSumVisible: Boolean = false,
66+
val sumUnit: String = "",
67+
val isClickOnSliceEnabled: Boolean = true
6268
)

app/src/main/java/co/yml/ycharts/app/presentation/DonutChartActivity.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import androidx.compose.ui.platform.LocalContext
1616
import androidx.compose.ui.res.stringResource
1717
import androidx.compose.ui.unit.dp
1818
import androidx.compose.ui.unit.sp
19+
import co.yml.charts.common.components.Legends
20+
import co.yml.charts.common.utils.DataUtils
1921
import co.yml.charts.ui.piechart.charts.DonutPieChart
2022
import co.yml.charts.ui.piechart.models.PieChartConfig
2123
import co.yml.charts.ui.piechart.utils.proportion
22-
import co.yml.charts.common.components.Legends
23-
import co.yml.charts.common.utils.DataUtils
2424
import co.yml.ycharts.app.R
2525
import co.yml.ycharts.app.ui.compositions.AppBarWithBackButton
2626
import co.yml.ycharts.app.ui.theme.YChartsTheme
@@ -79,7 +79,9 @@ private fun DonutChart1(context: Context) {
7979
percentageTypeface = Typeface.defaultFromStyle(Typeface.BOLD),
8080
isAnimationEnable = true,
8181
chartPadding = 25,
82-
percentageFontSize = 42.sp
82+
percentageFontSize = 42.sp,
83+
isSumVisible = true,
84+
sumUnit = "Unit"
8385
)
8486
Column {
8587
Legends(legendsConfig = DataUtils.getLegendsConfigFromPieChartData(pieChartData = data, 3))

0 commit comments

Comments
 (0)