--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.py Sat May 15 18:45:04 2021 +0200 @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2016 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to select QtHelp documentation sets to be +installed. +""" + +import os +import shutil + +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem + +from E5Gui import E5MessageBox + +from .Ui_QtHelpDocumentationSelectionDialog import ( + Ui_QtHelpDocumentationSelectionDialog +) + + +class QtHelpDocumentationSelectionDialog( + QDialog, Ui_QtHelpDocumentationSelectionDialog): + """ + Class implementing a dialog to select QtHelp documentation sets to be + installed. + """ + AddMode = "Add" + ManageMode = "Manage" + + def __init__(self, helpDocuments, mode, parent=None): + """ + Constructor + + @param helpDocuments dictionary containing the lists of help documents + to be shown + @type dict of lists of str + @param mode mode of the dialog + @type str + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + if mode == QtHelpDocumentationSelectionDialog.AddMode: + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).hide() + else: + self.buttonBox.button( + QDialogButtonBox.StandardButton.Ok).hide() + self.buttonBox.button( + QDialogButtonBox.StandardButton.Cancel).hide() + + for category in helpDocuments: + parentItem = QTreeWidgetItem(self.documentationList, [category]) + for document in helpDocuments[category]: + item = QTreeWidgetItem(parentItem, + [os.path.basename(document)]) + item.setData(0, Qt.ItemDataRole.UserRole, document) + parentItem.setData(0, Qt.ItemDataRole.UserRole, + os.path.dirname(document)) + self.documentationList.sortItems(0, Qt.SortOrder.AscendingOrder) + + self.on_documentationList_itemSelectionChanged() + + @pyqtSlot() + def on_documentationList_itemSelectionChanged(self): + """ + Private slot handling the selection of items. + """ + selectedCategoriesCount = 0 + selectedDocumentSetCount = 0 + for itm in self.documentationList.selectedItems(): + if itm.parent() is None: + selectedCategoriesCount += 1 + else: + selectedDocumentSetCount += 1 + + self.deleteButton.setEnabled(selectedDocumentSetCount > 0) + self.deleteCategoryButton.setEnabled(selectedCategoriesCount > 0) + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to delete the selected documentation sets. + """ + yes = E5MessageBox.yesNo( + self, + self.tr("Delete Documentation Sets"), + self.tr("""Shall the selected documentation sets really be""" + """ deleted?""")) + if yes: + for itm in self.documentationList.selectedItems(): + if itm.parent is None: + # it is a category item, skip it + continue + + category = itm.parent() + fileName = itm.data(0, Qt.ItemDataRole.UserRole) + try: + os.remove(fileName) + except OSError as err: + E5MessageBox.warning( + self, + self.tr("Delete Documentation Sets"), + self.tr("""<p>The documentation set <b>{0}</b> could""" + """ not be deleted.</p><p>Reason: {1}</p>""") + .format(fileName, str(err))) + continue + + category.removeChild(itm) + del itm + + if category.childCount() == 0: + self.__deleteCategory(category) + + @pyqtSlot() + def on_deleteCategoryButton_clicked(self): + """ + Private slot to delete the selected documentation set categories. + """ + yes = E5MessageBox.yesNo( + self, + self.tr("Delete Documentation Sets"), + self.tr("""Shall the selected documentation set categories""" + """ really be deleted?""")) + if yes: + categories = [] + for itm in self.documentationList.selectedItems(): + if itm.parent() is None: + categories.append(itm) + for category in categories: + self.__deleteCategory(category) + + @pyqtSlot() + def on_deleteAllButton_clicked(self): + """ + Private slot to delete all documentation sets. + """ + yes = E5MessageBox.yesNo( + self, + self.tr("Delete Documentation Sets"), + self.tr("""Shall all documentation sets really be deleted?""")) + if yes: + categories = [] + for index in range(self.documentationList.topLevelItemCount()): + categories.append( + self.documentationList.topLevelItem(index)) + for category in categories: + self.__deleteCategory(category) + + def __deleteCategory(self, category): + """ + Private method to delete a category. + + @param category reference to the category item + @type QTreeWidgetItem + """ + categoryDir = category.data(0, Qt.ItemDataRole.UserRole) + shutil.rmtree(categoryDir, True) + + self.documentationList.takeTopLevelItem( + self.documentationList.indexOfTopLevelItem(category)) + del category + + def getData(self): + """ + Public method to retrieve the selected help documents. + + @return list of QtHelp documentation sets to be installed + @rtype set of str + """ + documents = set() + for item in self.documentationList.selectedItems(): + if item.parent() is None: + # it is a category item; add all files of that category + for childIndex in range(item.childCount()): + child = item.child(childIndex) + fileName = child.data(0, Qt.ItemDataRole.UserRole) + if fileName: + documents.add(fileName) + else: + fileName = item.data(0, Qt.ItemDataRole.UserRole) + if fileName: + documents.add(fileName) + return documents