menu now displays with proper hierarchy
This commit is contained in:
@@ -7,6 +7,9 @@ import zipfile
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
import json
|
import json
|
||||||
|
from collections import deque
|
||||||
|
from itertools import product
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
import psutil
|
import psutil
|
||||||
from PyQt5 import QtCore, QtGui, QtNetwork, QtWebEngineWidgets, QtWidgets
|
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
|
"""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']}"):
|
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()
|
root = self.selection_menu.invisibleRootItem()
|
||||||
children = [root.child(i) for i in range(root.childCount())]
|
self._add_menu_item(placement, root, tool)
|
||||||
while placement:
|
|
||||||
current_level = placement.pop()
|
|
||||||
|
|
||||||
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()
|
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:
|
else:
|
||||||
new_item = QtWidgets.QTreeWidgetItem(root, QtWidgets.QTreeWidgetItem.Type)
|
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)
|
||||||
if current_level == tool["name"]:
|
if not placement: #all items popped from placement
|
||||||
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemNeverHasChildren)
|
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.DecorationRole, QtGui.QIcon(str(Path(__file__).parent.parent/"resources/icons/internet-web-browser-4.png")))
|
||||||
new_item.setData(1, QtCore.Qt.ToolTipRole, tool["homepage"])
|
new_item.setData(1, QtCore.Qt.ToolTipRole, tool["homepage"])
|
||||||
@@ -189,11 +198,9 @@ class InstallerWizard(QtWidgets.QWizard):
|
|||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate)
|
new_item.setFlags(new_item.flags()|QtCore.Qt.ItemIsAutoTristate)
|
||||||
|
|
||||||
root.addChild(new_item)
|
|
||||||
new_item.setExpanded(False)
|
new_item.setExpanded(False)
|
||||||
self.selection_menu.resizeColumnToContents(0)
|
new_item.addChild(self._add_menu_item(placement, new_item, tool))
|
||||||
self.selection_menu.resizeColumnToContents(1)
|
return new_item
|
||||||
|
|
||||||
@QtCore.pyqtSlot("QTreeWidgetItem*", "int")
|
@QtCore.pyqtSlot("QTreeWidgetItem*", "int")
|
||||||
def _open_homepage(self, item, column):
|
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_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)))
|
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(partial(self._set_icon, tree_item, icon_request))
|
||||||
|
|
||||||
def _set_icon(self, tree_item, request):
|
def _set_icon(self, tree_item, request):
|
||||||
"""Validates a network request and sets its result as the icon of a QTreeWidgetItem.
|
"""Validates a network request and sets its result as the icon of a QTreeWidgetItem.
|
||||||
|
|||||||
Reference in New Issue
Block a user