@@ -12,8 +12,9 @@ import com.github.blarc.ai.commits.intellij.plugin.unique
1212import com.intellij.dvcs.repo.VcsRepositoryManager
1313import com.intellij.ide.DataManager
1414import com.intellij.openapi.actionSystem.CommonDataKeys
15- import com.intellij.openapi.application.ApplicationManager
15+ import com.intellij.openapi.application.EDT
1616import com.intellij.openapi.application.ModalityState
17+ import com.intellij.openapi.application.asContextElement
1718import com.intellij.openapi.project.Project
1819import com.intellij.openapi.ui.DialogWrapper
1920import com.intellij.ui.components.JBTextArea
@@ -25,12 +26,16 @@ import com.intellij.ui.dsl.builder.text
2526import com.intellij.ui.table.TableView
2627import com.intellij.util.ui.ListTableModel
2728import git4idea.branch.GitBranchWorker
29+ import kotlinx.coroutines.CoroutineScope
30+ import kotlinx.coroutines.Dispatchers
31+ import kotlinx.coroutines.launch
32+ import kotlinx.coroutines.withContext
2833import java.awt.event.MouseAdapter
2934import java.awt.event.MouseEvent
3035import javax.swing.ListSelectionModel.SINGLE_SELECTION
3136import kotlin.math.max
3237
33- class PromptTable {
38+ class PromptTable ( private val cs : CoroutineScope ) {
3439 private var prompts = AppSettings2 .instance.prompts
3540 private val tableModel = createTableModel()
3641
@@ -59,7 +64,7 @@ class PromptTable {
5964 )
6065
6166 fun addPrompt (): Prompt ? {
62- val dialog = PromptDialog (prompts.keys.toSet())
67+ val dialog = PromptDialog (prompts.keys.toSet(), cs )
6368
6469 if (dialog.showAndGet()) {
6570 prompts = prompts.plus(dialog.prompt.name.lowercase() to dialog.prompt).toMutableMap()
@@ -78,7 +83,7 @@ class PromptTable {
7883
7984 fun editPrompt (): Pair <Prompt , Prompt >? {
8085 val selectedPrompt = table.selectedObject ? : return null
81- val dialog = PromptDialog (prompts.keys.toSet(), selectedPrompt.copy())
86+ val dialog = PromptDialog (prompts.keys.toSet(), cs, selectedPrompt.copy())
8287
8388 if (dialog.showAndGet()) {
8489 prompts = prompts.minus(selectedPrompt.name.lowercase()).toMutableMap()
@@ -104,7 +109,7 @@ class PromptTable {
104109 AppSettings2 .instance.prompts = prompts
105110 }
106111
107- private class PromptDialog (val prompts : Set <String >, val newPrompt : Prompt ? = null ) : DialogWrapper(true ) {
112+ private class PromptDialog (val prompts : Set <String >, private val cs : CoroutineScope , val newPrompt : Prompt ? = null ) : DialogWrapper(true ) {
108113
109114 val prompt = newPrompt ? : Prompt (" " )
110115 val promptNameTextField = JBTextField ()
@@ -141,25 +146,13 @@ class PromptTable {
141146
142147 DataManager .getInstance().getDataContext(rootPane).getData(CommonDataKeys .PROJECT )?.let { project ->
143148 this .project = project
144- ApplicationManager .getApplication().executeOnPooledThread {
145-
146- val changes = VcsRepositoryManager .getInstance(project).repositories.stream()
147- .map { r -> GitBranchWorker .loadTotalDiff(r, r.currentBranchName!! ) }
148- .flatMap { r -> r.stream() }
149- .toList()
150-
151- branch = commonBranch(changes, project)
152- diff = computeDiff(changes, true , project)
153-
154- ApplicationManager .getApplication().invokeLater({
155- setPreview(prompt.content, promptHintTextField.text)
156- }, ModalityState .stateForComponent(rootPane))
157- }
149+ getChangesAndSetPreview(project)
158150 }
159151
160152 init ()
161153 }
162154
155+
163156 override fun createCenterPanel () = panel {
164157 row(message(" settings.prompt.name" )) {
165158 cell(promptNameTextField)
@@ -204,6 +197,19 @@ class PromptTable {
204197 }
205198 }
206199
200+ private fun getChangesAndSetPreview (project : Project ) = cs.launch(Dispatchers .IO + ModalityState .stateForComponent(rootPane).asContextElement()) {
201+ val changes = VcsRepositoryManager .getInstance(project).repositories.stream()
202+ .map { r -> GitBranchWorker .loadTotalDiff(r, r.currentBranchName!! ) }
203+ .flatMap { r -> r.stream() }
204+ .toList()
205+
206+ branch = commonBranch(changes, project)
207+ diff = computeDiff(changes, true , project)
208+
209+ withContext(Dispatchers .EDT ) {
210+ setPreview(prompt.content, promptHintTextField.text)
211+ }
212+ }
207213 private fun setPreview (promptContent : String , hint : String ) {
208214 val constructPrompt = AICommitsUtils .constructPrompt(promptContent, diff, branch, hint, project)
209215 promptPreviewTextArea.text = constructPrompt.substring(0 , constructPrompt.length.coerceAtMost(10000 ))
0 commit comments