@@ -19,6 +19,8 @@ import androidx.compose.ui.platform.LocalDensity
1919import androidx.compose.ui.text.TextStyle
2020import org.jetbrains.letsPlot.commons.geometry.DoubleVector
2121import org.jetbrains.letsPlot.commons.logging.PortableLogging
22+ import org.jetbrains.letsPlot.compose.desktop.PlotContainer
23+ import org.jetbrains.letsPlot.compose.desktop.SvgViewPanel
2224import org.jetbrains.letsPlot.core.plot.builder.interact.tools.FigureModelHelper
2325import org.jetbrains.letsPlot.core.spec.Option.Meta.Kind.GG_TOOLBAR
2426import org.jetbrains.letsPlot.core.spec.config.PlotConfig
@@ -27,14 +29,14 @@ import org.jetbrains.letsPlot.core.util.MonolithicCommon.processRawSpecs
2729import org.jetbrains.letsPlot.core.util.PlotThemeHelper
2830import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
2931import org.jetbrains.letsPlot.skia.builder.MonolithicSkia
30- import org.jetbrains.letsPlot.compose.desktop.PlotContainer
31- import org.jetbrains.letsPlot.compose.desktop.SvgViewPanel
3232
3333// import org.jetbrains.letsPlot.compose.util.NaiveLogger
3434
3535// private val LOG = NaiveLogger("PlotPanel")
3636private val LOG = PortableLogging .logger(name = " [PlotPanelRaw]" )
3737
38+ private const val logRecompositions = true
39+
3840@Suppress(" FunctionName" )
3941@Composable
4042actual fun PlotPanelRaw (
@@ -45,6 +47,9 @@ actual fun PlotPanelRaw(
4547 errorModifier : Modifier ,
4648 computationMessagesHandler : (List <String >) -> Unit
4749) {
50+ if (logRecompositions) {
51+ println (" PlotPanelRaw: recomposition" )
52+ }
4853
4954 // Update density on each recomposition to handle monitor DPI changes (e.g., drag between HIDPI/regular monitor)
5055 val density = LocalDensity .current.density.toDouble()
@@ -60,11 +65,14 @@ actual fun PlotPanelRaw(
6065 var panelSize by remember { mutableStateOf(DoubleVector .ZERO ) }
6166 var dispatchComputationMessages by remember { mutableStateOf(true ) }
6267 var specOverrideList by remember { mutableStateOf(emptyList<Map <String , Any >>()) }
63- val plotContainer = remember { PlotContainer () }
6468 var plotFigureModel by remember { mutableStateOf<PlotFigureModel ?>(null ) }
6569
6670
67- var errorMessage: String? by remember { mutableStateOf(null ) }
71+ var errorMessage: String? by remember(processedPlotSpec) { mutableStateOf(null ) }
72+
73+ // Reset the old plot on error to prevent blinking
74+ // We can't reset PlotContainer using updateViewmodel(), so we create a new one.
75+ val plotContainer = remember(errorMessage) { PlotContainer () }
6876
6977 // Background
7078 val finalModifier = if (errorMessage != null ) {
@@ -123,6 +131,7 @@ actual fun PlotPanelRaw(
123131 LaunchedEffect (panelSize, processedPlotSpec, specOverrideList, preserveAspectRatio) {
124132
125133 if (PlotConfig .isFailure(processedPlotSpec)) {
134+ plotFigureModel = null
126135 errorMessage = PlotConfig .getErrorMessage(processedPlotSpec)
127136 return @LaunchedEffect
128137 }
0 commit comments