eric6/VirtualEnv/VirtualenvManagerDialog.py

changeset 6942
2602857055c5
parent 6716
1c9d3b369ea8
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2018 - 2019 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 __future__ import unicode_literals
12
13 from PyQt5.QtCore import pyqtSlot, Qt
14 from PyQt5.QtWidgets import QDialog, QTreeWidgetItem, QHeaderView
15
16 from .Ui_VirtualenvManagerDialog import Ui_VirtualenvManagerDialog
17
18
19 class VirtualenvManagerDialog(QDialog, Ui_VirtualenvManagerDialog):
20 """
21 Class implementing a dialog to manage the list of defined virtual
22 environments.
23 """
24 PythonVariantRole = Qt.UserRole
25 IsGlobalRole = Qt.UserRole + 1
26 IsCondaRole = Qt.UserRole + 2
27 IsRemoteRole = Qt.UserRole + 3
28 ExecPathRole = Qt.UserRole + 4
29
30 def __init__(self, manager, parent=None):
31 """
32 Constructor
33
34 @param manager reference to the virtual environment manager
35 @type VirtualenvManager
36 @param parent reference to the parent widget
37 @type QWidget
38 """
39 super(VirtualenvManagerDialog, self).__init__(parent)
40 self.setupUi(self)
41
42 self.__manager = manager
43
44 self.__populateVenvList()
45 self.__updateButtons()
46
47 self.venvList.header().setSortIndicator(0, Qt.AscendingOrder)
48
49 def __updateButtons(self):
50 """
51 Private method to update the enabled state of the various buttons.
52 """
53 selectedItemsCount = len(self.venvList.selectedItems())
54 topLevelItemCount = self.venvList.topLevelItemCount()
55
56 deletableSelectedItemCount = 0
57 for itm in self.venvList.selectedItems():
58 if itm.text(0) != "<default>" and \
59 bool(itm.text(1)) and \
60 not itm.data(0, VirtualenvManagerDialog.IsGlobalRole) and \
61 not itm.data(0, VirtualenvManagerDialog.IsRemoteRole):
62 deletableSelectedItemCount += 1
63
64 deletableItemCount = 0
65 for index in range(topLevelItemCount):
66 itm = self.venvList.topLevelItem(index)
67 if itm.text(0) != "<default>" and bool(itm.text(1)) and \
68 not itm.data(0, VirtualenvManagerDialog.IsRemoteRole):
69 deletableItemCount += 1
70
71 canBeRemoved = (
72 selectedItemsCount == 1 and
73 self.venvList.selectedItems()[0].text(0) != "<default>"
74 )
75 canAllBeRemoved = (
76 topLevelItemCount == 1 and
77 self.venvList.topLevelItem(0).text(0) != "<default>"
78 )
79
80 self.editButton.setEnabled(selectedItemsCount == 1)
81
82 self.removeButton.setEnabled(selectedItemsCount > 1 or canBeRemoved)
83 self.removeAllButton.setEnabled(
84 topLevelItemCount > 1 or canAllBeRemoved)
85
86 self.deleteButton.setEnabled(deletableSelectedItemCount)
87 self.deleteAllButton.setEnabled(deletableItemCount)
88
89 @pyqtSlot()
90 def on_addButton_clicked(self):
91 """
92 Private slot to add a new entry.
93 """
94 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
95 dlg = VirtualenvAddEditDialog(self.__manager)
96 if dlg.exec_() == QDialog.Accepted:
97 (venvName, venvDirectory, venvInterpreter, venvVariant,
98 isGlobal, isConda, isRemote, execPath) = dlg.getData()
99
100 self.__manager.addVirtualEnv(
101 venvName, venvDirectory, venvInterpreter, venvVariant,
102 isGlobal, isConda, isRemote, execPath)
103
104 @pyqtSlot()
105 def on_newButton_clicked(self):
106 """
107 Private slot to create a new virtual environment.
108 """
109 self.__manager.createVirtualEnv()
110
111 @pyqtSlot()
112 def on_editButton_clicked(self):
113 """
114 Private slot to edit the selected entry.
115 """
116 selectedItem = self.venvList.selectedItems()[0]
117 oldVenvName = selectedItem.text(0)
118
119 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
120 dlg = VirtualenvAddEditDialog(
121 self.__manager, selectedItem.text(0),
122 selectedItem.text(1), selectedItem.text(2),
123 selectedItem.data(0, VirtualenvManagerDialog.PythonVariantRole),
124 selectedItem.data(0, VirtualenvManagerDialog.IsGlobalRole),
125 selectedItem.data(0, VirtualenvManagerDialog.IsCondaRole),
126 selectedItem.data(0, VirtualenvManagerDialog.IsRemoteRole),
127 selectedItem.data(0, VirtualenvManagerDialog.ExecPathRole),
128 )
129 if dlg.exec_() == QDialog.Accepted:
130 (venvName, venvDirectory, venvInterpreter, venvVariant,
131 isGlobal, isConda, isRemote, execPath) = dlg.getData()
132 if venvName != oldVenvName:
133 self.__manager.renameVirtualEnv(
134 oldVenvName, venvName, venvDirectory, venvInterpreter,
135 venvVariant, isGlobal, isConda, isRemote, execPath)
136 else:
137 self.__manager.setVirtualEnv(
138 venvName, venvDirectory, venvInterpreter, venvVariant,
139 isGlobal, isConda, isRemote, execPath)
140
141 @pyqtSlot()
142 def on_removeButton_clicked(self):
143 """
144 Private slot to remove all selected entries from the list but keep
145 their directories.
146 """
147 selectedVenvs = []
148 for itm in self.venvList.selectedItems():
149 selectedVenvs.append(itm.text(0))
150
151 if selectedVenvs:
152 self.__manager.removeVirtualEnvs(selectedVenvs)
153
154 @pyqtSlot()
155 def on_removeAllButton_clicked(self):
156 """
157 Private slot to remove all entries from the list but keep their
158 directories.
159 """
160 venvNames = []
161 for index in range(self.venvList.topLevelItemCount()):
162 itm = self.venvList.topLevelItem(index)
163 venvNames.append(itm.text(0))
164
165 if venvNames:
166 self.__manager.removeVirtualEnvs(venvNames)
167
168 @pyqtSlot()
169 def on_deleteButton_clicked(self):
170 """
171 Private slot to delete all selected entries from the list and disk.
172 """
173 selectedVenvs = []
174 for itm in self.venvList.selectedItems():
175 selectedVenvs.append(itm.text(0))
176
177 if selectedVenvs:
178 self.__manager.deleteVirtualEnvs(selectedVenvs)
179
180 @pyqtSlot()
181 def on_deleteAllButton_clicked(self):
182 """
183 Private slot to delete all entries from the list and disk.
184 """
185 venvNames = []
186 for index in range(self.venvList.topLevelItemCount()):
187 itm = self.venvList.topLevelItem(index)
188 venvNames.append(itm.text(0))
189
190 if venvNames:
191 self.__manager.deleteVirtualEnvs(venvNames)
192
193 @pyqtSlot()
194 def on_venvList_itemSelectionChanged(self):
195 """
196 Private slot handling a change of the selected items.
197 """
198 self.__updateButtons()
199
200 @pyqtSlot()
201 def refresh(self):
202 """
203 Public slot to refresh the list of shown items.
204 """
205 # 1. remember selected entries
206 selectedVenvs = []
207 for itm in self.venvList.selectedItems():
208 selectedVenvs.append(itm.text(0))
209
210 # 2. clear the list
211 self.venvList.clear()
212
213 # 3. re-populate the list
214 self.__populateVenvList()
215
216 # 4. re-establish selection
217 for venvName in selectedVenvs:
218 itms = self.venvList.findItems(venvName, Qt.MatchExactly, 0)
219 if itms:
220 itms[0].setSelected(True)
221
222 def __populateVenvList(self):
223 """
224 Private method to populate the list of virtual environments.
225 """
226 environments = self.__manager.getEnvironmentEntries()
227 for venvName in environments:
228 itm = QTreeWidgetItem(self.venvList, [
229 venvName,
230 environments[venvName]["path"],
231 environments[venvName]["interpreter"],
232 ])
233 itm.setData(0, VirtualenvManagerDialog.PythonVariantRole,
234 environments[venvName]["variant"])
235 itm.setData(0, VirtualenvManagerDialog.IsGlobalRole,
236 environments[venvName]["is_global"])
237 itm.setData(0, VirtualenvManagerDialog.IsCondaRole,
238 environments[venvName]["is_conda"])
239 itm.setData(0, VirtualenvManagerDialog.IsRemoteRole,
240 environments[venvName]["is_remote"])
241 itm.setData(0, VirtualenvManagerDialog.ExecPathRole,
242 environments[venvName]["exec_path"])
243
244 # show remote environments with underlined font
245 if environments[venvName]["is_remote"]:
246 font = itm.font(0)
247 font.setUnderline(True)
248 for column in range(itm.columnCount()):
249 itm.setFont(column, font)
250 else:
251 # local environments
252
253 # show global environments with bold font
254 if environments[venvName]["is_global"]:
255 font = itm.font(0)
256 font.setBold(True)
257 for column in range(itm.columnCount()):
258 itm.setFont(column, font)
259
260 # show Anaconda environments with italic font
261 if environments[venvName]["is_conda"]:
262 font = itm.font(0)
263 font.setItalic(True)
264 for column in range(itm.columnCount()):
265 itm.setFont(column, font)
266
267 self.__resizeSections()
268
269 def __resizeSections(self):
270 """
271 Private method to resize the sections of the environment list to their
272 contents.
273 """
274 self.venvList.header().resizeSections(
275 QHeaderView.ResizeToContents)
276 self.venvList.header().setStretchLastSection(True)

eric ide

mercurial