--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VirtualEnv/VirtualenvManagerDialog.py Sun Jun 10 16:55:39 2018 +0200 @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to manage the list of defined virtual +environments. +""" + +from __future__ import unicode_literals + +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QTreeWidgetItem, QHeaderView + +from .Ui_VirtualenvManagerDialog import Ui_VirtualenvManagerDialog + + +class VirtualenvManagerDialog(QDialog, Ui_VirtualenvManagerDialog): + """ + Class implementing a dialog to manage the list of defined virtual + environments. + """ + def __init__(self, manager, parent=None): + """ + Constructor + + @param manager reference to the virtual environment manager + @type VirtualenvManager + @param parent reference to the parent widget + @type QWidget + """ + super(VirtualenvManagerDialog, self).__init__(parent) + self.setupUi(self) + + self.__manager = manager + + self.__populateVenvList() + self.__updateButtons() + + self.venvList.header().setSortIndicator(0, Qt.AscendingOrder) + + def __updateButtons(self): + """ + Private method to update the enabled state of the various buttons. + """ + selectedItemsCount = len(self.venvList.selectedItems()) + topLevelItemCount = self.venvList.topLevelItemCount() + + canBeDeleted = ( + selectedItemsCount == 1 and + self.venvList.selectedItems()[0].text(0) != "<default>" + ) + canAllBeDeleted = ( + topLevelItemCount == 1 and + self.venvList.topLevelItem(0).text(0) != "<default>" + ) + + self.editButton.setEnabled(selectedItemsCount == 1) + self.removeButton.setEnabled(selectedItemsCount > 1 or canBeDeleted) + self.removeAllButton.setEnabled( + topLevelItemCount > 1 or canAllBeDeleted) + self.deleteButton.setEnabled(selectedItemsCount > 1 or canBeDeleted) + self.deleteAllButton.setEnabled( + topLevelItemCount > 1 or canAllBeDeleted) + + @pyqtSlot() + def on_addButton_clicked(self): + """ + Private slot to add a new entry. + """ + from .VirtualenvAddEditDialog import VirtualenvAddEditDialog + dlg = VirtualenvAddEditDialog(self.__manager) + if dlg.exec_() == QDialog.Accepted: + venvName, venvDirectory, venvInterpreter = dlg.getData() + + self.__manager.addVirtualEnv(venvName, venvDirectory, + venvInterpreter) + + @pyqtSlot() + def on_newButton_clicked(self): + """ + Private slot to create a new virtual environment. + """ + self.__manager.createVirtualEnv() + + @pyqtSlot() + def on_editButton_clicked(self): + """ + Private slot to edit the selected entry. + """ + selectedItem = self.venvList.selectedItems()[0] + oldVenvName = selectedItem.text(0) + + from .VirtualenvAddEditDialog import VirtualenvAddEditDialog + dlg = VirtualenvAddEditDialog(self.__manager, selectedItem.text(0), + selectedItem.text(1), + selectedItem.text(2)) + if dlg.exec_() == QDialog.Accepted: + venvName, venvDirectory, venvInterpreter = dlg.getData() + if venvName != oldVenvName: + self.__manager.renameVirtualEnv( + oldVenvName, venvName, venvDirectory, venvInterpreter) + else: + self.__manager.setVirtualEnv( + venvName, venvDirectory, venvInterpreter) + + @pyqtSlot() + def on_removeButton_clicked(self): + """ + Private slot to remove all selected entries from the list but keep + their directories. + """ + selectedVenvs = [] + for itm in self.venvList.selectedItems(): + selectedVenvs.append(itm.text(0)) + + if selectedVenvs: + self.__manager.removeVirtualEnvs(selectedVenvs) + + @pyqtSlot() + def on_removeAllButton_clicked(self): + """ + Private slot to remove all entries from the list but keep their + directories. + """ + venvNames = [] + for index in range(self.venvList.topLevelItemCount()): + itm = self.venvList.topLevelItem(index) + venvNames.append(itm.text(0)) + + if venvNames: + self.__manager.removeVirtualEnvs(venvNames) + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to delete all selected entries from the list and disk. + """ + selectedVenvs = [] + for itm in self.venvList.selectedItems(): + selectedVenvs.append(itm.text(0)) + + if selectedVenvs: + self.__manager.deleteVirtualEnvs(selectedVenvs) + + @pyqtSlot() + def on_deleteAllButton_clicked(self): + """ + Private slot to delete all entries from the list and disk. + """ + venvNames = [] + for index in range(self.venvList.topLevelItemCount()): + itm = self.venvList.topLevelItem(index) + venvNames.append(itm.text(0)) + + if venvNames: + self.__manager.deleteVirtualEnvs(venvNames) + + @pyqtSlot() + def on_venvList_itemSelectionChanged(self): + """ + Private slot handling a change of the selected items. + """ + self.__updateButtons() + + @pyqtSlot() + def refresh(self): + """ + Public slot to refresh the list of shown items. + """ + # 1. remember selected entries + selectedVenvs = [] + for itm in self.venvList.selectedItems(): + selectedVenvs.append(itm.text(0)) + + # 2. clear the list + self.venvList.clear() + + # 3. re-populate the list + self.__populateVenvList() + + # 4. re-establish selection + for venvName in selectedVenvs: + itms = self.venvList.findItems(venvName, Qt.MatchExactly, 0) + if itms: + itms[0].setSelected(True) + + def __populateVenvList(self): + """ + Private method to populate the list of virtual environments. + """ + environments = self.__manager.getEnvironmentEntries() + for venvName in environments: + QTreeWidgetItem(self.venvList, [ + venvName, + environments[venvName][0], + environments[venvName][1], + ]) + + self.__resizeSections() + + def __resizeSections(self): + """ + Private method to resize the sections of the environment list to their + contents. + """ + self.venvList.header().resizeSections( + QHeaderView.ResizeToContents) + self.venvList.header().setStretchLastSection(True)