created an interable subclass of non-iterable qtreewidgetiterator

This commit is contained in:
Brennen Raimer
2019-04-23 00:45:22 -04:00
parent 87d3bcdc46
commit 9291d870b9
2 changed files with 31 additions and 4 deletions

View File

@@ -20,6 +20,7 @@ except ImportError:
raise #require win32api and win32file on windows raise #require win32api and win32file on windows
from validators.location_validator import Location_Validator from validators.location_validator import Location_Validator
from .menu_iterator import MenuIterator
class InstallerWizard(QtWidgets.QWizard): class InstallerWizard(QtWidgets.QWizard):
def __init__(self, parent=None): 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] placement = [level.capitalize().strip() for level in info["category"].split(".") if level] + [name]
root = self.selection_menu.invisibleRootItem() 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: while placement:
current_level = placement.pop() current_level = placement.pop()
if current_level in [child.text(0) for child in children]: if current_level in [child.text(0) for child in children]:
root = list(filter(lambda child: child.text(0) == current_level, children)).pop() root = list(filter(lambda child: child.text(0) == current_level, children)).pop()
else: else:
new_item = QtWidgets.QTreeWidgetItem(root) new_item = QtWidgets.QTreeWidgetItem(root, QtWidgets.QTreeWidgetItem.Type)
new_item.setText(0, current_level) new_item.setText(0, current_level)
new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled) new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled)
new_item.setCheckState(0, QtCore.Qt.Unchecked) new_item.setCheckState(0, QtCore.Qt.Unchecked)
@@ -187,7 +189,6 @@ class InstallerWizard(QtWidgets.QWizard):
new_item.setCheckState(0, QtCore.Qt.Checked) new_item.setCheckState(0, QtCore.Qt.Checked)
except KeyError: except KeyError:
pass pass
info["widget"] = new_item
else: else:
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate) new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate)
@@ -223,7 +224,7 @@ class InstallerWizard(QtWidgets.QWizard):
""" """
if not icon_url: 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_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 #when download is complete, validates request returned without error and sets icon
icon_request.finished.connect(lambda: self._set_icon(tree_item, icon_request)) icon_request.finished.connect(lambda: self._set_icon(tree_item, icon_request))
@@ -239,3 +240,12 @@ class InstallerWizard(QtWidgets.QWizard):
pixmap.loadFromData(request.readAll()) pixmap.loadFromData(request.readAll())
tree_item.setIcon(0, QtGui.QIcon(pixmap)) 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

View File

@@ -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