diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/DigiPlot/src/main/java/ir/hfathi/digiplot/line/LineGraph.kt b/DigiPlot/src/main/java/ir/hfathi/digiplot/line/LineGraph.kt index bd1e290..2b7dbbd 100644 --- a/DigiPlot/src/main/java/ir/hfathi/digiplot/line/LineGraph.kt +++ b/DigiPlot/src/main/java/ir/hfathi/digiplot/line/LineGraph.kt @@ -36,7 +36,8 @@ import kotlin.math.ceil @Composable fun LineGraph( - plot: LinePlot, modifier: Modifier = Modifier, + plot: LinePlot, + modifier: Modifier = Modifier, onSelectionStart: () -> Unit = {}, onSelectionEnd: () -> Unit = {}, onSelection: ((Float, List) -> Unit)? = null @@ -235,7 +236,7 @@ fun LineGraph( val displayCurrentXValue = "$${dataModel.y}" maxMinLabelModel.draw.invoke( this, - "$${dataModel.y}", + displayCurrentXValue, getMinimumXTextOffset( sizeWidth = size.width, textWidth = maxMinLabelModel.paint.measureText( diff --git a/app/src/main/java/ir/hfathi/digiplotsample/MainActivity.kt b/app/src/main/java/ir/hfathi/digiplotsample/MainActivity.kt index 97d0f1e..81c740d 100644 --- a/app/src/main/java/ir/hfathi/digiplotsample/MainActivity.kt +++ b/app/src/main/java/ir/hfathi/digiplotsample/MainActivity.kt @@ -8,49 +8,39 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import ir.hfathi.digiplot.line.DataPoint -import ir.hfathi.digiplotsample.DataPoints.dataPoints2 +import ir.hfathi.digiplotsample.data.DataPoints.dataPoints2 +import ir.hfathi.digiplotsample.sample.LineGraphSample1 import ir.hfathi.digiplotsample.ui.theme.DigiPlotSampleTheme -import ir.hfathi.digiplotsample.ui.theme.md_blue_gray +import ir.hfathi.digiplotsample.ui.theme.md_light_gray class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { DigiPlotSampleTheme { - // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - Column { - LineGraphSample1(listOf(dataPoints2)) + Column(modifier = Modifier.background(md_light_gray)) { + Card( + modifier = Modifier + .padding(16.dp), + shape = MaterialTheme.shapes.medium, + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + LineGraphSample1(lines = listOf(dataPoints2)) + } } } } } } } - - -@Composable -private fun LineGraphSample1(lines: List>){ - Card( - modifier = Modifier.padding(16.dp).background(md_blue_gray), - shape = MaterialTheme.shapes.medium, - ) { - LineGraphSample(lines) - } -} -@Composable -@Preview -fun LineGraphSample1Preview(){ - LineGraphSample1(listOf(dataPoints2)) -} diff --git a/app/src/main/java/ir/hfathi/digiplotsample/DataPoints.kt b/app/src/main/java/ir/hfathi/digiplotsample/data/DataPoints.kt similarity index 90% rename from app/src/main/java/ir/hfathi/digiplotsample/DataPoints.kt rename to app/src/main/java/ir/hfathi/digiplotsample/data/DataPoints.kt index 64950c1..e37c193 100644 --- a/app/src/main/java/ir/hfathi/digiplotsample/DataPoints.kt +++ b/app/src/main/java/ir/hfathi/digiplotsample/data/DataPoints.kt @@ -1,4 +1,4 @@ -package ir.hfathi.digiplotsample +package ir.hfathi.digiplotsample.data import ir.hfathi.digiplot.line.DataPoint @@ -13,21 +13,21 @@ object DataPoints { DataPoint(6f, 75f), DataPoint(7f, 100f), DataPoint(8f, 80f), -// DataPoint(9f, 75f), -// DataPoint(10f, 55f), -// DataPoint(11f, 45f), -// DataPoint(12f, 50f), -// DataPoint(13f, 80f), -// DataPoint(14f, 70f), -// DataPoint(15f, 125f), -// DataPoint(16f, 200f), -// DataPoint(17f, 170f), -// DataPoint(18f, 135f), -// DataPoint(19f, 60f), -// DataPoint(20f, 20f), -// DataPoint(21f, 40f), -// DataPoint(22f, 75f), -// DataPoint(23f, 50f), + DataPoint(9f, 75f), + DataPoint(10f, 55f), + DataPoint(11f, 45f), + DataPoint(12f, 50f), + DataPoint(13f, 80f), + DataPoint(14f, 70f), + DataPoint(15f, 125f), + DataPoint(16f, 200f), + DataPoint(17f, 170f), + DataPoint(18f, 135f), + DataPoint(19f, 60f), + DataPoint(20f, 20f), + DataPoint(21f, 40f), + DataPoint(22f, 75f), + DataPoint(23f, 50f), ) val dataPoints2 = listOf( diff --git a/app/src/main/java/ir/hfathi/digiplotsample/LineGraphSample.kt b/app/src/main/java/ir/hfathi/digiplotsample/sample/LineGraphSample1.kt similarity index 69% rename from app/src/main/java/ir/hfathi/digiplotsample/LineGraphSample.kt rename to app/src/main/java/ir/hfathi/digiplotsample/sample/LineGraphSample1.kt index c6d3dcb..fe1425a 100644 --- a/app/src/main/java/ir/hfathi/digiplotsample/LineGraphSample.kt +++ b/app/src/main/java/ir/hfathi/digiplotsample/sample/LineGraphSample1.kt @@ -1,6 +1,7 @@ -package ir.hfathi.digiplotsample +package ir.hfathi.digiplotsample.sample import android.graphics.Paint +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -13,9 +14,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.* import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.core.graphics.alpha import androidx.core.graphics.blue import androidx.core.graphics.green @@ -23,17 +27,20 @@ import androidx.core.graphics.red import ir.hfathi.digiplot.line.DataPoint import ir.hfathi.digiplot.line.LineGraph import ir.hfathi.digiplot.line.LinePlot +import ir.hfathi.digiplotsample.data.DataPoints import ir.hfathi.digiplotsample.ui.theme.DigiPlotSampleTheme +import ir.hfathi.digiplotsample.ui.theme.md_blue_gray import ir.hfathi.digiplotsample.ui.theme.md_green import java.text.DecimalFormat @Composable -internal fun LineGraphSample(lines: List>) { +internal fun LineGraphSample1(modifier: Modifier = Modifier, lines: List>) { val totalWidth = remember { mutableStateOf(0) } - Column(Modifier.onGloballyPositioned { + val density = LocalDensity.current + Column(modifier = modifier.onGloballyPositioned { totalWidth.value = it.size.width - }) { + }.background(color = Color.Transparent)) { val xOffset = remember { mutableStateOf(0f) } val cardWidth = remember { mutableStateOf(0) } val visibility = remember { mutableStateOf(false) } @@ -41,7 +48,7 @@ internal fun LineGraphSample(lines: List>) { Box( modifier = Modifier - .height(150.dp) + .height(120.dp) .fillMaxWidth(), contentAlignment = Alignment.Center ) { @@ -94,59 +101,39 @@ internal fun LineGraphSample(lines: List>) { color = Color.Red ) } - Surface( + Box( modifier = Modifier - .width(50.dp) - .onGloballyPositioned { - cardWidth.value = it.size.width - } - .graphicsLayer(translationX = xOffset.value) - .alpha(if (visibility.value) 1f else 0f), + .height(32.dp) + .fillMaxWidth() ) { Text( textAlign = TextAlign.Center, text = "${time.toInt()}:00", style = MaterialTheme.typography.labelLarge, color = Color.Gray, - modifier = Modifier.padding(all = 4.dp) + modifier = Modifier + .padding(all = 4.dp) + .onGloballyPositioned { + cardWidth.value = it.size.width + } + .graphicsLayer(translationX = xOffset.value) + .alpha(if (visibility.value) 1f else 0f), ) - } } } } LineGraph( + modifier = Modifier + .fillMaxWidth() + .height(200.dp), plot = LinePlot( horizontalExtraSpace = 20.dp, paddingTop = 50.dp, paddingBottom = 120.dp, isZoomAllowed = false, - lines = listOf( - LinePlot.Line( - lineShadowAlpha = 0.2f, - dataPoints = lines[0], - connection = LinePlot.Connection( - color = md_green, - strokeWidth = 2.dp, - ), - intersection = null, - maxMinLabel = LinePlot.MaxMinLabel( - paint = Paint().apply { - color = Color.Gray.toInt() - textAlign = Paint.Align.LEFT - textSize = 30f - }, - maxLabelXY = Pair(10f, 50f), - minLabelXY = Pair(10f, 60f) - ), - highlight = LinePlot.Highlight( - color = md_green, - borderColor = Color.White, - borderEnable = true - ), - ), - ), + lines = getLinesDetails(lines = lines, density = density), selection = LinePlot.Selection( enabled = true, highlight = LinePlot.Connection( @@ -159,9 +146,7 @@ internal fun LineGraphSample(lines: List>) { ), ), - modifier = Modifier - .fillMaxWidth() - .height(200.dp), + onSelectionStart = { visibility.value = true }, onSelectionEnd = { visibility.value = false }, @@ -173,20 +158,53 @@ internal fun LineGraphSample(lines: List>) { xCenter - cWidth / 2f < 0f -> 0f else -> xCenter - cWidth / 2f } - xOffset.value = xCenter + xOffset.value = xCenter - (xCenter * 0.1f) points.value = pts } } } +private fun getLinesDetails(lines: List>, density: Density): List { + val result = mutableListOf() + lines.forEach { line -> + result.add( + LinePlot.Line( + lineShadowAlpha = 0.2f, + dataPoints = line, + connection = LinePlot.Connection( + color = if (line.first().y != 5f) md_green else md_blue_gray, + strokeWidth = 2.dp, + ), + intersection = null, + maxMinLabel = LinePlot.MaxMinLabel( + paint = Paint().apply { + color = Color.Gray.toInt() + textAlign = Paint.Align.LEFT + textSize = density.run { 14.sp.toPx() } + }, + maxLabelXY = Pair(10f, 50f), + minLabelXY = Pair(10f, 60f) + ), + highlight = LinePlot.Highlight( + color = md_green, + borderColor = Color.White, + borderEnable = true + ), + ) + ) + } + return result +} + @Preview(showBackground = true) @Composable -fun LineGraph2Preview() { +fun LineGraphPreview() { DigiPlotSampleTheme { - LineGraphSample(listOf(DataPoints.dataPoints1, DataPoints.dataPoints2)) + LineGraphSample1(lines = listOf(DataPoints.dataPoints1, DataPoints.dataPoints2)) } } + fun Color.toInt(): Int { return android.graphics.Color.argb( this.toArgb().alpha, diff --git a/app/src/main/java/ir/hfathi/digiplotsample/ui/theme/Color.kt b/app/src/main/java/ir/hfathi/digiplotsample/ui/theme/Color.kt index 3e051e7..3f20b6c 100644 --- a/app/src/main/java/ir/hfathi/digiplotsample/ui/theme/Color.kt +++ b/app/src/main/java/ir/hfathi/digiplotsample/ui/theme/Color.kt @@ -8,6 +8,7 @@ val Pink80 = Color(0xFFEFB8C8) val md_green = Color(0xFF1BC47D) val md_blue_gray = Color(0xFF37474F) +val md_light_gray = Color(0xFFF5F5F5) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71)