Skip to content

Commit 5dfa781

Browse files
committed
Add an option to edit the port combobox manually
1 parent c0ecd63 commit 5dfa781

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/main/kotlin/dev/micropythontools/settings/MpyConfigurable.kt

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import javax.swing.event.PopupMenuListener
4747
private data class ConfigurableParameters(
4848
var isPluginEnabled: Boolean,
4949
var usingUart: Boolean,
50+
var enableManualEditing: Boolean,
5051
var filterManufacturers: Boolean,
5152
var portName: String,
5253
var webReplIp: String,
@@ -81,6 +82,7 @@ internal class MpyConfigurable(private val project: Project) :
8182
ConfigurableParameters(
8283
isPluginEnabled = isPluginEnabled,
8384
usingUart = usingUart,
85+
enableManualEditing = enableManualEditing,
8486
filterManufacturers = filterManufacturers,
8587
portName = if (portName.isNullOrBlank()) EMPTY_PORT_NAME_TEXT else portName.toString(),
8688
webReplIp = webReplIp ?: DEFAULT_WEBREPL_IP,
@@ -105,6 +107,7 @@ internal class MpyConfigurable(private val project: Project) :
105107
private lateinit var serialRadioButton: Cell<JBRadioButton>
106108
private lateinit var webReplRadioButton: Cell<JBRadioButton>
107109

110+
private lateinit var enableManualEditingCheckbox: Cell<JBCheckBox>
108111
private lateinit var filterManufacturersCheckBox: Cell<JBCheckBox>
109112
private lateinit var portSelectComboBox: Cell<ComboBox<String>>
110113

@@ -137,6 +140,18 @@ internal class MpyConfigurable(private val project: Project) :
137140
}
138141

139142
indent {
143+
row {
144+
enableManualEditingCheckbox = checkBox("Edit port manually")
145+
.bindSelected(parameters::enableManualEditing)
146+
.applyToComponent {
147+
addActionListener {
148+
val comboBox = portSelectComboBox.component
149+
comboBox.isEditable = isSelected
150+
comboBox.revalidate()
151+
comboBox.repaint()
152+
}
153+
}
154+
}
140155
row {
141156
filterManufacturersCheckBox = checkBox("Filter out devices with unknown manufacturers")
142157
.bindSelected(parameters::filterManufacturers)
@@ -150,7 +165,7 @@ internal class MpyConfigurable(private val project: Project) :
150165
{ parameters.portName = it.takeIf { !it.isNullOrBlank() } ?: EMPTY_PORT_NAME_TEXT }
151166
)
152167
.applyToComponent {
153-
isEditable = false
168+
isEditable = parameters.enableManualEditing
154169
selectedItem = parameters.portName
155170

156171
addPopupMenuListener(object : PopupMenuListener {
@@ -161,6 +176,30 @@ internal class MpyConfigurable(private val project: Project) :
161176
override fun popupMenuWillBecomeInvisible(e: PopupMenuEvent?) {}
162177
override fun popupMenuCanceled(e: PopupMenuEvent?) {}
163178
})
179+
180+
// Add listener to detect typing changes in the editor
181+
val editorComponent = editor.editorComponent
182+
if (editorComponent is javax.swing.JTextField) {
183+
editorComponent.document.addDocumentListener(object :
184+
javax.swing.event.DocumentListener {
185+
override fun insertUpdate(e: javax.swing.event.DocumentEvent?) =
186+
updateModel()
187+
188+
override fun removeUpdate(e: javax.swing.event.DocumentEvent?) =
189+
updateModel()
190+
191+
override fun changedUpdate(e: javax.swing.event.DocumentEvent?) =
192+
updateModel()
193+
194+
private fun updateModel() {
195+
val text = editorComponent.text
196+
if (text != parameters.portName) {
197+
parameters.portName = text
198+
settingsPanel.validateAll()
199+
}
200+
}
201+
})
202+
}
164203
}
165204
}
166205
}.visibleIf(serialRadioButton.selected)
@@ -339,6 +378,7 @@ internal class MpyConfigurable(private val project: Project) :
339378

340379
settings.state.isPluginEnabled = isPluginEnabled
341380
settings.state.usingUart = usingUart
381+
settings.state.enableManualEditing = enableManualEditing
342382
settings.state.filterManufacturers = filterManufacturers
343383
settings.state.portName = portName.takeUnless { it == EMPTY_PORT_NAME_TEXT }
344384

src/main/kotlin/dev/micropythontools/settings/MpyState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.intellij.openapi.components.BaseState
2424
internal class MpyState : BaseState() {
2525
var isPluginEnabled by property(false)
2626
var usingUart by property(true)
27+
var enableManualEditing by property(false)
2728
var filterManufacturers by property(true)
2829
var portName by string("")
2930
var increaseBaudrateForFileTransfers by string("")

0 commit comments

Comments
 (0)