Skip to content

Commit 40e9f63

Browse files
authored
Merge pull request #71 from 658jjh/fix-columnchart-in-ios
Fix column/row chart crash on iOS
2 parents 236af61 + 71916e6 commit 40e9f63

File tree

5 files changed

+59
-28
lines changed

5 files changed

+59
-28
lines changed

compose-charts/src/commonMain/kotlin/ir/ehsannarmani/compose_charts/ColumnChart.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,19 @@ import androidx.compose.animation.core.tween
66
import androidx.compose.foundation.Canvas
77
import androidx.compose.foundation.gestures.detectHorizontalDragGestures
88
import androidx.compose.foundation.gestures.detectTapGestures
9-
import androidx.compose.foundation.layout.*
10-
import androidx.compose.foundation.text.BasicText
11-
import androidx.compose.runtime.*
9+
import androidx.compose.foundation.layout.Column
10+
import androidx.compose.foundation.layout.Row
11+
import androidx.compose.foundation.layout.Spacer
12+
import androidx.compose.foundation.layout.fillMaxSize
13+
import androidx.compose.foundation.layout.height
14+
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.CompositionLocalProvider
16+
import androidx.compose.runtime.LaunchedEffect
17+
import androidx.compose.runtime.mutableFloatStateOf
18+
import androidx.compose.runtime.mutableStateListOf
19+
import androidx.compose.runtime.mutableStateOf
20+
import androidx.compose.runtime.remember
21+
import androidx.compose.runtime.rememberCoroutineScope
1222
import androidx.compose.ui.Modifier
1323
import androidx.compose.ui.geometry.CornerRadius
1424
import androidx.compose.ui.geometry.Offset
@@ -17,18 +27,14 @@ import androidx.compose.ui.geometry.RoundRect
1727
import androidx.compose.ui.geometry.Size
1828
import androidx.compose.ui.graphics.Color
1929
import androidx.compose.ui.graphics.Path
20-
import androidx.compose.ui.graphics.TransformOrigin
2130
import androidx.compose.ui.graphics.drawscope.DrawScope
22-
import androidx.compose.ui.graphics.graphicsLayer
2331
import androidx.compose.ui.input.pointer.pointerInput
2432
import androidx.compose.ui.platform.LocalDensity
2533
import androidx.compose.ui.platform.LocalLayoutDirection
2634
import androidx.compose.ui.text.TextMeasurer
2735
import androidx.compose.ui.text.TextStyle
2836
import androidx.compose.ui.text.drawText
2937
import androidx.compose.ui.text.rememberTextMeasurer
30-
import androidx.compose.ui.text.style.TextOverflow
31-
import androidx.compose.ui.unit.Density
3238
import androidx.compose.ui.unit.LayoutDirection
3339
import androidx.compose.ui.unit.dp
3440
import androidx.compose.ui.unit.sp
@@ -49,6 +55,7 @@ import ir.ehsannarmani.compose_charts.models.LabelHelperProperties
4955
import ir.ehsannarmani.compose_charts.models.LabelProperties
5056
import ir.ehsannarmani.compose_charts.models.PopupProperties
5157
import ir.ehsannarmani.compose_charts.models.SelectedBar
58+
import ir.ehsannarmani.compose_charts.models.asRadiusPx
5259
import ir.ehsannarmani.compose_charts.utils.HorizontalLabels
5360
import ir.ehsannarmani.compose_charts.utils.ImplementRCAnimation
5461
import ir.ehsannarmani.compose_charts.utils.calculateOffset
@@ -331,7 +338,7 @@ fun ColumnChart(
331338
radius = radius.reverse()
332339
}
333340

