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,42 +162,46 @@ 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:
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())]]
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"]:
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"])
try:
self._get_icon(new_item, tool["icon url"])
except KeyError:
self._get_icon(new_item)
try:
if tool["depends on"] == current_level: #tool depends on itself makes it mandatory
new_item.setFlags(new_item.flags()^QtCore.Qt.ItemIsUserCheckable)
new_item.setCheckState(0, QtCore.Qt.Checked)
except KeyError:
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)
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()
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 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"])
try:
self._get_icon(new_item, tool["icon url"])
except KeyError:
self._get_icon(new_item)
try:
if tool["depends on"] == current_level: #tool depends on itself makes it mandatory
new_item.setFlags(new_item.flags()^QtCore.Qt.ItemIsUserCheckable)
new_item.setCheckState(0, QtCore.Qt.Checked)
except KeyError:
pass
else:
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate)
new_item.setExpanded(False)
new_item.addChild(self._add_menu_item(placement, new_item, tool))
return new_item
@QtCore.pyqtSlot("QTreeWidgetItem*", "int")
def _open_homepage(self, item, column):
"""Receives the itemClicked signal from the selection_menu QTreeWidget and if the user has clicked a homepage, opens it in a new browser tab.
@@ -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.