Skip to content

Commit 87319dd

Browse files
committed
Use plot theme background for the PlotPanel background.
1 parent 30d622b commit 87319dd

2 files changed

Lines changed: 36 additions & 15 deletions

File tree

demo/plot/compose-desktop/src/main/kotlin/demo/plot/pixeldensity/PixelDensityTestDemo.kt

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55

66
package demo.plot.pixeldensity
77

8+
import androidx.compose.foundation.background
89
import androidx.compose.foundation.layout.*
910
import androidx.compose.material.Button
1011
import androidx.compose.material.MaterialTheme
1112
import androidx.compose.material.Slider
1213
import androidx.compose.material.Text
1314
import androidx.compose.runtime.*
14-
import androidx.compose.ui.Alignment
1515
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.graphics.Color
1617
import androidx.compose.ui.platform.LocalDensity
1718
import androidx.compose.ui.unit.Density
1819
import androidx.compose.ui.unit.dp
@@ -22,10 +23,12 @@ import org.jetbrains.letsPlot.Figure
2223
import org.jetbrains.letsPlot.geom.geomPoint
2324
import org.jetbrains.letsPlot.letsPlot
2425
import org.jetbrains.letsPlot.skia.compose.PlotPanel
26+
import org.jetbrains.letsPlot.themes.flavorDarcula
27+
import org.jetbrains.letsPlot.themes.flavorHighContrastDark
2528

2629
fun main() = application {
2730
var pixelDensity by remember { mutableFloatStateOf(1.0f) }
28-
31+
2932
Window(onCloseRequest = ::exitApplication, title = "Pixel Density Test Demo") {
3033
MaterialTheme {
3134
CompositionLocalProvider(LocalDensity provides Density(pixelDensity)) {
@@ -38,14 +41,14 @@ fun main() = application {
3841
Column(modifier = Modifier.padding(16.dp)) {
3942
Text("Current Pixel Density: ${String.format("%.2f", pixelDensity)}")
4043
Text("Effective DPI: ${String.format("%.0f", pixelDensity * 96)}")
41-
44+
4245
Slider(
4346
value = pixelDensity,
4447
onValueChange = { pixelDensity = it },
4548
valueRange = 0.5f..3.0f,
4649
modifier = Modifier.fillMaxWidth()
4750
)
48-
51+
4952
Row(
5053
horizontalArrangement = Arrangement.spacedBy(8.dp)
5154
) {
@@ -56,7 +59,7 @@ fun main() = application {
5659
}
5760
}
5861
}
59-
62+
6063
// Plot panel that reacts to pixel density changes
6164
PlotPanel(
6265
figure = createTestFigure(),
@@ -89,15 +92,15 @@ private fun Card(
8992
private fun createTestFigure(): Figure {
9093
val n = 100
9194
val rand = kotlin.random.Random(42)
92-
95+
9396
val data = mapOf(
9497
"x" to List(n) { rand.nextDouble() * 10 },
9598
"y" to List(n) { rand.nextDouble() * 10 },
9699
"color" to List(n) { listOf("A", "B", "C", "D").random(rand) }
97100
)
98-
99-
return letsPlot(data) +
100-
geomPoint(size = 3.0, alpha = 0.7) {
101-
x = "x"; y = "y"; color = "color"
102-
}
101+
102+
return letsPlot(data) +
103+
geomPoint(size = 3.0, alpha = 0.7) {
104+
x = "x"; y = "y"; color = "color"
105+
} + flavorHighContrastDark()
103106
}

lets-plot-compose/src/desktopMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanelRaw.kt

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ import androidx.compose.ui.graphics.Color
1414
import androidx.compose.ui.layout.onSizeChanged
1515
import androidx.compose.ui.platform.LocalDensity
1616
import androidx.compose.ui.text.TextStyle
17-
import androidx.compose.ui.unit.dp
1817
import org.jetbrains.letsPlot.commons.geometry.DoubleVector
1918
import org.jetbrains.letsPlot.core.plot.builder.interact.tools.FigureModelHelper
2019
import org.jetbrains.letsPlot.core.spec.Option.Meta.Kind.GG_TOOLBAR
2120
import org.jetbrains.letsPlot.core.spec.config.PlotConfig
2221
import org.jetbrains.letsPlot.core.spec.front.SpecOverrideUtil
2322
import org.jetbrains.letsPlot.core.util.MonolithicCommon.processRawSpecs
23+
import org.jetbrains.letsPlot.core.util.PlotThemeHelper
2424
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
2525
import org.jetbrains.letsPlot.skia.builderLW.MonolithicSkiaLW
2626
import org.jetbrains.letsPlot.skia.compose.desktop.PlotContainer
@@ -39,6 +39,25 @@ actual fun PlotPanelRaw(
3939
errorModifier: Modifier,
4040
computationMessagesHandler: (List<String>) -> Unit
4141
) {
42+
43+
// Background
44+
45+
// Check if the modifier already has a background
46+
val hasBackground = modifier.foldIn(false) { hasBg, element ->
47+
hasBg || element.toString().contains("BackgroundElement")
48+
}
49+
50+
// Apply a plot background only if the user hasn't set one
51+
val finalModifier = if (!hasBackground) {
52+
val lpBackground = rawSpec.let {
53+
val lpColor = PlotThemeHelper.plotBackground(rawSpec)
54+
Color(lpColor.red, lpColor.green, lpColor.blue, lpColor.alpha)
55+
}
56+
modifier.background(lpBackground)
57+
} else {
58+
modifier
59+
}
60+
4261
// Update density on each recomposition to handle monitor DPI changes (e.g., drag between HIDPI/regular monitor)
4362
val density = LocalDensity.current.density.toDouble()
4463

@@ -59,20 +78,19 @@ actual fun PlotPanelRaw(
5978
}
6079
}
6180

62-
Column(modifier = modifier) {
81+
Column(modifier = finalModifier) {
6382
if (plotFigureModel != null && GG_TOOLBAR in processedPlotSpec) {
6483
PlotToolbar(plotFigureModel!!)
6584
}
6685

6786
Box(
68-
modifier = modifier
87+
modifier = finalModifier
6988
.weight(1f) // Take the remaining vertical space
7089
.fillMaxWidth() // Fill available width
7190
.onSizeChanged { newSize ->
7291
// Convert logical pixels (from Compose layout) to physical pixels (plot SVG pixels)
7392
panelSize = DoubleVector(newSize.width / density, newSize.height / density)
7493
}
75-
.background(Color.LightGray)
7694
) {
7795
if (PlotConfig.isFailure(processedPlotSpec)) {
7896
BasicTextField(

0 commit comments

Comments
 (0)