|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2018 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 def __init__(self, manager, parent=None): |
|
25 """ |
|
26 Constructor |
|
27 |
|
28 @param manager reference to the virtual environment manager |
|
29 @type VirtualenvManager |
|
30 @param parent reference to the parent widget |
|
31 @type QWidget |
|
32 """ |
|
33 super(VirtualenvManagerDialog, self).__init__(parent) |
|
34 self.setupUi(self) |
|
35 |
|
36 self.__manager = manager |
|
37 |
|
38 self.__populateVenvList() |
|
39 self.__updateButtons() |
|
40 |
|
41 self.venvList.header().setSortIndicator(0, Qt.AscendingOrder) |
|
42 |
|
43 def __updateButtons(self): |
|
44 """ |
|
45 Private method to update the enabled state of the various buttons. |
|
46 """ |
|
47 selectedItemsCount = len(self.venvList.selectedItems()) |
|
48 topLevelItemCount = self.venvList.topLevelItemCount() |
|
49 |
|
50 canBeDeleted = ( |
|
51 selectedItemsCount == 1 and |
|
52 self.venvList.selectedItems()[0].text(0) != "<default>" |
|
53 ) |
|
54 canAllBeDeleted = ( |
|
55 topLevelItemCount == 1 and |
|
56 self.venvList.topLevelItem(0).text(0) != "<default>" |
|
57 ) |
|
58 |
|
59 self.editButton.setEnabled(selectedItemsCount == 1) |
|
60 self.removeButton.setEnabled(selectedItemsCount > 1 or canBeDeleted) |
|
61 self.removeAllButton.setEnabled( |
|
62 topLevelItemCount > 1 or canAllBeDeleted) |
|
63 self.deleteButton.setEnabled(selectedItemsCount > 1 or canBeDeleted) |
|
64 self.deleteAllButton.setEnabled( |
|
65 topLevelItemCount > 1 or canAllBeDeleted) |
|
66 |
|
67 @pyqtSlot() |
|
68 def on_addButton_clicked(self): |
|
69 """ |
|
70 Private slot to add a new entry. |
|
71 """ |
|
72 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog |
|
73 dlg = VirtualenvAddEditDialog(self.__manager) |
|
74 if dlg.exec_() == QDialog.Accepted: |
|
75 venvName, venvDirectory, venvInterpreter = dlg.getData() |
|
76 |
|
77 self.__manager.addVirtualEnv(venvName, venvDirectory, |
|
78 venvInterpreter) |
|
79 |
|
80 @pyqtSlot() |
|
81 def on_newButton_clicked(self): |
|
82 """ |
|
83 Private slot to create a new virtual environment. |
|
84 """ |
|
85 self.__manager.createVirtualEnv() |
|
86 |
|
87 @pyqtSlot() |
|
88 def on_editButton_clicked(self): |
|
89 """ |
|
90 Private slot to edit the selected entry. |
|
91 """ |
|
92 selectedItem = self.venvList.selectedItems()[0] |
|
93 oldVenvName = selectedItem.text(0) |
|
94 |
|
95 from .VirtualenvAddEditDialog import VirtualenvAddEditDialog |
|
96 dlg = VirtualenvAddEditDialog(self.__manager, selectedItem.text(0), |
|
97 selectedItem.text(1), |
|
98 selectedItem.text(2)) |
|
99 if dlg.exec_() == QDialog.Accepted: |
|
100 venvName, venvDirectory, venvInterpreter = dlg.getData() |
|
101 if venvName != oldVenvName: |
|
102 self.__manager.renameVirtualEnv( |
|
103 oldVenvName, venvName, venvDirectory, venvInterpreter) |
|
104 else: |
|
105 self.__manager.setVirtualEnv( |
|
106 venvName, venvDirectory, venvInterpreter) |
|
107 |
|
108 @pyqtSlot() |
|
109 def on_removeButton_clicked(self): |
|
110 """ |
|
111 Private slot to remove all selected entries from the list but keep |
|
112 their directories. |
|
113 """ |
|
114 selectedVenvs = [] |
|
115 for itm in self.venvList.selectedItems(): |
|
116 selectedVenvs.append(itm.text(0)) |
|
117 |
|
118 if selectedVenvs: |
|
119 self.__manager.removeVirtualEnvs(selectedVenvs) |
|
120 |
|
121 @pyqtSlot() |
|
122 def on_removeAllButton_clicked(self): |
|
123 """ |
|
124 Private slot to remove all entries from the list but keep their |
|
125 directories. |
|
126 """ |
|
127 venvNames = [] |
|
128 for index in range(self.venvList.topLevelItemCount()): |
|
129 itm = self.venvList.topLevelItem(index) |
|
130 venvNames.append(itm.text(0)) |
|
131 |
|
132 if venvNames: |
|
133 self.__manager.removeVirtualEnvs(venvNames) |
|
134 |
|
135 @pyqtSlot() |
|
136 def on_deleteButton_clicked(self): |
|
137 """ |
|
138 Private slot to delete all selected entries from the list and disk. |
|
139 """ |
|
140 selectedVenvs = [] |
|
141 for itm in self.venvList.selectedItems(): |
|
142 selectedVenvs.append(itm.text(0)) |
|
143 |
|
144 if selectedVenvs: |
|
145 self.__manager.deleteVirtualEnvs(selectedVenvs) |
|
146 |
|
147 @pyqtSlot() |
|
148 def on_deleteAllButton_clicked(self): |
|
149 """ |
|
150 Private slot to delete all entries from the list and disk. |
|
151 """ |
|
152 venvNames = [] |
|
153 for index in range(self.venvList.topLevelItemCount()): |
|
154 itm = self.venvList.topLevelItem(index) |
|
155 venvNames.append(itm.text(0)) |
|
156 |
|
157 if venvNames: |
|
158 self.__manager.deleteVirtualEnvs(venvNames) |
|
159 |
|
160 @pyqtSlot() |
|
161 def on_venvList_itemSelectionChanged(self): |
|
162 """ |
|
163 Private slot handling a change of the selected items. |
|
164 """ |
|
165 self.__updateButtons() |
|
166 |
|
167 @pyqtSlot() |
|
168 def refresh(self): |
|
169 """ |
|
170 Public slot to refresh the list of shown items. |
|
171 """ |
|
172 # 1. remember selected entries |
|
173 selectedVenvs = [] |
|
174 for itm in self.venvList.selectedItems(): |
|
175 selectedVenvs.append(itm.text(0)) |
|
176 |
|
177 # 2. clear the list |
|
178 self.venvList.clear() |
|
179 |
|
180 # 3. re-populate the list |
|
181 self.__populateVenvList() |
|
182 |
|
183 # 4. re-establish selection |
|
184 for venvName in selectedVenvs: |
|
185 itms = self.venvList.findItems(venvName, Qt.MatchExactly, 0) |
|
186 if itms: |
|
187 itms[0].setSelected(True) |
|
188 |
|
189 def __populateVenvList(self): |
|
190 """ |
|
191 Private method to populate the list of virtual environments. |
|
192 """ |
|
193 environments = self.__manager.getEnvironmentEntries() |
|
194 for venvName in environments: |
|
195 QTreeWidgetItem(self.venvList, [ |
|
196 venvName, |
|
197 environments[venvName][0], |
|
198 environments[venvName][1], |
|
199 ]) |
|
200 |
|
201 self.__resizeSections() |
|
202 |
|
203 def __resizeSections(self): |
|
204 """ |
|
205 Private method to resize the sections of the environment list to their |
|
206 contents. |
|
207 """ |
|
208 self.venvList.header().resizeSections( |
|
209 QHeaderView.ResizeToContents) |
|
210 self.venvList.header().setStretchLastSection(True) |