Virtual Environments: improved the virtual environment handling

Sat, 23 Jun 2018 15:14:48 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 23 Jun 2018 15:14:48 +0200
changeset 6362
ec32d1d7f525
parent 6361
53f6bd7fb238
child 6363
30ba1d9bd841

Virtual Environments: improved the virtual environment handling

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.VirtualEnv.VirtualenvManagerDialog.html file | annotate | diff | comparison | revisions
VirtualEnv/VirtualenvAddEditDialog.py file | annotate | diff | comparison | revisions
VirtualEnv/VirtualenvManager.py file | annotate | diff | comparison | revisions
VirtualEnv/VirtualenvManagerDialog.py file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Fri Jun 22 18:18:23 2018 +0200
+++ b/APIs/Python3/eric6.api	Sat Jun 23 15:14:48 2018 +0200
@@ -10579,7 +10579,7 @@
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_nameEdit_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_targetDirectoryPicker_textChanged?4(txt)
-eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, parent=None)
+eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, parent=None)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.getData?4()
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_pyvenvButton_toggled?4(checked)
@@ -10592,7 +10592,7 @@
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog.getData?4()
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog?1(venvName, venvDirectory, parent=None)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", venvVariant=3)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.createVirtualEnv?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.deleteVirtualEnvs?4(venvNames)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getEnvironmentEntries?4()
@@ -10600,13 +10600,15 @@
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvInterpreter?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNames?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNamesForVariant?4(variant)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isGlobalEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isUnique?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.removeVirtualEnvs?4(venvNames)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, venvVariant)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.showVirtualenvManagerDialog?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.shutdown?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager?1(parent=None)
+eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.IsGlobalRole?7
 eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.PythonVariantRole?7
 eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.on_addButton_clicked?4()
 eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.on_deleteAllButton_clicked?4()
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Fri Jun 22 18:18:23 2018 +0200
+++ b/Documentation/Help/source.qhp	Sat Jun 23 15:14:48 2018 +0200
@@ -17434,6 +17434,7 @@
       <keyword name="VirtualenvManager" id="VirtualenvManager" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager" />
       <keyword name="VirtualenvManager (Constructor)" id="VirtualenvManager (Constructor)" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.__init__" />
       <keyword name="VirtualenvManager (Module)" id="VirtualenvManager (Module)" ref="eric6.VirtualEnv.VirtualenvManager.html" />
+      <keyword name="VirtualenvManager.__isEnvironmentDeleteable" id="VirtualenvManager.__isEnvironmentDeleteable" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.__isEnvironmentDeleteable" />
       <keyword name="VirtualenvManager.__loadSettings" id="VirtualenvManager.__loadSettings" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.__loadSettings" />
       <keyword name="VirtualenvManager.__saveSettings" id="VirtualenvManager.__saveSettings" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.__saveSettings" />
       <keyword name="VirtualenvManager.addVirtualEnv" id="VirtualenvManager.addVirtualEnv" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.addVirtualEnv" />
@@ -17444,6 +17445,7 @@
       <keyword name="VirtualenvManager.getVirtualenvInterpreter" id="VirtualenvManager.getVirtualenvInterpreter" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvInterpreter" />
       <keyword name="VirtualenvManager.getVirtualenvNames" id="VirtualenvManager.getVirtualenvNames" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNames" />
       <keyword name="VirtualenvManager.getVirtualenvNamesForVariant" id="VirtualenvManager.getVirtualenvNamesForVariant" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNamesForVariant" />
+      <keyword name="VirtualenvManager.isGlobalEnvironment" id="VirtualenvManager.isGlobalEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isGlobalEnvironment" />
       <keyword name="VirtualenvManager.isUnique" id="VirtualenvManager.isUnique" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isUnique" />
       <keyword name="VirtualenvManager.removeVirtualEnvs" id="VirtualenvManager.removeVirtualEnvs" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.removeVirtualEnvs" />
       <keyword name="VirtualenvManager.renameVirtualEnv" id="VirtualenvManager.renameVirtualEnv" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.renameVirtualEnv" />
--- a/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Fri Jun 22 18:18:23 2018 +0200
+++ b/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Sat Jun 23 15:14:48 2018 +0200
@@ -85,7 +85,7 @@
 </table>
 <a NAME="VirtualenvAddEditDialog.__init__" ID="VirtualenvAddEditDialog.__init__"></a>
 <h4>VirtualenvAddEditDialog (Constructor)</h4>
-<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, parent=None</i>)
+<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, parent=None</i>)
 <p>
         Constructor
 </p><dl>
