From 12e5ffdea1b066dfa03a438ed339ab8f9261c890 Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Wed, 9 Apr 2025 22:35:44 +0200 Subject: [PATCH] finishing touches for the toolchain selector --- .../toolchain/ZigToolchainListService.kt | 36 +++++++++---------- .../project/toolchain/ZigToolchainService.kt | 12 +++---- .../toolchain/base/ZigToolchainProvider.kt | 8 ++--- .../local/LocalZigToolchainProvider.kt | 15 ++++++-- .../toolchain/ui/ZigToolchainEditor.kt | 3 +- .../toolchain/ui/ZigToolchainListEditor.kt | 3 +- .../zigbrains/project/toolchain/ui/model.kt | 2 +- 7 files changed, 45 insertions(+), 34 deletions(-) diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainListService.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainListService.kt index aaa16dc6..e18e1070 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainListService.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainListService.kt @@ -36,7 +36,7 @@ import java.util.UUID name = "ZigToolchainList", storages = [Storage("zigbrains.xml")] ) -class ZigToolchainListService: SerializablePersistentStateComponent(State()), ZigToolchainListService.IService { +class ZigToolchainListService: SerializablePersistentStateComponent(State()), IZigToolchainListService { private val changeListeners = ArrayList>() override val toolchains: Sequence> @@ -133,22 +133,22 @@ class ZigToolchainListService: SerializablePersistentStateComponent() - } - - sealed interface IService { - val toolchains: Sequence> - fun setToolchain(uuid: UUID, toolchain: ZigToolchain) - fun registerNewToolchain(toolchain: ZigToolchain): UUID - fun getToolchain(uuid: UUID): ZigToolchain? - fun hasToolchain(uuid: UUID): Boolean - fun removeToolchain(uuid: UUID) - fun addChangeListener(listener: ToolchainListChangeListener) - fun removeChangeListener(listener: ToolchainListChangeListener) - } - - @FunctionalInterface - interface ToolchainListChangeListener { - suspend fun toolchainListChanged() + fun getInstance(): IZigToolchainListService = service() } } + +@FunctionalInterface +interface ToolchainListChangeListener { + suspend fun toolchainListChanged() +} + +sealed interface IZigToolchainListService { + val toolchains: Sequence> + fun setToolchain(uuid: UUID, toolchain: ZigToolchain) + fun registerNewToolchain(toolchain: ZigToolchain): UUID + fun getToolchain(uuid: UUID): ZigToolchain? + fun hasToolchain(uuid: UUID): Boolean + fun removeToolchain(uuid: UUID) + fun addChangeListener(listener: ToolchainListChangeListener) + fun removeChangeListener(listener: ToolchainListChangeListener) +} diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainService.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainService.kt index fc517295..5604af3b 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainService.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ZigToolchainService.kt @@ -37,7 +37,7 @@ import java.util.UUID name = "ZigToolchain", storages = [Storage("zigbrains.xml")] ) -class ZigToolchainService: SerializablePersistentStateComponent(State()), ZigToolchainService.IService { +class ZigToolchainService: SerializablePersistentStateComponent(State()), IZigToolchainService { override var toolchainUUID: UUID? get() = state.toolchain.ifBlank { null }?.let { UUID.fromString(it) }?.takeIf { if (ZigToolchainListService.getInstance().hasToolchain(it)) { @@ -66,11 +66,11 @@ class ZigToolchainService: SerializablePersistentStateComponent() + fun getInstance(project: Project): IZigToolchainService = project.service() } +} - sealed interface IService { - var toolchainUUID: UUID? - val toolchain: ZigToolchain? - } +sealed interface IZigToolchainService { + var toolchainUUID: UUID? + val toolchain: ZigToolchain? } \ No newline at end of file diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/base/ZigToolchainProvider.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/base/ZigToolchainProvider.kt index fb960bb0..841d0bf8 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/base/ZigToolchainProvider.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/base/ZigToolchainProvider.kt @@ -42,7 +42,7 @@ internal interface ZigToolchainProvider { fun matchesSuggestion(toolchain: ZigToolchain, suggestion: ZigToolchain): Boolean fun createConfigurable(uuid: UUID, toolchain: ZigToolchain): ZigToolchainConfigurable<*> fun suggestToolchains(): List> - fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean) + fun render(toolchain: ZigToolchain, component: SimpleColoredComponent, isSuggestion: Boolean, isSelected: Boolean) } fun ZigToolchain.Ref.resolve(): ZigToolchain? { @@ -67,7 +67,7 @@ fun ZigToolchain.createNamedConfigurable(uuid: UUID): ZigToolchainConfigurable<* } fun suggestZigToolchains(): List { - 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 -> val compatibleExisting = existing.filter { ext.isCompatible(it) } val suggestions = ext.suggestToolchains() @@ -75,7 +75,7 @@ fun suggestZigToolchains(): List { }.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() - return provider.render(this, component, isSuggestion) + return provider.render(this, component, isSuggestion, isSelected) } \ No newline at end of file diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt index dc6e54ce..7d550c57 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt @@ -116,24 +116,33 @@ class LocalZigToolchainProvider: ZigToolchainProvider { 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 - val path = presentDetectedPath(toolchain.location.pathString) val name = toolchain.name + val path = presentDetectedPath(toolchain.location.pathString) val primary: String val secondary: String? + val tooltip: String? if (isSuggestion) { primary = path secondary = name + tooltip = null } else { primary = name ?: "Zig" - secondary = path + if (isSelected) { + secondary = null + tooltip = path + } else { + secondary = path + tooltip = null + } } component.append(primary) if (secondary != null) { component.append(" ") component.append(secondary, SimpleTextAttributes.GRAYED_ATTRIBUTES) } + component.toolTipText = tooltip } } diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainEditor.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainEditor.kt index 99c6bcd1..265155dd 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainEditor.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainEditor.kt @@ -23,6 +23,7 @@ package com.falsepattern.zigbrains.project.toolchain.ui 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.ZigToolchainService import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable @@ -48,7 +49,7 @@ import java.util.UUID import javax.swing.JButton import kotlin.collections.addAll -class ZigToolchainEditor(private val isForDefaultProject: Boolean = false): SubConfigurable, ZigToolchainListService.ToolchainListChangeListener { +class ZigToolchainEditor(private val isForDefaultProject: Boolean = false): SubConfigurable, ToolchainListChangeListener { private val toolchainBox: TCComboBox private var selectOnNextReload: UUID? = null private val model: TCModel diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainListEditor.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainListEditor.kt index 766843d5..0037de9a 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainListEditor.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/ZigToolchainListEditor.kt @@ -24,6 +24,7 @@ package com.falsepattern.zigbrains.project.toolchain.ui import com.falsepattern.zigbrains.Icons 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.base.ZigToolchain import com.falsepattern.zigbrains.project.toolchain.base.createNamedConfigurable @@ -62,7 +63,7 @@ import javax.swing.JComponent import javax.swing.event.DocumentEvent import javax.swing.tree.DefaultTreeModel -class ZigToolchainListEditor : MasterDetailsComponent(), ZigToolchainListService.ToolchainListChangeListener { +class ZigToolchainListEditor : MasterDetailsComponent(), ToolchainListChangeListener { private var isTreeInitialized = false private var registered: Boolean = false private var itemSelectedListeners = ArrayList>() diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/model.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/model.kt index a77b1195..0671536b 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/model.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ui/model.kt @@ -204,7 +204,7 @@ internal class TCCellRenderer(val getModel: () -> TCModel) : ColoredListCellRend } this.icon = icon val toolchain = value.toolchain - toolchain.render(this, isSuggestion) + toolchain.render(this, isSuggestion, index == -1) } is TCListElem.Download -> {