Show graph

This commit is contained in:
2023-07-02 22:55:44 +02:00
parent ff5495249f
commit 6fe4e1f790
3 changed files with 109 additions and 2 deletions

View File

@@ -50,7 +50,7 @@ fun Landscape(viewModel: ICounterViewModel) {
viewModel.totalScoreB
)
RoundListView(
RoundGraphView(
viewModel.roundScoreList,
Modifier.weight(1f)
)
@@ -81,7 +81,7 @@ fun Portrait(viewModel: ICounterViewModel) {
viewModel.totalScoreB
)
RoundListView(
RoundGraphView(
viewModel.roundScoreList,
Modifier.weight(1f)
)

View File

@@ -0,0 +1,106 @@
package me.zobrist.tichucounter.ui.counter
import android.content.res.Configuration
import android.graphics.Color
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.tooling.preview.Preview
import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis
import com.patrykandpatrick.vico.compose.axis.vertical.endAxis
import com.patrykandpatrick.vico.compose.axis.vertical.startAxis
import com.patrykandpatrick.vico.compose.chart.Chart
import com.patrykandpatrick.vico.compose.chart.line.lineChart
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec
import com.patrykandpatrick.vico.compose.m3.style.m3ChartStyle
import com.patrykandpatrick.vico.compose.style.ProvideChartStyle
import com.patrykandpatrick.vico.compose.style.currentChartStyle
import com.patrykandpatrick.vico.core.axis.axisBuilder
import com.patrykandpatrick.vico.core.axis.formatter.DecimalFormatAxisValueFormatter
import com.patrykandpatrick.vico.core.axis.vertical.VerticalAxis
import com.patrykandpatrick.vico.core.chart.composed.plus
import com.patrykandpatrick.vico.core.chart.line.LineChart
import com.patrykandpatrick.vico.core.chart.values.AxisValuesOverrider
import com.patrykandpatrick.vico.core.component.text.TextComponent
import com.patrykandpatrick.vico.core.entry.FloatEntry
import com.patrykandpatrick.vico.core.entry.composed.ComposedChartEntryModelProducer.Companion.composedChartEntryModelOf
import com.patrykandpatrick.vico.core.entry.entryModelOf
import com.patrykandpatrick.vico.core.extension.ceil
import com.patrykandpatrick.vico.core.extension.round
import com.patrykandpatrick.vico.core.legend.Legend
import me.zobrist.tichucounter.data.entity.Round
import me.zobrist.tichucounter.ui.AppTheme
import java.lang.Math.round
import kotlin.math.ceil
import kotlin.math.floor
import kotlin.math.roundToInt
@Composable
fun RoundGraphView(rounds: List<Round>, modifier: Modifier) {
val points = getPoints(rounds)
val range = getRange(points.first, points.second, 50)
val specA = LineChart.LineSpec(MaterialTheme.colorScheme.primary.toArgb())
val specB = LineChart.LineSpec(MaterialTheme.colorScheme.secondary.toArgb())
Chart(
chart = lineChart(lines = listOf(specA, specB), axisValuesOverrider = AxisValuesOverrider.fixed(minY = range.first.toFloat(), maxY = range.second.toFloat())),
model = composedChartEntryModelOf(listOf(entryModelOf(points.first), entryModelOf(points.second))),
startAxis = startAxis(maxLabelCount = 10, valueFormatter = DecimalFormatAxisValueFormatter("#")),
chartScrollSpec = rememberChartScrollSpec(isScrollEnabled = false),
modifier = modifier
)
}
private fun getPoints(rounds: List<Round>): Pair<List<FloatEntry>, List<FloatEntry>> {
var a = mutableListOf(FloatEntry(0f,0f))
var b = mutableListOf(FloatEntry(0f,0f))
var sumA = 0
var sumB = 0
rounds.forEachIndexed { index, round ->
sumA += round.scoreA
sumB += round.scoreB
a.add(FloatEntry((index + 1).toFloat(), sumA.toFloat()))
b.add(FloatEntry((index + 1).toFloat(), sumB.toFloat()))
}
return Pair(a, b)
}
private fun getRange(a: List<FloatEntry>, b: List<FloatEntry>, step: Int): Pair<Float, Float> {
var min = (a + b).minBy { it -> it.y }
var max = (a + b).maxBy { it -> it.y }
var lo = floor(min.y / step) * step
var hi = ceil(max.y / step) * step
return Pair(lo.toFloat(), hi.toFloat())
}
@Preview(name = "Light Mode")
@Preview(name = "Dark Mode", uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true)
@Composable
fun RoundGraphViewPreview() {
val rounds = listOf(
Round(1, 10, -10),
Round(1, 5, 95),
Round(1, 100, 0),
Round(1, 125, -25),
Round(1, 50, 50)
)
AppTheme {
Surface {
RoundGraphView(rounds, Modifier)
}
}
}