@@ -12,8 +12,9 @@ import com.github.blarc.ai.commits.intellij.plugin.unique
12
12
import com.intellij.dvcs.repo.VcsRepositoryManager
13
13
import com.intellij.ide.DataManager
14
14
import com.intellij.openapi.actionSystem.CommonDataKeys
15
- import com.intellij.openapi.application.ApplicationManager
15
+ import com.intellij.openapi.application.EDT
16
16
import com.intellij.openapi.application.ModalityState
17
+ import com.intellij.openapi.application.asContextElement
17
18
import com.intellij.openapi.project.Project
18
19
import com.intellij.openapi.ui.DialogWrapper
19
20
import com.intellij.ui.components.JBTextArea
@@ -25,12 +26,16 @@ import com.intellij.ui.dsl.builder.text
25
26
import com.intellij.ui.table.TableView
26
27
import com.intellij.util.ui.ListTableModel
27
28
import git4idea.branch.GitBranchWorker
29
+ import kotlinx.coroutines.CoroutineScope
30
+ import kotlinx.coroutines.Dispatchers
31
+ import kotlinx.coroutines.launch
32
+ import kotlinx.coroutines.withContext
28
33
import java.awt.event.MouseAdapter
29
34
import java.awt.event.MouseEvent
30
35
import javax.swing.ListSelectionModel.SINGLE_SELECTION
31
36
import kotlin.math.max
32
37
33
- class PromptTable {
38
+ class PromptTable ( private val cs : CoroutineScope ) {
34
39
private var prompts = AppSettings2 .instance.prompts
35
40
private val tableModel = createTableModel()
36
41
@@ -59,7 +64,7 @@ class PromptTable {
59
64
)
60
65
61
66
fun addPrompt (): Prompt ? {
62
- val dialog = PromptDialog (prompts.keys.toSet())
67
+ val dialog = PromptDialog (prompts.keys.toSet(), cs )
63
68
64
69
if (dialog.showAndGet()) {
65
70
prompts = prompts.plus(dialog.prompt.name.lowercase() to dialog.prompt).toMutableMap()
@@ -78,7 +83,7 @@ class PromptTable {
78
83
79
84
fun editPrompt (): Pair <Prompt , Prompt >? {
80
85
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())
82
87
83
88
if (dialog.showAndGet()) {
84
89
prompts = prompts.minus(selectedPrompt.name.lowercase()).toMutableMap()
@@ -104,7 +109,7 @@ class PromptTable {
104
109
AppSettings2 .instance.prompts = prompts
105
110
}
106
111
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 ) {
108
113
109
114
val prompt = newPrompt ? : Prompt (" " )
110
115
val promptNameTextField = JBTextField ()
@@ -141,25 +146,13 @@ class PromptTable {
141
146
142
147
DataManager .getInstance().getDataContext(rootPane).getData(CommonDataKeys .PROJECT )?.let { project ->
143
148
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)
158
150
}
159
151
160
152
init ()
161
153
}
162
154
155
+
163
156
override fun createCenterPanel () = panel {
164
157
row(message(" settings.prompt.name" )) {
165
158
cell(promptNameTextField)
@@ -204,6 +197,19 @@ class PromptTable {
204
197
}
205
198
}
206
199
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
+ }
207
213
private fun setPreview (promptContent : String , hint : String ) {
208
214
val constructPrompt = AICommitsUtils .constructPrompt(promptContent, diff, branch, hint, project)
209
215
promptPreviewTextArea.text = constructPrompt.substring(0 , constructPrompt.length.coerceAtMost(10000 ))
0 commit comments