@@ -4,54 +4,55 @@ import com.aallam.openai.api.exception.OpenAIAPIException
44import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle
55import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
66import com.github.blarc.ai.commits.intellij.plugin.OpenAIService
7- import com.github.blarc.ai.commits.intellij.plugin.openaiModel.OpenAIModel
87import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.Prompt
98import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.PromptTable
109import com.intellij.icons.AllIcons
1110import com.intellij.openapi.options.BoundConfigurable
1211import com.intellij.openapi.progress.runBackgroundableTask
1312import com.intellij.openapi.ui.ComboBox
13+ import com.intellij.openapi.ui.naturalSorted
1414import com.intellij.ui.CommonActionsPanel
1515import com.intellij.ui.ToolbarDecorator
1616import com.intellij.ui.components.JBLabel
1717import com.intellij.ui.dsl.builder.*
18+ import com.intellij.ui.util.maximumWidth
1819import com.intellij.ui.util.minimumWidth
19- import kotlinx.coroutines.DelicateCoroutinesApi
20- import kotlinx.coroutines.Dispatchers
21- import kotlinx.coroutines.GlobalScope
22- import kotlinx.coroutines.launch
20+ import kotlinx.coroutines.*
2321import java.util.*
22+ import javax.swing.DefaultComboBoxModel
2423import javax.swing.JPasswordField
2524
2625class AppSettingsConfigurable : BoundConfigurable (message("settings.general.group.title")) {
2726
2827 private val tokenPasswordField = JPasswordField ()
2928 private val verifyLabel = JBLabel ()
29+ private var modelComboBox: ComboBox <String > = ComboBox <String >()
3030 private val promptTable = PromptTable ()
3131 private lateinit var toolbarDecorator: ToolbarDecorator
3232 private lateinit var promptComboBox: Cell <ComboBox <Prompt >>
33+
34+ init {
35+ modelComboBox.model = DefaultComboBoxModel (Vector (AppSettings .instance.openAIModelIds.naturalSorted()))
36+ modelComboBox.renderer = AppSettingsListCellRenderer ()
37+ }
38+
3339 override fun createPanel () = panel {
3440
3541 group(JBLabel (" OpenAI" )) {
3642 row {
37- comboBox(OpenAIModel .values().toList(),
38- AppSettingsListCellRenderer ())
39- .label(message(" settings.openAIModel" ))
40- .bindItem(AppSettings .instance::openAIModel.toNullableProperty())
41- }
42- row {
43+ label(message(" settings.openAIToken" ))
44+ .widthGroup(" label" )
4345 cell(tokenPasswordField)
44- .label(message(" settings.openAIToken" ))
4546 .bindText(
4647 { AppSettings .instance.getOpenAIToken().orEmpty() },
4748 { AppSettings .instance.saveOpenAIToken(it) }
4849 )
4950 .align(Align .FILL )
5051 .resizableColumn()
5152 .focused()
52- button(message(" settings.verifyToken" )) {
53- verifyToken( )
54- }.align( AlignX . RIGHT )
53+ button(message(" settings.verifyToken" )) { verifyToken() }
54+ .align( AlignX . RIGHT )
55+ .widthGroup( " button " )
5556 }
5657 row {
5758 comment(message(" settings.openAITokenComment" ))
@@ -60,23 +61,46 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
6061 .align(AlignX .RIGHT )
6162 }
6263 row {
64+ label(message(" settings.openAIModel" )).widthGroup(" label" )
65+
66+ cell(modelComboBox)
67+ .bindItem({ AppSettings .instance.openAIModelId }, {
68+ if (it != null ) {
69+ AppSettings .instance.openAIModelId = it
70+ }
71+ })
72+ .resizableColumn()
73+ .align(Align .FILL )
74+ button(message(" settings.refreshModels" )) {
75+ runBackgroundableTask(message(" settings.loadingModels" )) {
76+ runBlocking(Dispatchers .IO ) {
77+ OpenAIService .instance.refreshOpenAIModelIds()
78+ modelComboBox.model = DefaultComboBoxModel (Vector (AppSettings .instance.openAIModelIds.naturalSorted()))
79+ modelComboBox.item = AppSettings .instance.openAIModelId
80+ }
81+ }
82+ }
83+ .align(AlignX .RIGHT )
84+ .widthGroup(" button" )
85+ }
86+ row {
87+ label(message(" settings.openAIProxy" )).widthGroup(" label" )
6388 textField()
64- .label(message(" settings.openAIProxy" ))
6589 .bindText(AppSettings .instance::proxyUrl.toNonNullableProperty(" " ))
90+ .applyToComponent { minimumWidth = 350 }
6691 .resizableColumn()
67- .applyToComponent { minimumWidth = 300 }
6892 }
6993 }
7094
7195 group(JBLabel (" Prompt" )) {
7296 row {
97+ label(message(" settings.locale" )).widthGroup(" labelPrompt" )
7398 comboBox(Locale .getAvailableLocales().toList().sortedBy { it.displayName }, AppSettingsListCellRenderer ())
74- .label(message(" settings.locale" ))
7599 .bindItem(AppSettings .instance::locale.toNullableProperty())
76100 }
77101 row {
102+ label(message(" settings.prompt" )).widthGroup(" labelPrompt" )
78103 promptComboBox = comboBox(AppSettings .instance.prompts.values, AppSettingsListCellRenderer ())
79- .label(message(" settings.prompt" ))
80104 .bindItem(AppSettings .instance::currentPrompt.toNullableProperty())
81105 }
82106 row {
0 commit comments