Skip to content

Commit

Permalink
Support RTL in drawTimeAxis
Browse files Browse the repository at this point in the history
  • Loading branch information
davidtakac committed Jan 29, 2025
1 parent 5680e78 commit 012493e
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,20 @@ import androidx.compose.ui.graphics.PathEffect
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.text.TextMeasurer
import androidx.compose.ui.text.drawText
import androidx.compose.ui.unit.LayoutDirection
import java.time.LocalTime

fun DrawScope.drawTimeAxis(
measurer: TextMeasurer,
args: GraphArgs,
layoutDirection: LayoutDirection = LayoutDirection.Ltr,
onStepDrawn: (index: Int, x: Float) -> Unit
) {
for (i in 0..24) {
val x = ((i.toFloat() / 24) * (size.width - args.endGutter - args.startGutter)) + args.startGutter
val xPercent = if (layoutDirection == LayoutDirection.Ltr) i / 24f else 1 - (i / 24f)
val xOffset = if (layoutDirection == LayoutDirection.Ltr) args.startGutter else args.endGutter - args.startGutter
val plotWidth = size.width - args.endGutter - args.startGutter
val x = xPercent * plotWidth + xOffset
fun drawTimeHelperLine(onEdge: Boolean) {
drawLine(
color = args.axisColor,
Expand All @@ -43,13 +48,22 @@ fun DrawScope.drawTimeAxis(
)
drawTimeHelperLine(onEdge = i == 0 || i == 24)
if (i != 24) {
val textTopLeftX =
if (layoutDirection == LayoutDirection.Ltr) x + args.bottomAxisTextPaddingStart
else x - label.size.width - args.bottomAxisTextPaddingStart
val textTopLeftXMin =
if (layoutDirection == LayoutDirection.Ltr) args.startGutter + args.textPaddingMinHorizontal
else args.endGutter + args.textPaddingMinHorizontal
val textTopLeftXMax =
if (layoutDirection == LayoutDirection.Ltr) size.width - args.endGutter - label.size.width - args.textPaddingMinHorizontal
else size.width - args.startGutter - label.size.width - args.textPaddingMinHorizontal
drawText(
textLayoutResult = label,
color = args.axisColor,
topLeft = Offset(
x = (x + args.bottomAxisTextPaddingLeft).coerceIn(
minimumValue = args.startGutter + args.textPaddingMinHorizontal,
maximumValue = size.width - args.endGutter - label.size.width - args.textPaddingMinHorizontal
x = textTopLeftX.coerceIn(
minimumValue = textTopLeftXMin,
maximumValue = textTopLeftXMax
),
y = size.height - args.bottomGutter + args.bottomAxisTextPaddingTop
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ data class GraphArgs(
val axisTextStyle: TextStyle,
val axisColor: Color,
val axisDashIntervals: List<Float>,
val bottomAxisTextPaddingLeft: Float,
val bottomAxisTextPaddingStart: Float,
val bottomAxisTextPaddingTop: Float,
val endAxisTextPaddingStart: Float,
val pointTextPaddingBottom: Float,
Expand Down Expand Up @@ -85,11 +85,11 @@ data class GraphArgs(
axisTextStyle = typography.bodySmall,
axisColor = colorScheme.onSurfaceVariant,
axisDashIntervals = listOf(4.dp, 2.dp).map { it.toPx() },
bottomAxisTextPaddingLeft = axisTextPadding,
bottomAxisTextPaddingStart = axisTextPadding,
bottomAxisTextPaddingTop = axisTextPadding,
endAxisTextPaddingStart = axisTextPadding,
pointTextPaddingBottom = axisTextPadding,
textPaddingMinHorizontal = 2.dp.toPx(),
textPaddingMinHorizontal = axisTextPadding,
numberFormat = numberFormat,
axisTimeFormatter = dateTimeFormatter,
pointCenterRadius = pointCenterRadius,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ fun TemperatureGraph(
val context = LocalContext.current
val measurer = rememberTextMeasurer()
val plotColors = AppTheme.colors.temperatureColors(minCelsius, maxCelsius)
val layoutDirection = LocalLayoutDirection.current
Canvas(modifier) {
drawTempAxis(
unit = absMinTemp.unit,
Expand All @@ -91,6 +92,7 @@ fun TemperatureGraph(
context = context,
measurer = measurer,
plotColors = plotColors,
layoutDirection = layoutDirection,
args = args
)
}
Expand All @@ -103,6 +105,7 @@ private fun DrawScope.drawHorizontalAxisAndPlot(
maxCelsius: Double,
context: Context,
measurer: TextMeasurer,
layoutDirection: LayoutDirection,
args: GraphArgs
) {
val iconSize = 24.dp.toPx()
Expand All @@ -125,6 +128,7 @@ private fun DrawScope.drawHorizontalAxisAndPlot(

drawTimeAxis(
measurer = measurer,
layoutDirection = layoutDirection,
args = args
) { i, x ->
// Temperature line
Expand Down

0 comments on commit 012493e

Please sign in to comment.