VirtualEnv/VirtualenvManagerDialog.py

changeset 6338
104ee21d765d
child 6349
17b3c75913de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VirtualEnv/VirtualenvManagerDialog.py	Sun Jun 10 16:55:39 2018 +0200
@@ -0,0 +1,210 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to manage the list of defined virtual
+environments.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot, Qt
+from PyQt5.QtWidgets import QDialog, QTreeWidgetItem, QHeaderView
+
+from .Ui_VirtualenvManagerDialog import Ui_VirtualenvManagerDialog
+
+
+class VirtualenvManagerDialog(QDialog, Ui_VirtualenvManagerDialog):
+    """
+    Class implementing a dialog to manage the list of defined virtual
+    environments.
+    """
+    def __init__(self, manager, parent=None):
+        """
+        Constructor
+        
+        @param manager reference to the virtual environment manager
+        @type VirtualenvManager
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super(VirtualenvManagerDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.__manager = manager
+        
+        self.__populateVenvList()
+        self.__updateButtons()
+        
+        self.venvList.header().setSortIndicator(0, Qt.AscendingOrder)
+    
+    def __updateButtons(self):
+        """
+        Private method to update the enabled state of the various buttons.
+        """
+        selectedItemsCount = len(self.venvList.selectedItems())
+        topLevelItemCount = self.venvList.topLevelItemCount()
+        
+        canBeDeleted = (
+            selectedItemsCount == 1 and
+            self.venvList.selectedItems()[0].text(0) != "<default>"
+        )
+        canAllBeDeleted = (
+            topLevelItemCount == 1 and
+            self.venvList.topLevelItem(0).text(0) != "<default>"
+        )
+        
+        self.editButton.setEnabled(selectedItemsCount == 1)
+        self.removeButton.setEnabled(selectedItemsCount > 1 or canBeDeleted)
+        self.removeAllButton.setEnabled(
+            topLevelItemCount > 1 or canAllBeDeleted)
+        self.deleteButton.setEnabled(selectedItemsCount > 1 or canBeDeleted)
+        self.deleteAllButton.setEnabled(
+            topLevelItemCount > 1 or canAllBeDeleted)
+    
+    @pyqtSlot()
+    def on_addButton_clicked(self):
+        """
+        Private slot to add a new entry.
+        """
+        from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
+        dlg = VirtualenvAddEditDialog(self.__manager)
+        if dlg.exec_() == QDialog.Accepted:
+            venvName, venvDirectory, venvInterpreter = dlg.getData()
+            
+            self.__manager.addVirtualEnv(venvName, venvDirectory,
+                                         venvInterpreter)
+    
+    @pyqtSlot()
+    def on_newButton_clicked(self):
+        """
+        Private slot to create a new virtual environment.
+        """
+        self.__manager.createVirtualEnv()
+    
+    @pyqtSlot()
+    def on_editButton_clicked(self):
+        """
+        Private slot to edit the selected entry.
+        """
+        selectedItem = self.venvList.selectedItems()[0]
+        oldVenvName = selectedItem.text(0)
+        
+        from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
+        dlg = VirtualenvAddEditDialog(self.__manager, selectedItem.text(0),
+                                      selectedItem.text(1),
+                                      selectedItem.text(2))
+        if dlg.exec_() == QDialog.Accepted:
+            venvName, venvDirectory, venvInterpreter = dlg.getData()
+            if venvName != oldVenvName:
+                self.__manager.renameVirtualEnv(
+                    oldVenvName, venvName, venvDirectory, venvInterpreter)
+            else:
+                self.__manager.setVirtualEnv(
+                    venvName, venvDirectory, venvInterpreter)
+    
+    @pyqtSlot()
+    def on_removeButton_clicked(self):
+        """
+        Private slot to remove all selected entries from the list but keep
+        their directories.
+        """
+        selectedVenvs = []
+        for itm in self.venvList.selectedItems():
+            selectedVenvs.append(itm.text(0))
+        
+        if selectedVenvs:
+            self.__manager.removeVirtualEnvs(selectedVenvs)
+    
+    @pyqtSlot()
+    def on_removeAllButton_clicked(self):
+        """
+        Private slot to remove all entries from the list but keep their
+        directories.
+        """
+        venvNames = []
+        for index in range(self.venvList.topLevelItemCount()):
+            itm = self.venvList.topLevelItem(index)
+            venvNames.append(itm.text(0))
+        
+        if venvNames:
+            self.__manager.removeVirtualEnvs(venvNames)
+    
+    @pyqtSlot()
+    def on_deleteButton_clicked(self):
+        """
+        Private slot to delete all selected entries from the list and disk.
+        """
+        selectedVenvs = []
+        for itm in self.venvList.selectedItems():
+            selectedVenvs.append(itm.text(0))
+        
+        if selectedVenvs:
+            self.__manager.deleteVirtualEnvs(selectedVenvs)
+    
+    @pyqtSlot()
+    def on_deleteAllButton_clicked(self):
+        """
+        Private slot to delete all entries from the list and disk.
+        """
+        venvNames = []
+        for index in range(self.venvList.topLevelItemCount()):
+            itm = self.venvList.topLevelItem(index)
+            venvNames.append(itm.text(0))
+        
+        if venvNames:
+            self.__manager.deleteVirtualEnvs(venvNames)
+    
+    @pyqtSlot()
+    def on_venvList_itemSelectionChanged(self):
+        """
+        Private slot handling a change of the selected items.
+        """
+        self.__updateButtons()
+    
+    @pyqtSlot()
+    def refresh(self):
+        """
+        Public slot to refresh the list of shown items.
+        """
+        # 1. remember selected entries
+        selectedVenvs = []
+        for itm in self.venvList.selectedItems():
+            selectedVenvs.append(itm.text(0))
+        
+        # 2. clear the list
+        self.venvList.clear()
+        
+        # 3. re-populate the list
+        self.__populateVenvList()
+        
+        # 4. re-establish selection
+        for venvName in selectedVenvs:
+            itms = self.venvList.findItems(venvName, Qt.MatchExactly, 0)
+            if itms:
+                itms[0].setSelected(True)
+    
+    def __populateVenvList(self):
+        """
+        Private method to populate the list of virtual environments.
+        """
+        environments = self.__manager.getEnvironmentEntries()
+        for venvName in environments:
+            QTreeWidgetItem(self.venvList, [
+                venvName,
+                environments[venvName][0],
+                environments[venvName][1],
+            ])
+        
+        self.__resizeSections()
+    
+    def __resizeSections(self):
+        """
+        Private method to resize the sections of the environment list to their
+        contents.
+        """
+        self.venvList.header().resizeSections(
+            QHeaderView.ResizeToContents)
+        self.venvList.header().setStretchLastSection(True)

eric ide

mercurial