@@ -104,6 +104,9 @@
 </dd><dt><i>venvVariant</i> (int)</dt>
 <dd>
 Python variant of the virtual environment
+</dd><dt><i>isGlobal</i> (bool)</dt>
+<dd>
+flag indicating a global environment
 </dd><dt><i>parent</i> (QWidget)</dt>
 <dd>
 reference to the parent widget
@@ -122,12 +125,13 @@
 <dt>Returns:</dt>
 <dd>
 tuple containing the logical name, the directory, the
-            interpreter of the virtual environment and the Python variant
+            interpreter of the virtual environment, the Python variant
+            and a flag indicating a global environment
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, str, str, int)
+tuple of (str, str, str, int, bool)
 </dd>
 </dl><a NAME="VirtualenvAddEditDialog.on_globalCheckBox_toggled" ID="VirtualenvAddEditDialog.on_globalCheckBox_toggled"></a>
 <h4>VirtualenvAddEditDialog.on_globalCheckBox_toggled</h4>
--- a/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Fri Jun 22 18:18:23 2018 +0200
+++ b/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Sat Jun 23 15:14:48 2018 +0200
@@ -60,6 +60,9 @@
 <td><a href="#VirtualenvManager.__init__">VirtualenvManager</a></td>
 <td>Constructor</td>
 </tr><tr>
+<td><a href="#VirtualenvManager.__isEnvironmentDeleteable">__isEnvironmentDeleteable</a></td>
+<td>Private method to check, if a virtual environment can be deleted from disk.</td>
+</tr><tr>
 <td><a href="#VirtualenvManager.__loadSettings">__loadSettings</a></td>
 <td>Private slot to load the virtual environments.</td>
 </tr><tr>
@@ -90,6 +93,9 @@
 <td><a href="#VirtualenvManager.getVirtualenvNamesForVariant">getVirtualenvNamesForVariant</a></td>
 <td>Public method to get a list of virtual environments for a given Python variant.</td>
 </tr><tr>
+<td><a href="#VirtualenvManager.isGlobalEnvironment">isGlobalEnvironment</a></td>
+<td>Public method to test, if a given environment is a global one.</td>
+</tr><tr>
 <td><a href="#VirtualenvManager.isUnique">isUnique</a></td>
 <td>Public method to check, if the give logical name is unique.</td>
 </tr><tr>
@@ -123,6 +129,27 @@
 <dd>
 reference to the parent object
 </dd>
+</dl><a NAME="VirtualenvManager.__isEnvironmentDeleteable" ID="VirtualenvManager.__isEnvironmentDeleteable"></a>
+<h4>VirtualenvManager.__isEnvironmentDeleteable</h4>
+<b>__isEnvironmentDeleteable</b>(<i>venvName</i>)
+<p>
+        Private method to check, if a virtual environment can be deleted from
+        disk.
+</p><dl>
+<dt><i>venvName</i> (str)</dt>
+<dd>
+name of the virtual environment
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating it can be deleted
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
 </dl><a NAME="VirtualenvManager.__loadSettings" ID="VirtualenvManager.__loadSettings"></a>
 <h4>VirtualenvManager.__loadSettings</h4>
 <b>__loadSettings</b>(<i></i>)
@@ -135,7 +162,7 @@
         Private slot to save the virtual environments.
 </p><a NAME="VirtualenvManager.addVirtualEnv" ID="VirtualenvManager.addVirtualEnv"></a>
 <h4>VirtualenvManager.addVirtualEnv</h4>
-<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", venvVariant=3</i>)
+<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False</i>)
 <p>
         Public method to add a virtual environment.
 </p><dl>
@@ -151,6 +178,9 @@
 </dd><dt><i>venvVariant</i> (int)</dt>
 <dd>
 Python variant of the virtual environment
+</dd><dt><i>isGlobal</i> (bool)</dt>
+<dd>
+flag indicating a global environment
 </dd>
 </dl><a NAME="VirtualenvManager.createVirtualEnv" ID="VirtualenvManager.createVirtualEnv"></a>
 <h4>VirtualenvManager.createVirtualEnv</h4>
@@ -260,6 +290,26 @@
 <dd>
 list of str
 </dd>
+</dl><a NAME="VirtualenvManager.isGlobalEnvironment" ID="VirtualenvManager.isGlobalEnvironment"></a>
+<h4>VirtualenvManager.isGlobalEnvironment</h4>
+<b>isGlobalEnvironment</b>(<i>venvName</i>)
+<p>
+        Public method to test, if a given environment is a global one.
+</p><dl>
+<dt><i>venvName</i> (str)</dt>
+<dd>
+logical name of the virtual environment
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a global environment
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
 </dl><a NAME="VirtualenvManager.isUnique" ID="VirtualenvManager.isUnique"></a>
 <h4>VirtualenvManager.isUnique</h4>
 <b>isUnique</b>(<i>venvName</i>)
