diff --git a/python/src/com/jetbrains/python/packaging/bridge/PythonPackageManagementServiceBridge.kt b/python/src/com/jetbrains/python/packaging/bridge/PythonPackageManagementServiceBridge.kt index 2417494128e2..cc413378e892 100644 --- a/python/src/com/jetbrains/python/packaging/bridge/PythonPackageManagementServiceBridge.kt +++ b/python/src/com/jetbrains/python/packaging/bridge/PythonPackageManagementServiceBridge.kt @@ -59,7 +59,7 @@ class PythonPackageManagementServiceBridge(project: Project,sdk: Sdk) : PyPackag .filter { it.isNotBlank() } .map { val line = it.split("\t") - PythonPackage(line[0], line[1]) + PythonPackage(line[0], line[1], isEditableMode = false) } .sortedWith(compareBy(PythonPackage::name)) .toList() diff --git a/python/src/com/jetbrains/python/packaging/common/packages.kt b/python/src/com/jetbrains/python/packaging/common/packages.kt index 97679dfde463..d3f6ca6109a0 100644 --- a/python/src/com/jetbrains/python/packaging/common/packages.kt +++ b/python/src/com/jetbrains/python/packaging/common/packages.kt @@ -8,7 +8,7 @@ import com.jetbrains.python.packaging.repository.PyPackageRepository import com.jetbrains.python.packaging.requirement.PyRequirementRelation import org.jetbrains.annotations.Nls -open class PythonPackage(val name: String, val version: String) { +open class PythonPackage(val name: String, val version: String, val isEditableMode: Boolean) { override fun toString(): String { return "PythonPackage(name='$name', version='$version')" } diff --git a/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt b/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt index aa87194dc7aa..834280fe93db 100644 --- a/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt @@ -93,7 +93,8 @@ class CondaPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager(p .filterNot { it.startsWith("#") } .map { line -> line.split("\\s+".toRegex()) } .filterNot { it.size < 2 } - .map { CondaPackage(it[0], it[1], installedWithPip = (it.size >= 4 && it[3] == "pypi")) } + //TODO: fix + .map { CondaPackage(it[0], it[1], editableMode = false, installedWithPip = (it.size >= 4 && it[3] == "pypi")) } .sortedWith(compareBy(CondaPackage::name)) .toList() } diff --git a/python/src/com/jetbrains/python/packaging/conda/common.kt b/python/src/com/jetbrains/python/packaging/conda/common.kt index 97a8e48f0b7e..3f7eed3d6efd 100644 --- a/python/src/com/jetbrains/python/packaging/conda/common.kt +++ b/python/src/com/jetbrains/python/packaging/conda/common.kt @@ -8,7 +8,11 @@ import com.jetbrains.python.packaging.common.PythonPackageSpecificationBase import com.jetbrains.python.packaging.repository.PyPackageRepository import com.jetbrains.python.packaging.requirement.PyRequirementRelation -class CondaPackage(name: String, version: String, val installedWithPip: Boolean = false) : PythonPackage(name, version) { +class CondaPackage( + name: String, version: String, + editableMode: Boolean, + val installedWithPip: Boolean = false, +) : PythonPackage(name, version, editableMode) { override fun toString(): String { return "CondaPackage(name='$name', version='$version', installedWithPip=$installedWithPip)" } diff --git a/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt b/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt index 5fa731047f72..34ea4adb5c99 100644 --- a/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt @@ -29,7 +29,7 @@ class PipPythonPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManag .filter { it.isNotBlank() } .map { val line = it.split("\t") - PythonPackage(line[0], line[1]) + PythonPackage(line[0], line[1], isEditableMode = false) } .sortedWith(compareBy(PythonPackage::name)) .toList() diff --git a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagesToolWindowModuleAttachListener.kt b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagesToolWindowModuleAttachListener.kt index 6c8d8e712ea7..8350fa834e00 100644 --- a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagesToolWindowModuleAttachListener.kt +++ b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagesToolWindowModuleAttachListener.kt @@ -1,9 +1,12 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.jetbrains.python.packaging.toolwindow +import com.intellij.openapi.Disposable import com.intellij.openapi.components.service import com.intellij.openapi.module.Module +import com.intellij.openapi.util.Disposer import com.intellij.platform.ModuleAttachListener +import com.jetbrains.python.packaging.utils.PyPackageCoroutine import java.nio.file.Path class PyPackagesToolWindowModuleAttachListener : ModuleAttachListener { @@ -13,5 +16,14 @@ class PyPackagesToolWindowModuleAttachListener : ModuleAttachListener { } } + override fun beforeDetach(module: Module) { + @Suppress("IncorrectParentDisposable") + //We do not have function after detach so this is small trick + Disposer.register(module, Disposable { + PyPackageCoroutine.launch(module.project) { + module.project.service().moduleAttached() + } + }) + } } \ No newline at end of file diff --git a/python/src/com/jetbrains/python/packaging/toolwindow/model/modelComponents.kt b/python/src/com/jetbrains/python/packaging/toolwindow/model/modelComponents.kt index d75ef8c68259..8af3ad6466b5 100644 --- a/python/src/com/jetbrains/python/packaging/toolwindow/model/modelComponents.kt +++ b/python/src/com/jetbrains/python/packaging/toolwindow/model/modelComponents.kt @@ -17,7 +17,8 @@ sealed class DisplayablePackage(@NlsSafe val name: String, val repository: PyPac class InstalledPackage(val instance: PythonPackage, repository: PyPackageRepository, val nextVersion: PyPackageVersion? = null) : DisplayablePackage(instance.name, repository) { val currentVersion = PyPackageVersionNormalizer.normalize(instance.version) - val icon: Icon? + val isEditMode = instance.isEditableMode + val sourceRepoIcon: Icon? get() { val condaPackage = instance as? CondaPackage ?: return null return if (condaPackage.installedWithPip) { diff --git a/python/src/com/jetbrains/python/packaging/toolwindow/packages/PyPaginationAwareRenderer.kt b/python/src/com/jetbrains/python/packaging/toolwindow/packages/PyPaginationAwareRenderer.kt index e8beab097867..a481d324c00b 100644 --- a/python/src/com/jetbrains/python/packaging/toolwindow/packages/PyPaginationAwareRenderer.kt +++ b/python/src/com/jetbrains/python/packaging/toolwindow/packages/PyPaginationAwareRenderer.kt @@ -1,7 +1,9 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.jetbrains.python.packaging.toolwindow.packages +import com.intellij.icons.AllIcons import com.intellij.openapi.util.NlsSafe +import com.intellij.ui.components.JBLabel import com.intellij.ui.hover.TableHoverListener import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil @@ -21,7 +23,7 @@ import javax.swing.JTable import javax.swing.table.DefaultTableCellRenderer internal class PyPaginationAwareRenderer : DefaultTableCellRenderer() { - private val nameLabel = JLabel().apply { border = JBUI.Borders.empty(0, 12) } + private val nameLabel = JBLabel().apply { border = JBUI.Borders.empty(0, 12) } private val versionLabel = JLabel().apply { border = JBUI.Borders.emptyRight(12) } @@ -88,7 +90,7 @@ internal class PyPaginationAwareRenderer : DefaultTableCellRenderer() { versionLabel.text = version versionPanel.add(versionLabel) } - versionLabel.icon = (value as? InstalledPackage)?.icon + versionLabel.icon = (value as? InstalledPackage)?.sourceRepoIcon return versionPanel } @@ -99,7 +101,10 @@ internal class PyPaginationAwareRenderer : DefaultTableCellRenderer() { namePanel.foreground = JBUI.CurrentTheme.Table.foreground(rowSelected, tableFocused) nameLabel.text = currentPackage.name + val isEditMode = (currentPackage as? InstalledPackage)?.isEditMode == true + nameLabel.icon = if (isEditMode) AllIcons.Actions.Edit else null nameLabel.foreground = JBUI.CurrentTheme.Label.foreground() + return namePanel }