--- a/CondaInterface/CondaPackagesWidget.py Mon Feb 11 19:33:12 2019 +0100 +++ b/CondaInterface/CondaPackagesWidget.py Mon Feb 11 19:57:53 2019 +0100 @@ -14,9 +14,9 @@ from PyQt5.QtCore import pyqtSlot, Qt from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QWidget, QToolButton, QMenu, QTreeWidgetItem, \ - QApplication + QApplication, QLineEdit -from E5Gui import E5MessageBox +from E5Gui import E5FileDialog, E5MessageBox, E5TextInputDialog from E5Gui.E5Application import e5App from .Ui_CondaPackagesWidget import Ui_CondaPackagesWidget @@ -100,19 +100,16 @@ self.__cleanMenu = QMenu(self.tr("Clean"), self) self.__cleanMenu.addAction( - self.tr("All"), lambda: self.__cleanMenuAction("all")) + self.tr("All"), lambda: self.__conda.cleanConda("all")) self.__cleanMenu.addAction( - self.tr("Cache"), lambda: self.__cleanMenuAction("index-cache")) + self.tr("Cache"), lambda: self.__conda.cleanConda("index-cache")) self.__cleanMenu.addAction( self.tr("Lock Files"), - lambda: self.__cleanMenuAction("lock")) - self.__cleanMenu.addAction( - self.tr("Packages"), lambda: self.__cleanMenuAction("packages")) + lambda: self.__conda.cleanConda("lock")) self.__cleanMenu.addAction( - self.tr("Tarballs"), lambda: self.__cleanMenuAction("tarballs")) + self.tr("Packages"), lambda: self.__conda.cleanConda("packages")) self.__cleanMenu.addAction( - self.tr("Temporary Files"), - lambda: self.__cleanMenuAction("temp_files")) + self.tr("Tarballs"), lambda: self.__conda.cleanConda("tarballs")) self.__condaMenu.addAction( self.tr("About Conda..."), self.__aboutConda) @@ -123,17 +120,20 @@ self.__envActs.append(self.__condaMenu.addAction( self.tr("Install Packages"), self.__installPackages)) self.__envActs.append(self.__condaMenu.addAction( - self.tr("Install Local Packages"), self.__installLocalPackage)) - self.__envActs.append(self.__condaMenu.addAction( self.tr("Install Requirements"), self.__installRequirements)) self.__condaMenu.addSeparator() self.__envActs.append(self.__condaMenu.addAction( self.tr("Generate Requirements"), self.__generateRequirements)) self.__condaMenu.addSeparator() + self.__condaMenu.addAction( + self.tr("Create Environment from Requirements"), + self.__createEnvironment) self.__envActs.append(self.__condaMenu.addAction( self.tr("Clone Environment"), self.__cloneEnvironment)) + self.__deleteEnvAct = self.__condaMenu.addAction( + self.tr("Delete Environment"), self.__deleteEnvironment) self.__condaMenu.addSeparator() - self.__envActs.append(self.__condaMenu.addMenu(self.__cleanMenu)) + self.__condaMenu.addMenu(self.__cleanMenu) self.__condaMenu.addSeparator() self.__condaMenu.addAction( self.tr("Edit User Configuration..."), @@ -509,14 +509,15 @@ enable = selectedEnvironment not in [""] for act in self.__envActs: act.setEnabled(enable) + + self.__deleteEnvAct.setEnabled( + selectedEnvironment not in ["", self.__conda.RootName]) @pyqtSlot() def __aboutConda(self): """ - Private slot to + Private slot to show some information about the conda installation. """ - # TODO: implement this menu function - # conda info --all infoDict = self.__conda.getCondaInformation() from .CondaInfoDialog import CondaInfoDialog @@ -526,55 +527,106 @@ @pyqtSlot() def __installPackages(self): """ - Private slot to + Private slot to install packages. """ - # TODO: implement this menu function - # conda install ... - - @pyqtSlot() - def __installLocalPackage(self): - """ - Private slot to - """ - # TODO: implement this menu function - # conda install --use-local + prefix = self.environmentsComboBox.itemData( + self.environmentsComboBox.currentIndex()) + if prefix: + ok, packageSpecs = E5TextInputDialog.getText( + self, + self.tr("Install Packages"), + self.tr("Package Specifications (separated by whitespace):"), + QLineEdit.Normal, + minimumWidth=600) + if ok and packageSpecs.strip(): + packages = [p.strip() for p in packageSpecs.split()] + ok = self.__conda.installPackages(packages, prefix=prefix) + if ok: + self.on_refreshButton_clicked() @pyqtSlot() def __installRequirements(self): """ - Private slot to + Private slot to install packages from requirements files. """ - # TODO: implement this menu function - # conda install --file FILE1 --file FILE2 ... + prefix = self.environmentsComboBox.itemData( + self.environmentsComboBox.currentIndex()) + if prefix: + requirements = E5FileDialog.getOpenFileNames( + self, + self.tr("Install Packages"), + "", + self.tr("Text Files (*.txt);;All Files (*)")) + if requirements: + args = [] + for requirement in requirements: + args.extend(["--file", requirement]) + ok = self.__conda.installPackages(args, prefix=prefix) + if ok: + self.on_refreshButton_clicked() @pyqtSlot() def __generateRequirements(self): """ - Private slot to + Private slot to generate a requirements file. """ - # TODO: implement this menu function - # conda list --export + prefix = self.environmentsComboBox.itemData( + self.environmentsComboBox.currentIndex()) + if prefix: + env = self.environmentsComboBox.currentText() + + from .CondaExportDialog import CondaExportDialog + + self.__requirementsDialog = CondaExportDialog( + self.__conda, env, prefix) + self.__requirementsDialog.show() + QApplication.processEvents() + self.__requirementsDialog.start() @pyqtSlot() def __cloneEnvironment(self): """ - Private slot to - """ - # TODO: implement this menu function - # conda create --clone ENV - - def __cleanMenuAction(self, cleanAction): - """ - Private method to + Private slot to clone a conda environment. """ - # TODO: implement this menu function - # conda clean - # --all (act = 'all') - # --index-cache (act = 'index-cache') - # --lock (act = 'lock') - # --packages (act = 'packages') - # --tarballs (act = 'tarballs') - # -c prefix1 prefix2 ... (act = 'temp_files') + prefix = self.environmentsComboBox.itemData( + self.environmentsComboBox.currentIndex()) + if prefix: + ok, envName = E5TextInputDialog.getText( + self, + self.tr("Clone Environment"), + self.tr("Enter name for the cloned environment:"), + QLineEdit.Normal) + if ok and envName.strip(): + args = [ + "--name", + envName.strip(), + "--clone", + prefix, + ] + self.__conda.createCondaEnvironment(args) + # TODO: add code to register the cloned env with the virt env manager + + @pyqtSlot() + def __createEnvironment(self): + """ + Private slot to create a conda environment from a requirements file. + """ + # TODO: implement this + + @pyqtSlot() + def __deleteEnvironment(self): + """ + Private slot to delete a conda environment. + """ + envName = self.environmentsComboBox.currentText() + ok = E5MessageBox.yesNo( + self, + self.tr("Delete Environment"), + self.tr("""<p>Shal the environment <b>{0}</b> really be""" + """ deleted?</p>""").format(envName) + ) + if ok: + self.__conda.removeCondaEnvironment(name=envName) @pyqtSlot() def __editUserConfiguration(self):