@@ -292,7 +342,7 @@
 </dd>
 </dl><a NAME="VirtualenvManager.renameVirtualEnv" ID="VirtualenvManager.renameVirtualEnv"></a>
 <h4>VirtualenvManager.renameVirtualEnv</h4>
-<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant</i>)
+<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal</i>)
 <p>
         Public method to substitute a virtual environment entry with a new
         name.
@@ -312,10 +362,13 @@
 </dd><dt><i>venvVariant</i> (int)</dt>
 <dd>
 Python variant of the virtual environment
+</dd><dt><i>isGlobal</i> (bool)</dt>
+<dd>
+flag indicating a global environment
 </dd>
 </dl><a NAME="VirtualenvManager.setVirtualEnv" ID="VirtualenvManager.setVirtualEnv"></a>
 <h4>VirtualenvManager.setVirtualEnv</h4>
-<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, venvVariant</i>)
+<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal</i>)
 <p>
         Public method to change a virtual environment.
 </p><dl>
@@ -331,6 +384,9 @@
 </dd><dt><i>venvVariant</i> (int)</dt>
 <dd>
 Python variant of the virtual environment
+</dd><dt><i>isGlobal</i> (bool)</dt>
+<dd>
+flag indicating a global environment
 </dd>
 </dl><a NAME="VirtualenvManager.showVirtualenvManagerDialog" ID="VirtualenvManager.showVirtualenvManagerDialog"></a>
 <h4>VirtualenvManager.showVirtualenvManagerDialog</h4>
--- a/Documentation/Source/eric6.VirtualEnv.VirtualenvManagerDialog.html	Fri Jun 22 18:18:23 2018 +0200
+++ b/Documentation/Source/eric6.VirtualEnv.VirtualenvManagerDialog.html	Sat Jun 23 15:14:48 2018 +0200
@@ -50,7 +50,7 @@
 QDialog, Ui_VirtualenvManagerDialog
 <h3>Class Attributes</h3>
 <table>
-<tr><td>PythonVariantRole</td></tr>
+<tr><td>IsGlobalRole</td></tr><tr><td>PythonVariantRole</td></tr>
 </table>
 <h3>Class Methods</h3>
 <table>
--- a/VirtualEnv/VirtualenvAddEditDialog.py	Fri Jun 22 18:18:23 2018 +0200
+++ b/VirtualEnv/VirtualenvAddEditDialog.py	Sat Jun 23 15:14:48 2018 +0200
@@ -27,7 +27,8 @@
     Class implementing a dialog to enter the data of a virtual environment.
     """
     def __init__(self, manager, venvName="", venvDirectory="",
-                 venvInterpreter="", venvVariant=3, parent=None):
+                 venvInterpreter="", venvVariant=3, isGlobal=False,
+                 parent=None):
         """
         Constructor
         
@@ -41,6 +42,8 @@
         @type str
         @param venvVariant Python variant of the virtual environment
         @type int
+        @param isGlobal flag indicating a global environment
+        @type bool
         @param parent reference to the parent widget
         @type QWidget
         """
@@ -66,8 +69,7 @@
         self.targetDirectoryPicker.setText(venvDirectory)
         self.pythonExecPicker.setText(venvInterpreter)
         self.variantComboBox.setCurrentIndex(3 - venvVariant)
-        self.globalCheckBox.setChecked(self.__editMode and
-                                       not bool(venvDirectory))
+        self.globalCheckBox.setChecked(isGlobal)
         
         self.__updateOk()
     
@@ -146,8 +148,6 @@
         @param checked state of the check box
         @type bool
         """
-        self.targetDirectoryPicker.setEnabled(not checked)
-        
         self.__updateOk()
     
     def getData(self):
@@ -155,20 +155,14 @@
         Public method to retrieve the entered data.
         
         @return tuple containing the logical name, the directory, the
