diff --git a/portable_computing_toolkit_installer/ui/installer_wizard.py b/portable_computing_toolkit_installer/ui/installer_wizard.py index a1685e0..a3b02f9 100644 --- a/portable_computing_toolkit_installer/ui/installer_wizard.py +++ b/portable_computing_toolkit_installer/ui/installer_wizard.py @@ -20,6 +20,7 @@ except ImportError: raise #require win32api and win32file on windows from validators.location_validator import Location_Validator +from .menu_iterator import MenuIterator class InstallerWizard(QtWidgets.QWizard): def __init__(self, parent=None): @@ -162,14 +163,15 @@ class InstallerWizard(QtWidgets.QWizard): placement = [level.capitalize().strip() for level in info["category"].split(".") if level] + [name] root = self.selection_menu.invisibleRootItem() - children = [root.child(i) for i in range(root.childCount())] + #children = [root.child(i) for i in range(root.childCount())] + children = list(MenuIterator(root, QtWidgets.QTreeWidgetItemIterator.All)) while placement: current_level = placement.pop() if current_level in [child.text(0) for child in children]: root = list(filter(lambda child: child.text(0) == current_level, children)).pop() else: - new_item = QtWidgets.QTreeWidgetItem(root) + new_item = QtWidgets.QTreeWidgetItem(root, QtWidgets.QTreeWidgetItem.Type) new_item.setText(0, current_level) new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled) new_item.setCheckState(0, QtCore.Qt.Unchecked) @@ -187,7 +189,6 @@ class InstallerWizard(QtWidgets.QWizard): new_item.setCheckState(0, QtCore.Qt.Checked) except KeyError: pass - info["widget"] = new_item else: new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate) @@ -223,7 +224,7 @@ class InstallerWizard(QtWidgets.QWizard): """ if not icon_url: icon_url = QtCore.QUrl(f"http://www.google.com/s2/favicons?domain={QtCore.QUrl(tree_item.data(1, QtCore.Qt.ToolTipRole)).toString()}") - icon_request = self._network_manager.get(QtNetwork.QNetworkRequest(icon_url)) + icon_request = self._network_manager.get(QtNetwork.QNetworkRequest(QtCore.QUrl(icon_url))) #when download is complete, validates request returned without error and sets icon icon_request.finished.connect(lambda: self._set_icon(tree_item, icon_request)) @@ -239,3 +240,12 @@ class InstallerWizard(QtWidgets.QWizard): pixmap.loadFromData(request.readAll()) tree_item.setIcon(0, QtGui.QIcon(pixmap)) + def _get_selections(self): + """Returns a subset of the supported tools whose corresponding item was selected by the user. + """ + selected_iterator = MenuIterator(self.selection_menu, QtWidgets.QTreeWidgetItemIterator.Checked|QtWidgets.QTreeWidgetItemIterator.NoChildren) + try: + selected_tools = {item.text(0):self.__tools__[item.text(0)] for item in selected_iterator} + except KeyError as e: + self._display_error(f"Unknown tool selected.", e) + return selected_tools diff --git a/portable_computing_toolkit_installer/ui/menu_iterator.py b/portable_computing_toolkit_installer/ui/menu_iterator.py new file mode 100644 index 0000000..4f61450 --- /dev/null +++ b/portable_computing_toolkit_installer/ui/menu_iterator.py @@ -0,0 +1,17 @@ +from PyQt5 import QtWidgets + + +class MenuIterator(QtWidgets.QTreeWidgetItemIterator): + def __init__(self, *args): + super().__init__(*args) + + def __iter__(self): + return self + + def __next__(self): + value = self.value() + if not value: + raise StopIteration + else: + self += 1 + return value