Skip to content

Commit 76556b2

Browse files
committed
add support for dynamic package managers on the import popup
1 parent a3fb93f commit 76556b2

File tree

1 file changed

+67
-22
lines changed

1 file changed

+67
-22
lines changed

wingetui/customWidgets.py

Lines changed: 67 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,7 +1464,11 @@ def showEvent(self, event: QShowEvent) -> None:
14641464

14651465
class PackageImporter(MovableFramelessWindow):
14661466

1467-
pendingPackages: dict[str:QTreeWidgetItem] = []
1467+
pendingPackages: dict[str:QTreeWidgetItem] = {}
1468+
setLoadBarValue = Signal(str)
1469+
startAnim = Signal(QVariantAnimation)
1470+
changeBarOrientation = Signal()
1471+
14681472

14691473
def __init__(self, parent: QWidget | None = ...) -> None:
14701474
super().__init__(parent)
@@ -1490,6 +1494,43 @@ def __init__(self, parent: QWidget | None = ...) -> None:
14901494
self.setWindowTitle("\x20")
14911495
self.setMinimumSize(QSize(650, 400))
14921496
self.treewidget = TreeWidget(_("No packages found"))
1497+
1498+
self.loadingProgressBar = QProgressBar(self)
1499+
self.loadingProgressBar.setRange(0, 1000)
1500+
self.loadingProgressBar.setValue(0)
1501+
self.loadingProgressBar.setFixedHeight(4)
1502+
self.loadingProgressBar.setTextVisible(False)
1503+
self.setLoadBarValue.connect(self.loadingProgressBar.setValue)
1504+
self.startAnim.connect(lambda anim: anim.start())
1505+
self.changeBarOrientation.connect(lambda: self.loadingProgressBar.setInvertedAppearance(not(self.loadingProgressBar.invertedAppearance())))
1506+
1507+
self.leftSlow = QPropertyAnimation(self.loadingProgressBar, b"value")
1508+
self.leftSlow.setStartValue(0)
1509+
self.leftSlow.setEndValue(1000)
1510+
self.leftSlow.setDuration(700)
1511+
self.leftSlow.finished.connect(lambda: (self.rightSlow.start(), self.changeBarOrientation.emit()))
1512+
1513+
self.rightSlow = QPropertyAnimation(self.loadingProgressBar, b"value")
1514+
self.rightSlow.setStartValue(1000)
1515+
self.rightSlow.setEndValue(0)
1516+
self.rightSlow.setDuration(700)
1517+
self.rightSlow.finished.connect(lambda: (self.leftFast.start(), self.changeBarOrientation.emit()))
1518+
1519+
self.leftFast = QPropertyAnimation(self.loadingProgressBar, b"value")
1520+
self.leftFast.setStartValue(0)
1521+
self.leftFast.setEndValue(1000)
1522+
self.leftFast.setDuration(300)
1523+
self.leftFast.finished.connect(lambda: (self.rightFast.start(), self.changeBarOrientation.emit()))
1524+
1525+
self.rightFast = QPropertyAnimation(self.loadingProgressBar, b"value")
1526+
self.rightFast.setStartValue(1000)
1527+
self.rightFast.setEndValue(0)
1528+
self.rightFast.setDuration(300)
1529+
self.rightFast.finished.connect(lambda: (self.leftSlow.start(), self.changeBarOrientation.emit()))
1530+
1531+
self.leftSlow.start()
1532+
1533+
self.layout().addWidget(self.loadingProgressBar)
14931534
self.layout().addWidget(self.treewidget)
14941535
self.treewidget.setColumnCount(4)
14951536
self.treewidget.header().setStretchLastSection(False)
@@ -1521,16 +1562,20 @@ def __init__(self, parent: QWidget | None = ...) -> None:
15211562
self.idIcon = QIcon(getMedia("ID"))
15221563
self.removeIcon = QIcon(getMedia("menu_uninstall"))
15231564
self.versionIcon = QIcon(getMedia("version"))
1565+
15241566
self.showImportUI()
15251567