-            interpreter of the virtual environment and the Python variant
-        @rtype tuple of (str, str, str, int)
+            interpreter of the virtual environment, the Python variant
+            and a flag indicating a global environment
+        @rtype tuple of (str, str, str, int, bool)
         """
-        if self.globalCheckBox.isChecked():
-            return (
-                self.nameEdit.text(),
-                "",
-                self.pythonExecPicker.text(),
-                3 - self.variantComboBox.currentIndex(),
-            )
-        else:
-            return (
-                self.nameEdit.text(),
-                self.targetDirectoryPicker.text(),
-                self.pythonExecPicker.text(),
-                3 - self.variantComboBox.currentIndex(),
-            )
+        return (
+            self.nameEdit.text(),
+            self.targetDirectoryPicker.text(),
+            self.pythonExecPicker.text(),
+            3 - self.variantComboBox.currentIndex(),
+            self.globalCheckBox.isChecked(),
+        )
--- a/VirtualEnv/VirtualenvManager.py	Fri Jun 22 18:18:23 2018 +0200
+++ b/VirtualEnv/VirtualenvManager.py	Sat Jun 23 15:14:48 2018 +0200
@@ -56,11 +56,15 @@
         #                   (empty for a global environment)
         #   interpreter:    the path of the Python interpreter
         #   variant:        Python variant (2 or 3)
+        #   is_global:      a flag indicating a global environment
         #
         for venvName in environments:
             interpreter = environments[venvName]["interpreter"]
             if os.access(interpreter, os.X_OK):
-                self.__virtualEnvironments[venvName] = environments[venvName]
+                environment = environments[venvName]
+                if "is_global" not in environment:
+                    environment["is_global"] = environment["path"] == ""
+                self.__virtualEnvironments[venvName] = environment
         
         # check, if the interpreter used to run eric is in the environments
         defaultPy = sys.executable.replace("w.exe", ".exe")
@@ -76,6 +80,7 @@
                 "path": "",
                 "interpreter": defaultPy,
                 "variant": sys.version_info[0],
+                "is_global": True,
             }
         
         self.__saveSettings()
@@ -112,7 +117,7 @@
             dia.exec_()
     
     def addVirtualEnv(self, venvName, venvDirectory, venvInterpreter="",
-                      venvVariant=3):
+                      venvVariant=3, isGlobal=False):
         """
         Public method to add a virtual environment.
         
@@ -124,6 +129,8 @@
         @type str
         @param venvVariant Python variant of the virtual environment
         @type int
+        @param isGlobal flag indicating a global environment
+        @type bool
         """
         if venvName in self.__virtualEnvironments:
             ok = E5MessageBox.yesNo(
@@ -142,12 +149,14 @@
             dlg = VirtualenvInterpreterSelectionDialog(venvName, venvDirectory)
             if dlg.exec_() == QDialog.Accepted:
                 venvInterpreter, venvVariant = dlg.getData()
+                isGlobal = True
         
         if venvInterpreter:
             self.__virtualEnvironments[venvName] = {
                 "path": venvDirectory,
                 "interpreter": venvInterpreter,
                 "variant": venvVariant,
+                "is_global": isGlobal,
             }
             
             self.__saveSettings()
@@ -156,7 +165,7 @@
                 self.__virtualenvManagerDialog.refresh()
     
     def setVirtualEnv(self, venvName, venvDirectory, venvInterpreter,
-                      venvVariant):
+                      venvVariant, isGlobal):
         """
         Public method to change a virtual environment.
         
@@ -168,6 +177,8 @@
         @type str
         @param venvVariant Python variant of the virtual environment
         @type int
+        @param isGlobal flag indicating a global environment
+        @type bool
         """
         if venvName not in self.__virtualEnvironments:
             E5MessageBox.yesNo(
@@ -183,6 +194,7 @@
             "path": venvDirectory,
             "interpreter": venvInterpreter,
             "variant": venvVariant,
+            "is_global": isGlobal,
         }
         
         self.__saveSettings()
@@ -191,7 +203,7 @@
             self.__virtualenvManagerDialog.refresh()
     
     def renameVirtualEnv(self, oldVenvName, venvName, venvDirectory,
-                         venvInterpreter, venvVariant):
+                         venvInterpreter, venvVariant, isGlobal):
         """
         Public method to substitute a virtual environment entry with a new
         name.
@@ -206,6 +218,8 @@
         @type str
         @param venvVariant Python variant of the virtual environment
         @type int
+        @param isGlobal flag indicating a global environment
+        @type bool
         """
         if oldVenvName not in self.__virtualEnvironments:
             E5MessageBox.yesNo(
@@ -219,7 +233,7 @@
         
         del self.__virtualEnvironments[oldVenvName]
         self.addVirtualEnv(venvName, venvDirectory, venvInterpreter,
-                           venvVariant)
+                           venvVariant, isGlobal)
     
     def deleteVirtualEnvs(self, venvNames):
         """
@@ -246,8 +260,7 @@
             )
             if dlg.exec_() == QDialog.Accepted:
                 for venvName in venvNames:
-                    if venvName in self.__virtualEnvironments and \
-                            bool(self.__virtualEnvironments[venvName]["path"]):
+                    if self.__isEnvironmentDeleteable(venvName):
                         shutil.rmtree(
                             self.__virtualEnvironments[venvName]["path"], True)
                         del self.__virtualEnvironments[venvName]
@@ -257,6 +270,26 @@
                 if self.__virtualenvManagerDialog:
                     self.__virtualenvManagerDialog.refresh()
     
+    def __isEnvironmentDeleteable(self, venvName):
+        """
+        Private method to check, if a virtual environment can be deleted from
+        disk.
+        
+        @param venvName name of the virtual environment
+        @type str
+        @return flag indicating it can be deleted
+        @rtype bool
+        """
+        ok = False
+        if venvName in self.__virtualEnvironments:
+            ok = True
+            ok &= bool(self.__virtualEnvironments[venvName]["path"])
+            ok &= not self.__virtualEnvironments[venvName]["is_global"]
+            ok &= os.access(self.__virtualEnvironments[venvName]["path"],
+                            os.W_OK)
+        
+        return ok
+    
     def removeVirtualEnvs(self, venvNames):
         """
         Public method to delete virtual environment from the list.
@@ -386,3 +419,14 @@
                 environments.append(venvName)
         
         return environments
+    
+    def isGlobalEnvironment(self, venvName):
+        """
+        Public method to test, if a given environment is a global one.
+        
+        @param venvName logical name of the virtual environment
+        @type str
+        @return flag indicating a global environment
+        @rtype bool
+        """
+        return self.__virtualEnvironments[venvName]["is_global"] 
--- a/VirtualEnv/VirtualenvManagerDialog.py	Fri Jun 22 18:18:23 2018 +0200
+++ b/VirtualEnv/VirtualenvManagerDialog.py	Sat Jun 23 15:14:48 2018 +0200
@@ -22,6 +22,7 @@
     environments.
     """
     PythonVariantRole = Qt.UserRole
+    IsGlobalRole = Qt.UserRole + 1
     
     def __init__(self, manager, parent=None):
         """
@@ -51,7 +52,9 @@
         
         deletableSelectedItemCount = 0
         for itm in self.venvList.selectedItems():
-            if itm.text(0) != "<default>" and bool(itm.text(1)):
+            if itm.text(0) != "<default>" and \
+               bool(itm.text(1)) and \
+               not itm.data(0, VirtualenvManagerDialog.IsGlobalRole):
                 deletableSelectedItemCount += 1
         
         deletableItemCount = 0
@@ -86,8 +89,8 @@
         from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
         dlg = VirtualenvAddEditDialog(self.__manager)
         if dlg.exec_() == QDialog.Accepted:
-            venvName, venvDirectory, venvInterpreter, venvVariant = \
-                dlg.getData()
+            venvName, venvDirectory, venvInterpreter, venvVariant, \
+            isGlobal = dlg.getData()
             
             self.__manager.addVirtualEnv(venvName, venvDirectory,
                                          venvInterpreter, venvVariant)
@@ -111,18 +114,20 @@
         dlg = VirtualenvAddEditDialog(
             self.__manager, selectedItem.text(0),
             selectedItem.text(1), selectedItem.text(2),
-            selectedItem.data(0, VirtualenvManagerDialog.PythonVariantRole)
+            selectedItem.data(0, VirtualenvManagerDialog.PythonVariantRole),
+            selectedItem.data(0, VirtualenvManagerDialog.IsGlobalRole)
         )
         if dlg.exec_() == QDialog.Accepted:
-            venvName, venvDirectory, venvInterpreter, venvVariant = \
-                dlg.getData()
+            venvName, venvDirectory, venvInterpreter, venvVariant, \
+            isGlobal = dlg.getData()
             if venvName != oldVenvName:
                 self.__manager.renameVirtualEnv(
                     oldVenvName, venvName, venvDirectory, venvInterpreter,
-                    venvVariant)
+                    venvVariant, isGlobal)
             else:
                 self.__manager.setVirtualEnv(
-                    venvName, venvDirectory, venvInterpreter, venvVariant)
+                    venvName, venvDirectory, venvInterpreter, venvVariant,
+                    isGlobal)
     
     @pyqtSlot()
     def on_removeButton_clicked(self):
@@ -218,6 +223,8 @@
             ])
             itm.setData(0, VirtualenvManagerDialog.PythonVariantRole,
                         environments[venvName]["variant"])
+            itm.setData(0, VirtualenvManagerDialog.IsGlobalRole,
+                        environments[venvName]["is_global"])
         
         self.__resizeSections()
     

eric ide

mercurial