You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.4 KiB
92 lines
3.4 KiB
/* |
|
* Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. |
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. |
|
*/ |
|
|
|
package com.jetbrains.compose |
|
|
|
import com.intellij.ide.impl.ProjectUtil |
|
import com.intellij.openapi.application.invokeLater |
|
import com.intellij.openapi.project.Project |
|
import com.intellij.openapi.wm.RegisterToolWindowTask |
|
import com.intellij.openapi.wm.ToolWindow |
|
import com.intellij.openapi.wm.ToolWindowAnchor |
|
import com.intellij.openapi.wm.ToolWindowManager |
|
import com.jetbrains.compose.benchmark.BenchmarkToolWindow |
|
import kotlinx.coroutines.* |
|
import kotlinx.coroutines.swing.Swing |
|
import java.nio.file.Files |
|
import kotlin.random.Random |
|
|
|
private val ANCHORS = listOf(ToolWindowAnchor.LEFT, ToolWindowAnchor.BOTTOM, ToolWindowAnchor.RIGHT) |
|
private val SIDE_TOOLS = listOf(true, false) |
|
private val COUNT = ANCHORS.size * SIDE_TOOLS.size |
|
|
|
class LifecycleListener : com.intellij.ide.AppLifecycleListener { |
|
|
|
private val swingScope = CoroutineScope(SupervisorJob() + Dispatchers.Swing) |
|
private lateinit var tempProject: Project |
|
private val toolWindowIds: MutableList<String> = mutableListOf() |
|
|
|
init { |
|
swingScope.launch { |
|
invokeLater { |
|
val tempDir = Files.createTempDirectory("idea_project") |
|
tempProject = ProjectUtil.openOrImport(tempDir) |
|
val toolWindowManager = ToolWindowManager.getInstance(tempProject) |
|
for (anchor in ANCHORS) { |
|
for (sideTool in SIDE_TOOLS) { |
|
val id = "Compose${toolWindowIds.size}" |
|
toolWindowIds.add(id) |
|
val toolWindow: ToolWindow = toolWindowManager.registerToolWindow( |
|
RegisterToolWindowTask( |
|
id = id, |
|
anchor = anchor, |
|
component = null, |
|
sideTool = sideTool, |
|
canCloseContent = true, |
|
canWorkInDumbMode = true, |
|
icon = null, |
|
shouldBeAvailable = true, |
|
contentFactory = BenchmarkToolWindow(), |
|
) |
|
) |
|
} |
|
} |
|
performanceDialog.show() |
|
} |
|
while (true) { |
|
try { |
|
delay(500) |
|
val toolWindowManager = ToolWindowManager.getInstance(tempProject) |
|
val toolWindows = toolWindowIds.mapNotNull { |
|
toolWindowManager.getToolWindow(it) |
|
} |
|
stressTestToolWindows(toolWindows) |
|
} catch (t: Throwable) { |
|
// do nothing |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
suspend fun stressTestToolWindows(toolWindows: List<ToolWindow>) { |
|
while (performanceDialog.isPaused().not()) { |
|
val visiblePanelsCount = toolWindows.count { it.isVisible } |
|
delay(200) |
|
doMeasure("$visiblePanelsCount panels") |
|
delay(200) |
|
toolWindows.forEach { |
|
if (Random.nextBoolean()) { |
|
if (it.isVisible.not()) { |
|
it.show() |
|
} |
|
} else { |
|
if (it.isVisible) { |
|
it.hide() |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|