mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 20:39:40 +07:00
DS-724 Detect existing conda envs on Project creation and disable custom sorting
Signed-off-by: Elizaveta Shashkova <elizaveta.shashkova@jetbrains.com> GitOrigin-RevId: 18405e53c5c276021be2d1285cdbd06593f7cd80
This commit is contained in:
committed by
intellij-monorepo-bot
parent
49296d58fe
commit
9c70a34e97
@@ -70,5 +70,6 @@
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="library" name="Trove4j" level="project" />
|
||||
<orderEntry type="module" module-name="intellij.platform.util" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -13,6 +13,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||
import com.intellij.openapi.ui.VerticalFlowLayout;
|
||||
import com.intellij.openapi.util.NlsContexts;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.UserDataHolderBase;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.platform.DirectoryProjectGenerator;
|
||||
@@ -30,8 +31,10 @@ import com.jetbrains.python.packaging.PyPackage;
|
||||
import com.jetbrains.python.packaging.PyPackageUtil;
|
||||
import com.jetbrains.python.psi.PyUtil;
|
||||
import com.jetbrains.python.sdk.*;
|
||||
import com.jetbrains.python.sdk.add.PyAddExistingCondaEnvPanel;
|
||||
import com.jetbrains.python.sdk.add.PyAddSdkGroupPanel;
|
||||
import com.jetbrains.python.sdk.add.PyAddSdkPanel;
|
||||
import com.jetbrains.python.sdk.conda.PyCondaSdkCustomizer;
|
||||
import one.util.streamex.StreamEx;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -100,6 +103,10 @@ public class ProjectSpecificSettingsStep<T> extends ProjectSettingsStepBase<T> i
|
||||
else if (panel instanceof PyAddExistingSdkPanel) {
|
||||
return panel.getSdk();
|
||||
}
|
||||
else if (panel instanceof PyAddExistingCondaEnvPanel) {
|
||||
final PyAddExistingCondaEnvPanel condaEnv = (PyAddExistingCondaEnvPanel)panel;
|
||||
return new PyLazySdk("Uninitialized environment", condaEnv::getOrCreateSdk);
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
@@ -289,12 +296,23 @@ public class ProjectSpecificSettingsStep<T> extends ProjectSettingsStepBase<T> i
|
||||
final PyAddNewEnvironmentPanel newEnvironmentPanel = new PyAddNewEnvironmentPanel(existingSdks, newProjectPath, preferredEnvironment);
|
||||
final PyAddExistingSdkPanel existingSdkPanel = new PyAddExistingSdkPanel(null, null, existingSdks, newProjectPath, preferredSdk);
|
||||
|
||||
final PyAddSdkPanel defaultPanel = PySdkSettings.getInstance().getUseNewEnvironmentForNewProject() ?
|
||||
newEnvironmentPanel : existingSdkPanel;
|
||||
PyAddSdkPanel defaultPanel = PySdkSettings.getInstance().getUseNewEnvironmentForNewProject() ?
|
||||
newEnvironmentPanel : existingSdkPanel;
|
||||
List<PyAddSdkPanel> panels;
|
||||
if (PyCondaSdkCustomizer.Companion.getInstance().getPreferExistingEnvironments()) {
|
||||
PyAddExistingCondaEnvPanel existingConda =
|
||||
new PyAddExistingCondaEnvPanel(null, null, existingSdks, newProjectPath, new UserDataHolderBase(), this::checkValid);
|
||||
panels = Arrays.asList(existingSdkPanel, existingConda, newEnvironmentPanel);
|
||||
if (existingSdks.isEmpty()) {
|
||||
defaultPanel = existingConda;
|
||||
}
|
||||
}
|
||||
else {
|
||||
panels = Arrays.asList(newEnvironmentPanel, existingSdkPanel);
|
||||
}
|
||||
myInterpretersDecorator = new HideableDecorator(decoratorPanel, getProjectInterpreterTitle(defaultPanel), false);
|
||||
myInterpretersDecorator.setContentComponent(container);
|
||||
|
||||
final List<PyAddSdkPanel> panels = Arrays.asList(newEnvironmentPanel, existingSdkPanel);
|
||||
myInterpreterPanel = new PyAddSdkGroupPanel(PyBundle.messagePointer("python.add.sdk.panel.name.new.project.interpreter"),
|
||||
getIcon(), panels, defaultPanel);
|
||||
myInterpreterPanel.addChangeListener(() -> {
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.intellij.webcore.packaging.PackagesNotificationPanel
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.packaging.ui.PyPackageManagementService
|
||||
import com.jetbrains.python.psi.LanguageLevel
|
||||
import com.jetbrains.python.sdk.conda.PyCondaSdkCustomizer
|
||||
import com.jetbrains.python.sdk.flavors.CondaEnvSdkFlavor
|
||||
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
|
||||
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor
|
||||
@@ -100,7 +101,8 @@ fun detectVirtualEnvs(module: Module?, existingSdks: List<Sdk>, context: UserDat
|
||||
filterSuggestedPaths(VirtualEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module)
|
||||
|
||||
fun detectCondaEnvs(module: Module?, existingSdks: List<Sdk>, context: UserDataHolder): List<PyDetectedSdk> =
|
||||
filterSuggestedPaths(CondaEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module)
|
||||
filterSuggestedPaths(CondaEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module,
|
||||
!PyCondaSdkCustomizer.instance.disableEnvsSorting)
|
||||
|
||||
fun findExistingAssociatedSdk(module: Module, existingSdks: List<Sdk>): Sdk? {
|
||||
return existingSdks
|
||||
@@ -319,16 +321,22 @@ fun Sdk.getOrCreateAdditionalData(): PythonSdkAdditionalData {
|
||||
|
||||
private fun filterSuggestedPaths(suggestedPaths: MutableCollection<String>,
|
||||
existingSdks: List<Sdk>,
|
||||
module: Module?): List<PyDetectedSdk> {
|
||||
module: Module?,
|
||||
sortByModule: Boolean = true): List<PyDetectedSdk> {
|
||||
val existingPaths = existingSdks.map { it.homePath }.toSet()
|
||||
return suggestedPaths
|
||||
val paths = suggestedPaths
|
||||
.asSequence()
|
||||
.filterNot { it in existingPaths }
|
||||
.distinct()
|
||||
.map { PyDetectedSdk(it) }
|
||||
.sortedWith(compareBy({ !it.isAssociatedWithModule(module) },
|
||||
{ it.homePath }))
|
||||
.toList()
|
||||
return if (sortByModule) {
|
||||
paths.sortedWith(compareBy({ !it.isAssociatedWithModule(module) },
|
||||
{ it.homePath }))
|
||||
}
|
||||
else {
|
||||
paths
|
||||
}
|
||||
}
|
||||
|
||||
val ACTIVE_PYTHON_SDK_TOPIC: Topic<ActiveSdkListener> = Topic("Active SDK changed", ActiveSdkListener::class.java)
|
||||
|
||||
@@ -45,7 +45,8 @@ class PyAddExistingCondaEnvPanel(private val project: Project?,
|
||||
private val module: Module?,
|
||||
private val existingSdks: List<Sdk>,
|
||||
override var newProjectPath: String?,
|
||||
context: UserDataHolder) : PyAddSdkPanel() {
|
||||
context: UserDataHolder,
|
||||
onEnvsDetectionComplete: (() -> Boolean)? = null) : PyAddSdkPanel() {
|
||||
override val panelName: String get() = PyBundle.message("python.add.sdk.panel.name.existing.environment")
|
||||
override val icon: Icon = PythonIcons.Python.Anaconda
|
||||
private val sdkComboBox = PySdkPathChoosingComboBox()
|
||||
@@ -79,8 +80,8 @@ class PyAddExistingCondaEnvPanel(private val project: Project?,
|
||||
.addComponent(makeSharedField)
|
||||
.panel
|
||||
add(formPanel, BorderLayout.NORTH)
|
||||
addInterpretersAsync(sdkComboBox) {
|
||||
detectCondaEnvs(module, existingSdks, context)
|
||||
addInterpretersAsync(sdkComboBox, { detectCondaEnvs(module, existingSdks, context) }) {
|
||||
onEnvsDetectionComplete?.invoke()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,9 @@ interface PyCondaSdkCustomizer {
|
||||
val suggestSharedCondaEnvironments: Boolean
|
||||
get() = false
|
||||
|
||||
val disableEnvsSorting: Boolean
|
||||
get() = false
|
||||
|
||||
companion object {
|
||||
val EP_NAME: ExtensionPointName<PyCondaSdkCustomizer> = ExtensionPointName.create("Pythonid.condaSdkCustomizer")
|
||||
val instance: PyCondaSdkCustomizer
|
||||
|
||||
Reference in New Issue
Block a user