334-
path.addRoundRect(rect = rect, radius = radius)
341+
path.addRoundRect(rect = rect, radius = radius.asRadiusPx(this))
335342
val alpha = if (rect == selectedValue.value?.rect) {
336343
1f - (barAlphaDecreaseOnPopup * popupAnimation.value)
337344
} else {

compose-charts/src/commonMain/kotlin/ir/ehsannarmani/compose_charts/RowChart.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import ir.ehsannarmani.compose_charts.models.LabelProperties
4949
import ir.ehsannarmani.compose_charts.models.PopupProperties
5050
import ir.ehsannarmani.compose_charts.models.SelectedBar
5151
import ir.ehsannarmani.compose_charts.models.VerticalIndicatorProperties
52+
import ir.ehsannarmani.compose_charts.models.asRadiusPx
5253
import ir.ehsannarmani.compose_charts.utils.ImplementRCAnimation
5354
import ir.ehsannarmani.compose_charts.utils.VerticalLabels
5455
import ir.ehsannarmani.compose_charts.utils.calculateOffset
@@ -312,7 +313,7 @@ fun RowChart(
312313
radius = radius.reverse(horizontal = true)
313314
}
314315

315-
path.addRoundRect(rect = rect, radius = radius)
316+
path.addRoundRect(rect = rect, radius = radius.asRadiusPx(this))
316317

317318
val alpha = if (rect == selectedBar.value?.rect) {
318319
1f - (barAlphaDecreaseOnPopup * popupAnimation.value)

compose-charts/src/commonMain/kotlin/ir/ehsannarmani/compose_charts/extensions/CornerRadius.kt

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,48 @@ import androidx.compose.ui.geometry.CornerRadius
44
import androidx.compose.ui.geometry.Rect
55
import androidx.compose.ui.geometry.RoundRect
66
import androidx.compose.ui.graphics.Path
7-
import androidx.compose.ui.graphics.drawscope.DrawScope
87
import ir.ehsannarmani.compose_charts.models.Bars
98

10-
11-
context(DrawScope)
129
fun Path.addRoundRect(
1310
rect: Rect,
14-
radius: Bars.Data.Radius
11+
radius: Bars.Data.RadiusPx
1512
){
1613
when (radius) {
17-
is Bars.Data.Radius.None -> {
14+
is Bars.Data.RadiusPx.None -> {
1815
addRect(rect)
1916
}
2017

21-
is Bars.Data.Radius.Circular -> {
18+
is Bars.Data.RadiusPx.Circular -> {
2219
addRoundRect(
2320
roundRect = RoundRect(
2421
rect = rect,
2522
cornerRadius = CornerRadius(
26-
x = radius.radius.toPx(),
27-
y = radius.radius.toPx()
23+
x = radius.radius,
24+
y = radius.radius
2825
)
2926
)
3027
)
3128
}
3229

33-
is Bars.Data.Radius.Rectangle -> {
30+
is Bars.Data.RadiusPx.Rectangle -> {
3431
addRoundRect(
3532
roundRect = RoundRect(
3633
rect = rect,
3734
topLeft = CornerRadius(
38-
x = radius.topLeft.toPx(),
39-
y = radius.topLeft.toPx()
35+
x = radius.topLeft,
36+
y = radius.topLeft
4037
),
4138
topRight = CornerRadius(
42-
x = radius.topRight.toPx(),
43-
y = radius.topRight.toPx()
39+
x = radius.topRight,
40+
y = radius.topRight
4441
),
4542
bottomLeft = CornerRadius(
46-
x = radius.bottomLeft.toPx(),
47-
y = radius.bottomLeft.toPx()
43+
x = radius.bottomLeft,
44+
y = radius.bottomLeft
4845
),
4946
bottomRight = CornerRadius(
50-
x = radius.bottomRight.toPx(),
51-
y = radius.bottomRight.toPx()
47+
x = radius.bottomRight,
48+
y = radius.bottomRight
5249
),
5350
)
5451
)

compose-charts/src/commonMain/kotlin/ir/ehsannarmani/compose_charts/models/Bars.kt

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.compose.animation.core.Animatable
44
import androidx.compose.animation.core.AnimationSpec
55
import androidx.compose.animation.core.AnimationVector1D
66
import androidx.compose.ui.graphics.Brush
7-
import androidx.compose.ui.graphics.Color
7+
import androidx.compose.ui.unit.Density
88
import androidx.compose.ui.unit.Dp
99
import androidx.compose.ui.unit.dp
1010
import kotlin.random.Random
@@ -57,5 +57,31 @@ data class Bars(
5757
}
5858
}
5959
}
60+
61+
sealed class RadiusPx {
62+
data object None : RadiusPx()
63+
data class Circular(val radius: Float) : RadiusPx()
64+
data class Rectangle(
65+
val topLeft: Float = 0f,
66+
val topRight: Float = 0f,
67+
val bottomLeft: Float = 0f,
68+
val bottomRight: Float = 0f
69+
) : RadiusPx()
70+
}
71+
}
72+
}
73+
74+
fun Bars.Data.Radius.asRadiusPx(density: Density): Bars.Data.RadiusPx {
75+
with(density) {
76+
return when (this@asRadiusPx) {
77+
is Bars.Data.Radius.None -> Bars.Data.RadiusPx.None
78+
is Bars.Data.Radius.Circular -> Bars.Data.RadiusPx.Circular(radius.toPx())
79+
is Bars.Data.Radius.Rectangle -> Bars.Data.RadiusPx.Rectangle(
80+
topLeft = topLeft.toPx(),
81+
topRight = topRight.toPx(),
82+
bottomLeft = bottomLeft.toPx(),
83+
bottomRight = bottomRight.toPx()
84+
)
6085
}
61-
}
86+
}
87+
}

0 commit comments

Comments
 (0)