menu now displays with proper hierarchy

This commit is contained in:
Brennen Raimer
2019-04-29 14:25:58 -04:00
parent 1ccdb845cc
commit 0e8db03be5

View File

@@ -7,6 +7,9 @@ import zipfile
from pathlib import Path
from queue import Queue
import json
from collections import deque
from itertools import product
from functools import partial
import psutil
from PyQt5 import QtCore, QtGui, QtNetwork, QtWebEngineWidgets, QtWidgets
@@ -159,21 +162,27 @@ class InstallerWizard(QtWidgets.QWizard):
"""Populates the selection menu with items loaded from supported_tools.json
"""
for tool in sorted(self.__tools__, key = lambda x: x["category"] + f".{x['name']}"):
placement = [level.capitalize().strip() for level in tool["category"].split(".") if level] + [tool["name"]]
placement = deque([level.capitalize().strip() for level in tool["category"].split(".") if level] + [tool["name"]])
root = self.selection_menu.invisibleRootItem()
children = [root.child(i) for i in range(root.childCount())]
while placement:
current_level = placement.pop()
self._add_menu_item(placement, root, tool)
if self.selection_menu.findItem(current_level, QtCore.Qt.MatchFixedString|QtCore.Qt.MatchCaseSensitive) in children:
self.selection_menu.resizeColumnToContents(0)
self.selection_menu.resizeColumnToContents(1)
def _add_menu_item(self, placement, root, tool):
current_level = placement.popleft()
children = [root.child(i) for i in range(root.childCount())]
if any([item is child for item, child in product(self.selection_menu.findItems(current_level,
QtCore.Qt.MatchFixedString|QtCore.Qt.MatchCaseSensitive|QtCore.Qt.MatchRecursive), children)]):
root = list(filter(lambda child: child.text(0) == current_level, children)).pop()
children = [child for child in MenuIterator(root) if child in [root.child(i) for i in range(root.childCount())]]
self._add_menu_item(placement, root, tool)
else:
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)
if current_level == tool["name"]:
if not placement: #all items popped from placement
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemNeverHasChildren)
new_item.setData(1, QtCore.Qt.DecorationRole, QtGui.QIcon(str(Path(__file__).parent.parent/"resources/icons/internet-web-browser-4.png")))
new_item.setData(1, QtCore.Qt.ToolTipRole, tool["homepage"])
@@ -189,11 +198,9 @@ class InstallerWizard(QtWidgets.QWizard):
pass
else:
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate)
root.addChild(new_item)
new_item.setExpanded(False)
self.selection_menu.resizeColumnToContents(0)
self.selection_menu.resizeColumnToContents(1)
new_item.addChild(self._add_menu_item(placement, new_item, tool))
return new_item
@QtCore.pyqtSlot("QTreeWidgetItem*", "int")
def _open_homepage(self, item, column):
@@ -224,7 +231,7 @@ class InstallerWizard(QtWidgets.QWizard):
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(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))
icon_request.finished.connect(partial(self._set_icon, tree_item, icon_request))
def _set_icon(self, tree_item, request):
"""Validates a network request and sets its result as the icon of a QTreeWidgetItem.