User: kyle wood Date: 19 Jan 26 20:36 Revision: b4398bed90d60211504e405a30d81abe8cc6be6e Summary: Open Run and Build tool windows during project creation Automatically opening the tool windows helps show the user context about what's going on, especially for modding projects which require a long initial Gradle import. TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10402&personal=false Index: src/main/kotlin/creator/custom/finalizers/ImportGradleProjectFinalizer.kt =================================================================== --- src/main/kotlin/creator/custom/finalizers/ImportGradleProjectFinalizer.kt (revision 38d50c6ee59ea64f0abcedfe9720da08876d0d04) +++ src/main/kotlin/creator/custom/finalizers/ImportGradleProjectFinalizer.kt (revision b4398bed90d60211504e405a30d81abe8cc6be6e) @@ -21,8 +21,15 @@ package com.demonwav.mcdev.creator.custom.finalizers import com.intellij.ide.util.projectWizard.WizardContext +import com.intellij.openapi.application.EDT import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.project.Project +import com.intellij.openapi.wm.ToolWindowManager +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext import org.jetbrains.plugins.gradle.service.project.open.canLinkAndRefreshGradleProject import org.jetbrains.plugins.gradle.service.project.open.linkAndSyncGradleProject @@ -33,12 +40,35 @@ project: Project, properties: Map, templateProperties: Map - ) { + ) = coroutineScope { val projectDir = context.projectFileDirectory val canLink = canLinkAndRefreshGradleProject(projectDir, project, showValidationDialog = false) thisLogger().info("canLink = $canLink projectDir = $projectDir") + if (canLink) { + val link = async { - linkAndSyncGradleProject(project, projectDir) + linkAndSyncGradleProject(project, projectDir) + } + + runCatching { + // Try to open the tool window after starting the sync. + // Having the tool window open will provide better context to the user about what's going on. + // The Build tool window isn't registered until a build is running, so we can't just open the tool window + // like normal here, we have to wait until after the build starts. + val manager = ToolWindowManager.getInstance(project) + for (i in 0 until 10) { + delay(250) + manager.getToolWindow("Build")?.let { + withContext(Dispatchers.EDT) { + it.show() + } + break + } + } + } + + link.await() + thisLogger().info("Linking done") } } Index: src/main/kotlin/creator/custom/finalizers/RunGradleTasksFinalizer.kt =================================================================== --- src/main/kotlin/creator/custom/finalizers/RunGradleTasksFinalizer.kt (revision 38d50c6ee59ea64f0abcedfe9720da08876d0d04) +++ src/main/kotlin/creator/custom/finalizers/RunGradleTasksFinalizer.kt (revision b4398bed90d60211504e405a30d81abe8cc6be6e) @@ -50,7 +50,7 @@ val projectDir = context.projectDirectory thisLogger().info("tasks = $tasks projectDir = $projectDir") - runGradleTaskAndWait(project, projectDir) { settings -> + runGradleTaskAndWait(project, projectDir, toolWindow = true) { settings -> settings.taskNames = tasks } Index: src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt =================================================================== --- src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt (revision 38d50c6ee59ea64f0abcedfe9720da08876d0d04) +++ src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt (revision b4398bed90d60211504e405a30d81abe8cc6be6e) @@ -92,6 +92,7 @@ runGradleTaskWithCallback( project, Paths.get(projectPath), + toolWindow = false, { settings -> settings.taskNames = listOf(decompiler.taskName) }, taskCallback, ) Index: src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleDecompileSourceProvider.kt =================================================================== --- src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleDecompileSourceProvider.kt (revision 38d50c6ee59ea64f0abcedfe9720da08876d0d04) +++ src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleDecompileSourceProvider.kt (revision b4398bed90d60211504e405a30d81abe8cc6be6e) @@ -87,6 +87,7 @@ runGradleTaskWithCallback( project, Paths.get(projectPath), + toolWindow = false, { settings -> settings.taskNames = listOf(decompileTaskName) }, taskCallback, ) Index: src/main/kotlin/util/gradle-util.kt =================================================================== --- src/main/kotlin/util/gradle-util.kt (revision 38d50c6ee59ea64f0abcedfe9720da08876d0d04) +++ src/main/kotlin/util/gradle-util.kt (revision b4398bed90d60211504e405a30d81abe8cc6be6e) @@ -30,14 +30,24 @@ import java.util.concurrent.CountDownLatch import org.jetbrains.plugins.gradle.util.GradleConstants -fun runGradleTask(project: Project, dir: Path, func: (ExternalSystemTaskExecutionSettings) -> Unit) { - runGradleTaskWithCallback(project, dir, func, GradleCallback(null)) +fun runGradleTask( + project: Project, + dir: Path, + toolWindow: Boolean = false, + func: (ExternalSystemTaskExecutionSettings) -> Unit, +) { + runGradleTaskWithCallback(project, dir, toolWindow, func, GradleCallback(null)) } -fun runGradleTaskAndWait(project: Project, dir: Path, func: (ExternalSystemTaskExecutionSettings) -> Unit) { +fun runGradleTaskAndWait( + project: Project, + dir: Path, + toolWindow: Boolean = false, + func: (ExternalSystemTaskExecutionSettings) -> Unit, +) { val latch = CountDownLatch(1) - runGradleTaskWithCallback(project, dir, func, GradleCallback(latch)) + runGradleTaskWithCallback(project, dir, toolWindow, func, GradleCallback(latch)) latch.await() } @@ -45,6 +55,7 @@ fun runGradleTaskWithCallback( project: Project, dir: Path, + toolWindow: Boolean = false, func: (ExternalSystemTaskExecutionSettings) -> Unit, callback: TaskCallback, ) { @@ -62,7 +73,7 @@ GradleConstants.SYSTEM_ID, callback, ProgressExecutionMode.IN_BACKGROUND_ASYNC, - false, + toolWindow, ) }