eric7/VirtualEnv/VirtualenvManagerDialog.py

branch
eric7
changeset 8610
c9cd21bcbe33
parent 8609
fd6b68a0a2df
child 8611
0b1a09e47e98
equal deleted inserted replaced
8609:fd6b68a0a2df 8610:c9cd21bcbe33
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2018 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to manage the list of defined virtual
8 environments.
9 """
10
11 from PyQt6.QtCore import pyqtSlot, Qt
12 from PyQt6.QtWidgets import QDialog, QTreeWidgetItem, QHeaderView
13
14 from EricWidgets.EricPathPicker import EricPathPickerModes
15
16 from .Ui_VirtualenvManagerDialog import Ui_VirtualenvManagerDialog
17
18 import Utilities
19 import UI.PixmapCache
20
21
22 class VirtualenvManagerDialog(QDialog, Ui_VirtualenvManagerDialog):
23 """
24 Class implementing a dialog to manage the list of defined virtual
25 environments.
26 """
27 IsGlobalRole = Qt.ItemDataRole.UserRole + 1
28 IsCondaRole = Qt.ItemDataRole.UserRole + 2
29 IsRemoteRole = Qt.ItemDataRole.UserRole + 3
30 ExecPathRole = Qt.ItemDataRole.UserRole + 4
31
32 def __init__(self, manager, parent=None):
33 """
34 Constructor
35
36 @param manager reference to the virtual environment manager
37 @type VirtualenvManager
38 @param parent reference to the parent widget
39 @type QWidget
40 """
41 super().__init__(parent)
42 self.setupUi(self)
43
44 self.__manager = manager
45
46 self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
47 self.newButton.setIcon(UI.PixmapCache.getIcon("new"))
48 self.editButton.setIcon(UI.PixmapCache.getIcon("edit"))
49 self.removeButton.setIcon(UI.PixmapCache.getIcon("minus"))
50 self.removeAllButton.setIcon(UI.PixmapCache.getIcon("minus_3"))
51 self.deleteButton.setIcon(UI.PixmapCache.getIcon("fileDelete"))
52 self.deleteAllButton.setIcon(UI.PixmapCache.getIcon("fileDeleteList"))
53
54 baseDir = self.__manager.getVirtualEnvironmentsBaseDir()
55 if not baseDir:
56 baseDir = Utilities.getHomeDir()
57
58 self.envBaseDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
59 self.envBaseDirectoryPicker.setWindowTitle(
60 self.tr("Virtualenv Base Directory"))
61 self.envBaseDirectoryPicker.setText(baseDir)
62
63 self.__populateVenvList()
64 self.__updateButtons()
65
66 self.venvList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
67
68 def __updateButtons(self):
69 """
70 Private method to update the enabled state of the various buttons.
71 """
72 selectedItemsCount = len(self.venvList.selectedItems())
73 topLevelItemCount = self.venvList.topLevelItemCount()
74
75 deletableSelectedItemCount = 0
76 for itm in self.venvList.selectedItems():
77 if (
78 itm.text(0) != "<default>" and
79 bool(itm.text(1)) and
80 not itm.data(0, VirtualenvManagerDialog.IsGlobalRole) and
81 not itm.data(0, VirtualenvManagerDialog.IsRemoteRole)
82 ):
83 deletableSelectedItemCount += 1
84
85 deletableItemCount = 0
86 for index in range(topLevelItemCount):
87 itm = self.venvList.topLevelItem(index)
88 if (
89 itm.text(0) != "<default>" and
90 bool(itm.text(1)) and
91 not itm.data(0, VirtualenvManagerDialog.IsRemoteRole)
92 ):
93 deletableItemCount += 1
94
95 canBeRemoved = (
96 selectedItemsCount == 1 and
97 self.venvList.selectedItems()[0].text(0) != "<default>"
98 )
99 canAllBeRemoved = (
100 topLevelItemCount == 1 and
101 self.venvList.topLevelItem(0).text(0) != "<default>"
102 )
103
104 self.editButton.setEnabled(selectedItemsCount == 1)
105
106 self.removeButton.setEnabled(selectedItemsCount > 1 or canBeRemoved)
107 self.removeAllButton.setEnabled(
108 topLevelItemCount > 1 or canAllBeRemoved)
109
110 self.deleteButton.setEnabled(deletableSelectedItemCount)
111 self.deleteAllButton.setEnabled(deletableItemCount)
112
113 @pyqtSlot()
114 def on_addButton_clicked(self):
115 """
116 Private slot to add a new entry.
117 """
118 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
119 dlg = VirtualenvAddEditDialog(
120 self.__manager,
121 baseDir=self.envBaseDirectoryPicker.text()
122 )
123 if dlg.exec() == QDialog.DialogCode.Accepted:
124 (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
125 isRemote, execPath) = dlg.getData()
126
127 self.__manager.addVirtualEnv(
128 venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
129 isRemote, execPath)
130
131 @pyqtSlot()
132 def on_newButton_clicked(self):
133 """
134 Private slot to create a new virtual environment.
135 """
136 self.__manager.createVirtualEnv(
137 baseDir=self.envBaseDirectoryPicker.text())
138
139 @pyqtSlot()
140 def on_editButton_clicked(self):
141 """
142 Private slot to edit the selected entry.
143 """
144 selectedItem = self.venvList.selectedItems()[0]
145 oldVenvName = selectedItem.text(0)
146
147 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
148 dlg = VirtualenvAddEditDialog(
149 self.__manager, selectedItem.text(0),
150 selectedItem.text(1), selectedItem.text(2),
151 selectedItem.data(0, VirtualenvManagerDialog.IsGlobalRole),
152 selectedItem.data(0, VirtualenvManagerDialog.IsCondaRole),
153 selectedItem.data(0, VirtualenvManagerDialog.IsRemoteRole),
154 selectedItem.data(0, VirtualenvManagerDialog.ExecPathRole),
155 baseDir=self.envBaseDirectoryPicker.text()
156 )
157 if dlg.exec() == QDialog.DialogCode.Accepted:
158 (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
159 isRemote, execPath) = dlg.getData()
160 if venvName != oldVenvName:
161 self.__manager.renameVirtualEnv(
162 oldVenvName, venvName, venvDirectory, venvInterpreter,
163 isGlobal, isConda, isRemote, execPath)
164 else:
165 self.__manager.setVirtualEnv(
166 venvName, venvDirectory, venvInterpreter, isGlobal,
167 isConda, isRemote, execPath)
168
169 @pyqtSlot()
170 def on_removeButton_clicked(self):
171 """
172 Private slot to remove all selected entries from the list but keep
173 their directories.
174 """
175 selectedVenvs = []
176 for itm in self.venvList.selectedItems():
177 selectedVenvs.append(itm.text(0))
178
179 if selectedVenvs:
180 self.__manager.removeVirtualEnvs(selectedVenvs)
181
182 @pyqtSlot()
183 def on_removeAllButton_clicked(self):
184 """
185 Private slot to remove all entries from the list but keep their
186 directories.
187 """
188 venvNames = []
189 for index in range(self.venvList.topLevelItemCount()):
190 itm = self.venvList.topLevelItem(index)
191 venvNames.append(itm.text(0))
192
193 if venvNames:
194 self.__manager.removeVirtualEnvs(venvNames)
195
196 @pyqtSlot()
197 def on_deleteButton_clicked(self):
198 """
199 Private slot to delete all selected entries from the list and disk.
200 """
201 selectedVenvs = []
202 for itm in self.venvList.selectedItems():
203 selectedVenvs.append(itm.text(0))
204
205 if selectedVenvs:
206 self.__manager.deleteVirtualEnvs(selectedVenvs)
207
208 @pyqtSlot()
209 def on_deleteAllButton_clicked(self):
210 """
211 Private slot to delete all entries from the list and disk.
212 """
213 venvNames = []
214 for index in range(self.venvList.topLevelItemCount()):
215 itm = self.venvList.topLevelItem(index)
216 venvNames.append(itm.text(0))
217
218 if venvNames:
219 self.__manager.deleteVirtualEnvs(venvNames)
220
221 @pyqtSlot()
222 def on_venvList_itemSelectionChanged(self):
223 """
224 Private slot handling a change of the selected items.
225 """
226 self.__updateButtons()
227
228 @pyqtSlot()
229 def refresh(self):
230 """
231 Public slot to refresh the list of shown items.
232 """
233 # 1. remember selected entries
234 selectedVenvs = []
235 for itm in self.venvList.selectedItems():
236 selectedVenvs.append(itm.text(0))
237
238 # 2. clear the list
239 self.venvList.clear()
240
241 # 3. re-populate the list
242 self.__populateVenvList()
243
244 # 4. re-establish selection
245 for venvName in selectedVenvs:
246 itms = self.venvList.findItems(
247 venvName, Qt.MatchFlag.MatchExactly, 0)
248 if itms:
249 itms[0].setSelected(True)
250
251 def __populateVenvList(self):
252 """
253 Private method to populate the list of virtual environments.
254 """
255 environments = self.__manager.getEnvironmentEntries()
256 for venvName in environments:
257 itm = QTreeWidgetItem(self.venvList, [
258 venvName,
259 environments[venvName]["path"],
260 environments[venvName]["interpreter"],
261 ])
262 itm.setData(0, VirtualenvManagerDialog.IsGlobalRole,
263 environments[venvName]["is_global"])
264 itm.setData(0, VirtualenvManagerDialog.IsCondaRole,
265 environments[venvName]["is_conda"])
266 itm.setData(0, VirtualenvManagerDialog.IsRemoteRole,
267 environments[venvName]["is_remote"])
268 itm.setData(0, VirtualenvManagerDialog.ExecPathRole,
269 environments[venvName]["exec_path"])
270
271 # show remote environments with underlined font
272 if environments[venvName]["is_remote"]:
273 font = itm.font(0)
274 font.setUnderline(True)
275 for column in range(itm.columnCount()):
276 itm.setFont(column, font)
277 else:
278 # local environments
279
280 # show global environments with bold font
281 if environments[venvName]["is_global"]:
282 font = itm.font(0)
283 font.setBold(True)
284 for column in range(itm.columnCount()):
285 itm.setFont(column, font)
286
287 # show Anaconda environments with italic font
288 if environments[venvName]["is_conda"]:
289 font = itm.font(0)
290 font.setItalic(True)
291 for column in range(itm.columnCount()):
292 itm.setFont(column, font)
293
294 self.__resizeSections()
295
296 def __resizeSections(self):
297 """
298 Private method to resize the sections of the environment list to their
299 contents.
300 """
301 self.venvList.header().resizeSections(
302 QHeaderView.ResizeMode.ResizeToContents)
303 self.venvList.header().setStretchLastSection(True)
304
305 def closeEvent(self, evt):
306 """
307 Protected method to handle the close event.
308
309 @param evt reference to the close event
310 @type QCloseEvent
311 """
312 baseDir = self.envBaseDirectoryPicker.text()
313 self.__manager.setVirtualEnvironmentsBaseDir(baseDir)
314
315 evt.accept()

eric ide

mercurial