finishing touches for the toolchain selector
This commit is contained in:
parent
54cd514249
commit
12e5ffdea1
7 changed files with 45 additions and 34 deletions
|
@ -36,7 +36,7 @@ import java.util.UUID
|
||||||
name = "ZigToolchainList",
|
name = "ZigToolchainList",
|
||||||
storages = [Storage("zigbrains.xml")]
|
storages = [Storage("zigbrains.xml")]
|
||||||
)
|
)
|
||||||
class ZigToolchainListService: SerializablePersistentStateComponent<ZigToolchainListService.State>(State()), ZigToolchainListService.IService {
|
class ZigToolchainListService: SerializablePersistentStateComponent<ZigToolchainListService.State>(State()), IZigToolchainListService {
|
||||||
private val changeListeners = ArrayList<WeakReference<ToolchainListChangeListener>>()
|
private val changeListeners = ArrayList<WeakReference<ToolchainListChangeListener>>()
|
||||||
|
|
||||||
override val toolchains: Sequence<Pair<UUID, ZigToolchain>>
|
override val toolchains: Sequence<Pair<UUID, ZigToolchain>>
|
||||||
|
@ -133,10 +133,16 @@ class ZigToolchainListService: SerializablePersistentStateComponent<ZigToolchain
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun getInstance(): IService = service<ZigToolchainListService>()
|
fun getInstance(): IZigToolchainListService = service<ZigToolchainListService>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed interface IService {
|
@FunctionalInterface
|
||||||
|
interface ToolchainListChangeListener {
|
||||||
|
suspend fun toolchainListChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed interface IZigToolchainListService {
|
||||||
val toolchains: Sequence<Pair<UUID, ZigToolchain>>
|
val toolchains: Sequence<Pair<UUID, ZigToolchain>>
|
||||||
fun setToolchain(uuid: UUID, toolchain: ZigToolchain)
|
fun setToolchain(uuid: UUID, toolchain: ZigToolchain)
|
||||||
fun registerNewToolchain(toolchain: ZigToolchain): UUID
|
fun registerNewToolchain(toolchain: ZigToolchain): UUID
|
||||||
|
@ -146,9 +152,3 @@ class ZigToolchainListService: SerializablePersistentStateComponent<ZigToolchain
|
||||||
fun addChangeListener(listener: ToolchainListChangeListener)
|
fun addChangeListener(listener: ToolchainListChangeListener)
|
||||||
fun removeChangeListener(listener: ToolchainListChangeListener)
|
fun removeChangeListener(listener: ToolchainListChangeListener)
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
interface ToolchainListChangeListener {
|
|
||||||
suspend fun toolchainListChanged()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ import java.util.UUID
|
||||||
name = "ZigToolchain",
|
name = "ZigToolchain",
|
||||||
storages = [Storage("zigbrains.xml")]
|
storages = [Storage("zigbrains.xml")]
|
||||||
)
|
)
|
||||||
class ZigToolchainService: SerializablePersistentStateComponent<ZigToolchainService.State>(State()), ZigToolchainService.IService {
|
class ZigToolchainService: SerializablePersistentStateComponent<ZigToolchainService.State>(State()), IZigToolchainService {
|
||||||
override var toolchainUUID: UUID?
|
override var toolchainUUID: UUID?
|
||||||
get() = state.toolchain.ifBlank { null }?.let { UUID.fromString(it) }?.takeIf {
|
get() = state.toolchain.ifBlank { null }?.let { UUID.fromString(it) }?.takeIf {
|
||||||
if (ZigToolchainListService.getInstance().hasToolchain(it)) {
|
if (ZigToolchainListService.getInstance().hasToolchain(it)) {
|
||||||
|
@ -66,11 +66,11 @@ class ZigToolchainService: SerializablePersistentStateComponent<ZigToolchainServ
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun getInstance(project: Project): IService = project.service<ZigToolchainService>()
|
fun getInstance(project: Project): IZigToolchainService = project.service<ZigToolchainService>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed interface IService {
|
sealed interface IZigToolchainService {
|
||||||
var toolchainUUID: UUID?
|
var toolchainUUID: UUID?
|
||||||
val toolchain: ZigToolchain?
|
val toolchain: ZigToolchain?
|
||||||
}
|
}
|
||||||
}
|
|
|
@ -42,7 +42,7 @@ internal interface ZigToolchainProvider {
|
||||||
fun matchesSuggestion(toolchain: ZigToolchain, suggestion: ZigToolchain): Boolean
|
fun matchesSuggestion(toolchain: ZigToolchain, suggestion: ZigToolchain): Boolean
|
||||||
fun createConfigurable(uuid: UUID, toolchain: ZigToolchain): ZigToolchainConfigurable<*>
|
fun createConfigurable(uuid: UUID, toolchain: ZigToolchain): ZigToolchainConfigurable<*>
|
||||||
fun suggestToolchains(): List<Pair<SemVer?, ZigToolchain>>
|
fun suggestToolchains(): List<Pair<SemVer?, ZigToolchain>>
|
||||||
fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean)
|
fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean, isSelected: Boolean)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ZigToolchain.Ref.resolve(): ZigToolchain? {
|
fun ZigToolchain.Ref.resolve(): ZigToolchain? {
|
||||||
|
@ -67,7 +67,7 @@ fun ZigToolchain.createNamedConfigurable(uuid: UUID): ZigToolchainConfigurable<*
|
||||||
}
|
}
|
||||||
|
|
||||||
fun suggestZigToolchains(): List<ZigToolchain> {
|
fun suggestZigToolchains(): List<ZigToolchain> {
|
||||||
val existing = ZigToolchainListService.getInstance().toolchains.map { (uuid, tc) -> tc }.toList()
|
val existing = ZigToolchainListService.getInstance().toolchains.map { (_, tc) -> tc }.toList()
|
||||||
return EXTENSION_POINT_NAME.extensionList.flatMap { ext ->
|
return EXTENSION_POINT_NAME.extensionList.flatMap { ext ->
|
||||||
val compatibleExisting = existing.filter { ext.isCompatible(it) }
|
val compatibleExisting = existing.filter { ext.isCompatible(it) }
|
||||||
val suggestions = ext.suggestToolchains()
|
val suggestions = ext.suggestToolchains()
|
||||||
|
@ -75,7 +75,7 @@ fun suggestZigToolchains(): List<ZigToolchain> {
|
||||||
}.sortedByDescending { it.first }.map { it.second }
|
}.sortedByDescending { it.first }.map { it.second }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ZigToolchain.render(component: SimpleColoredComponent, isSuggestion: Boolean) {
|
fun ZigToolchain.render(component: SimpleColoredComponent, isSuggestion: Boolean, isSelected: Boolean) {
|
||||||
val provider = EXTENSION_POINT_NAME.extensionList.find { it.isCompatible(this) } ?: throw IllegalStateException()
|
val provider = EXTENSION_POINT_NAME.extensionList.find { it.isCompatible(this) } ?: throw IllegalStateException()
|
||||||
return provider.render(this, component, isSuggestion)
|
return provider.render(this, component, isSuggestion, isSelected)
|
||||||
}
|
}
|
|
@ -116,24 +116,33 @@ class LocalZigToolchainProvider: ZigToolchainProvider {
|
||||||
return res.mapNotNull { LocalZigToolchain.tryFromPathString(it) }
|
return res.mapNotNull { LocalZigToolchain.tryFromPathString(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean) {
|
override fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean, isSelected: Boolean) {
|
||||||
toolchain as LocalZigToolchain
|
toolchain as LocalZigToolchain
|
||||||
val path = presentDetectedPath(toolchain.location.pathString)
|
|
||||||
val name = toolchain.name
|
val name = toolchain.name
|
||||||
|
val path = presentDetectedPath(toolchain.location.pathString)
|
||||||
val primary: String
|
val primary: String
|
||||||
val secondary: String?
|
val secondary: String?
|
||||||
|
val tooltip: String?
|
||||||
if (isSuggestion) {
|
if (isSuggestion) {
|
||||||
primary = path
|
primary = path
|
||||||
secondary = name
|
secondary = name
|
||||||
|
tooltip = null
|
||||||
} else {
|
} else {
|
||||||
primary = name ?: "Zig"
|
primary = name ?: "Zig"
|
||||||
|
if (isSelected) {
|
||||||
|
secondary = null
|
||||||
|
tooltip = path
|
||||||
|
} else {
|
||||||
secondary = path
|
secondary = path
|
||||||
|
tooltip = null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
component.append(primary)
|
component.append(primary)
|
||||||
if (secondary != null) {
|
if (secondary != null) {
|
||||||
component.append(" ")
|
component.append(" ")
|
||||||
component.append(secondary, SimpleTextAttributes.GRAYED_ATTRIBUTES)
|
component.append(secondary, SimpleTextAttributes.GRAYED_ATTRIBUTES)
|
||||||
}
|
}
|
||||||
|
component.toolTipText = tooltip
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
package com.falsepattern.zigbrains.project.toolchain.ui
|
package com.falsepattern.zigbrains.project.toolchain.ui
|
||||||
|
|
||||||
import com.falsepattern.zigbrains.ZigBrainsBundle
|
import com.falsepattern.zigbrains.ZigBrainsBundle
|
||||||
|
import com.falsepattern.zigbrains.project.toolchain.ToolchainListChangeListener
|
||||||
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainListService
|
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainListService
|
||||||
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainService
|
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainService
|
||||||
import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable
|
import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable
|
||||||
|
@ -48,7 +49,7 @@ import java.util.UUID
|
||||||
import javax.swing.JButton
|
import javax.swing.JButton
|
||||||
import kotlin.collections.addAll
|
import kotlin.collections.addAll
|
||||||
|
|
||||||
class ZigToolchainEditor(private val isForDefaultProject: Boolean = false): SubConfigurable<Project>, ZigToolchainListService.ToolchainListChangeListener {
|
class ZigToolchainEditor(private val isForDefaultProject: Boolean = false): SubConfigurable<Project>, ToolchainListChangeListener {
|
||||||
private val toolchainBox: TCComboBox
|
private val toolchainBox: TCComboBox
|
||||||
private var selectOnNextReload: UUID? = null
|
private var selectOnNextReload: UUID? = null
|
||||||
private val model: TCModel
|
private val model: TCModel
|
||||||
|
|
|
@ -24,6 +24,7 @@ package com.falsepattern.zigbrains.project.toolchain.ui
|
||||||
|
|
||||||
import com.falsepattern.zigbrains.Icons
|
import com.falsepattern.zigbrains.Icons
|
||||||
import com.falsepattern.zigbrains.ZigBrainsBundle
|
import com.falsepattern.zigbrains.ZigBrainsBundle
|
||||||
|
import com.falsepattern.zigbrains.project.toolchain.ToolchainListChangeListener
|
||||||
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainListService
|
import com.falsepattern.zigbrains.project.toolchain.ZigToolchainListService
|
||||||
import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchain
|
import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchain
|
||||||
import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable
|
import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable
|
||||||
|
@ -62,7 +63,7 @@ import javax.swing.JComponent
|
||||||
import javax.swing.event.DocumentEvent
|
import javax.swing.event.DocumentEvent
|
||||||
import javax.swing.tree.DefaultTreeModel
|
import javax.swing.tree.DefaultTreeModel
|
||||||
|
|
||||||
class ZigToolchainListEditor : MasterDetailsComponent(), ZigToolchainListService.ToolchainListChangeListener {
|
class ZigToolchainListEditor : MasterDetailsComponent(), ToolchainListChangeListener {
|
||||||
private var isTreeInitialized = false
|
private var isTreeInitialized = false
|
||||||
private var registered: Boolean = false
|
private var registered: Boolean = false
|
||||||
private var itemSelectedListeners = ArrayList<Consumer<UUID?>>()
|
private var itemSelectedListeners = ArrayList<Consumer<UUID?>>()
|
||||||
|
|
|
@ -204,7 +204,7 @@ internal class TCCellRenderer(val getModel: () -> TCModel) : ColoredListCellRend
|
||||||
}
|
}
|
||||||
this.icon = icon
|
this.icon = icon
|
||||||
val toolchain = value.toolchain
|
val toolchain = value.toolchain
|
||||||
toolchain.render(this, isSuggestion)
|
toolchain.render(this, isSuggestion, index == -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
is TCListElem.Download -> {
|
is TCListElem.Download -> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue