|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog to enter the data of a virtual environment. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 import os |
|
13 import sys |
|
14 |
|
15 from PyQt5.QtCore import pyqtSlot |
|
16 from PyQt5.QtWidgets import QDialog, QDialogButtonBox |
|
17 |
|
18 from E5Gui.E5PathPicker import E5PathPickerModes |
|
19 |
|
20 from .Ui_VirtualenvAddEditDialog import Ui_VirtualenvAddEditDialog |
|
21 |
|
22 import Utilities |
|
23 |
|
24 |
|
25 class VirtualenvAddEditDialog(QDialog, Ui_VirtualenvAddEditDialog): |
|
26 """ |
|
27 Class implementing a dialog to enter the data of a virtual environment. |
|
28 """ |
|
29 def __init__(self, manager, venvName="", venvDirectory="", |
|
30 venvInterpreter="", parent=None): |
|
31 """ |
|
32 Constructor |
|
33 |
|
34 @param manager reference to the virtual environment manager |
|
35 @type VirtualenvManager |
|
36 @param venvName logical name of a virtual environment for editing |
|
37 @type str |
|
38 @param venvDirectory directory of the virtual environment |
|
39 @type str |
|
40 @param venvInterpreter Python interpreter of the virtual environment |
|
41 @type str |
|
42 @param parent reference to the parent widget |
|
43 @type QWidget |
|
44 """ |
|
45 super(VirtualenvAddEditDialog, self).__init__(parent) |
|
46 self.setupUi(self) |
|
47 |
|
48 self.__venvName = venvName |
|
49 self.__manager = manager |
|
50 self.__editMode = bool(venvName) |
|
51 |
|
52 self.targetDirectoryPicker.setMode(E5PathPickerModes.DirectoryMode) |
|
53 self.targetDirectoryPicker.setWindowTitle( |
|
54 self.tr("Virtualenv Target Directory")) |
|
55 self.targetDirectoryPicker.setDefaultDirectory(Utilities.getHomeDir()) |
|
56 |
|
57 self.pythonExecPicker.setMode(E5PathPickerModes.OpenFileMode) |
|
58 self.pythonExecPicker.setWindowTitle( |
|
59 self.tr("Python Interpreter")) |
|
60 self.pythonExecPicker.setDefaultDirectory( |
|
61 sys.executable.replace("w.exe", ".exe")) |
|
62 |
|
63 self.nameEdit.setText(venvName) |
|
64 self.targetDirectoryPicker.setText(venvDirectory) |
|
65 self.pythonExecPicker.setText(venvInterpreter) |
|
66 |
|
67 self.__updateOk() |
|
68 |
|
69 def __updateOk(self): |
|
70 """ |
|
71 Private slot to update the state of the OK button. |
|
72 """ |
|
73 if self.__editMode: |
|
74 enable = ( |
|
75 bool(self.nameEdit.text()) and |
|
76 (self.nameEdit.text() == self.__venvName or |
|
77 self.__manager.isUnique(self.nameEdit.text())) |
|
78 ) |
|
79 else: |
|
80 enable = ( |
|
81 bool(self.nameEdit.text()) and |
|
82 self.__manager.isUnique(self.nameEdit.text()) |
|
83 ) |
|
84 |
|
85 enable = ( |
|
86 enable and |
|
87 bool(self.targetDirectoryPicker.text()) and |
|
88 os.path.exists(self.targetDirectoryPicker.text()) and |
|
89 bool(self.pythonExecPicker.text()) and |
|
90 os.access(self.pythonExecPicker.text(), os.X_OK) |
|
91 ) |
|
92 |
|
93 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable) |
|
94 |
|
95 @pyqtSlot(str) |
|
96 def on_nameEdit_textChanged(self, txt): |
|
97 """ |
|
98 Private slot to handle changes of the logical name. |
|
99 |
|
100 @param txt current logical name |
|
101 @type str |
|
102 """ |
|
103 self.__updateOk() |
|
104 |
|
105 @pyqtSlot(str) |
|
106 def on_targetDirectoryPicker_textChanged(self, txt): |
|
107 """ |
|
108 Private slot to handle changes of the virtual environment directory. |
|
109 |
|
110 @param txt virtual environment directory |
|
111 @type str |
|
112 """ |
|
113 self.__updateOk() |
|
114 |
|
115 if txt: |
|
116 self.pythonExecPicker.setDefaultDirectory(txt) |
|
117 else: |
|
118 self.pythonExecPicker.setDefaultDirectory( |
|
119 sys.executable.replace("w.exe", ".exe")) |
|
120 |
|
121 @pyqtSlot(str) |
|
122 def on_pythonExecPicker_textChanged(self, txt): |
|
123 """ |
|
124 Private slot to handle changes of the virtual environment interpreter. |
|
125 |
|
126 @param txt virtual environment interpreter |
|
127 @type str |
|
128 """ |
|
129 self.__updateOk() |
|
130 |
|
131 def getData(self): |
|
132 """ |
|
133 Public method to retrieve the entered data. |
|
134 |
|
135 @return tuple containing the logical name, the directory and the |
|
136 interpreter of the virtual environment |
|
137 @rtype tuple of (str, str, str) |
|
138 """ |
|
139 return ( |
|
140 self.nameEdit.text(), |
|
141 self.targetDirectoryPicker.text(), |
|
142 self.pythonExecPicker.text(), |
|
143 ) |