15261568
def showImportUI(self):
15271569
"""
15281570
Starts the process of installinf selected packages from a file.
15291571
"""
15301572
try:
1573+
self.loadingProgressBar.show()
1574+
self.pendingPackages = {}
15311575
DISCOVER_SECTION: SoftwareSection = globals.discover
15321576
self.treewidget.clear()
15331577
packageList: list[str] = []
1578+
self.show()
15341579
file = QFileDialog.getOpenFileName(None, _("Select package file"), filter="JSON (*.json)")[0]
15351580
if file != "":
15361581
f = open(file, "r")
@@ -1542,18 +1587,13 @@ def showImportUI(self):
15421587
packageList.append(pkg["PackageIdentifier"])
15431588
except KeyError as e:
15441589
print("🟠 Invalid winget section")
1545-
try:
1546-
packages = contents["scoop"]["apps"]
1547-
for pkg in packages:
1548-
packageList.append(pkg["Name"])
1549-
except KeyError as e:
1550-
print("🟠 Invalid scoop section")
1551-
try:
1552-
packages = contents["chocolatey"]["apps"]
1553-
for pkg in packages:
1554-
packageList.append(pkg["Name"])
1555-
except KeyError as e:
1556-
print("🟠 Invalid chocolatey section")
1590+
for manager in ["chocolatey", "scoop", "pip", "npm"]:
1591+
try:
1592+
packages = contents[manager]["apps"]
1593+
for pkg in packages:
1594+
packageList.append(pkg["Name"])
1595+
except KeyError as e:
1596+
print(f"🟠 Invalid {manager} section")
15571597
for packageId in packageList:
15581598
item = QTreeWidgetItem()
15591599
unknownIcon = QIcon(getMedia("question"))
@@ -1574,8 +1614,11 @@ def showImportUI(self):
15741614
item.setDisabled(True)
15751615
self.pendingPackages[packageId] = item
15761616
self.treewidget.label.setVisible(self.treewidget.topLevelItemCount() == 0)
1577-
Thread(target=self.loadDynamicPackages).Start()
1578-
self.show()
1617+
Thread(target=self.loadDynamicPackages).start()
1618+
self.loadingProgressBar.hide()
1619+
else:
1620+
self.close()
1621+
self.loadingProgressBar.hide()
15791622
except Exception as e:
15801623
report(e)
15811624

@@ -1587,6 +1630,7 @@ def addItemFromPackage(self, package: Package, item: QTreeWidgetItem) -> None:
15871630
item.setIcon(0, self.installIcon)
15881631
item.setIcon(1, self.idIcon)
15891632
item.setIcon(2, self.versionIcon)
1633+
item.setDisabled(False)
15901634
item.setIcon(3, package.getSourceIcon())
15911635
removeButton = QPushButton()
15921636
removeButton.setIcon(self.removeIcon)
@@ -1597,20 +1641,21 @@ def addItemFromPackage(self, package: Package, item: QTreeWidgetItem) -> None:
15971641
def loadDynamicPackages(self):
15981642
DISCOVER_SECTION: SoftwareSection = globals.discover
15991643
DISCOVER_SECTION.callInMain.emit(lambda: DISCOVER_SECTION.packageList.setEnabled(False))
1644+
DISCOVER_SECTION.callInMain.emit(lambda: self.loadingProgressBar.show())
16001645
for packageId in self.pendingPackages.keys():
1646+
print(packageId)
16011647
DISCOVER_SECTION.callInMain.emit(lambda: DISCOVER_SECTION.query.setText(packageId))
1602-
DISCOVER_SECTION.callInMain.emit(lambda: DISCOVER_SECTION.finishFiltering(self.query.text()))
1648+
DISCOVER_SECTION.callInMain.emit(lambda: DISCOVER_SECTION.finishFiltering(DISCOVER_SECTION.query.text()))
1649+
while not DISCOVER_SECTION.isLoadingDynamic: # Make time before packages actually start loading
1650+
time.sleep(0.001)
16031651
while DISCOVER_SECTION.isLoadingDynamic:
16041652
time.sleep(0.01)
16051653
if packageId in DISCOVER_SECTION.IdPackageReference:
16061654
package = DISCOVER_SECTION.IdPackageReference[packageId]
1607-
self.addItemFromPackage(package, self.pendingPackages[packageId])
1655+
DISCOVER_SECTION.callInMain.emit(lambda: self.addItemFromPackage(package, self.pendingPackages[packageId]))
1656+
DISCOVER_SECTION.callInMain.emit(lambda: self.treewidget.label.setVisible(self.treewidget.topLevelItemCount() == 0))
1657+
DISCOVER_SECTION.callInMain.emit(lambda: self.loadingProgressBar.hide())
16081658
DISCOVER_SECTION.callInMain.emit(lambda: DISCOVER_SECTION.packageList.setEnabled(True))
1609-
1610-
1611-
1612-
1613-
16141659

16151660
def installPackages(self) -> None:
16161661
DISCOVER_SECTION: SoftwareSection = globals.discover

0 commit comments

Comments
 (0)