diff --git a/plugins/Marketplace/PackageModel.py b/plugins/Marketplace/PackageModel.py index 0e808dd369..ac2e2df2b2 100644 --- a/plugins/Marketplace/PackageModel.py +++ b/plugins/Marketplace/PackageModel.py @@ -5,7 +5,7 @@ import re from enum import Enum from typing import Any, cast, Dict, List, Optional -from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal +from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal, pyqtSlot from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager @@ -73,16 +73,11 @@ class PackageModel(QObject): self.enablePackageTriggered.connect(self._plugin_registry.enablePlugin) self.disablePackageTriggered.connect(self._plugin_registry.disablePlugin) - self._is_updating = False self._is_recently_updated = self._getRecentlyUpdated() - - self._is_installing = False - self._is_uninstalling = False self._is_recently_installed = self._getRecentlyInstalled() self.updatePackageTriggered.connect(lambda pkg: self._setIsUpdating(True)) - self.installPackageTriggered.connect(lambda pkg, url: self._setIsInstalling(True)) - self.uninstallPackageTriggered.connect(lambda pkg: self._setIsUninstalling(True)) + self._plugin_registry.hasPluginsEnabledOrDisabledChanged.connect(self.stateManageButtonChanged) self._package_manager.packageInstalled.connect(lambda pkg_id: self._packageInstalled(pkg_id, True)) @@ -90,6 +85,8 @@ class PackageModel(QObject): self._package_manager.packageInstallingFailed.connect(lambda pkg_id: self._packageInstalled(pkg_id, False)) self._package_manager.packagesWithUpdateChanged.connect(lambda: self.setCanUpdate(self._package_id in self._package_manager.packagesWithUpdate)) + self._is_busy = False + def __eq__(self, other: object) -> bool: if isinstance(other, PackageModel): return other == self @@ -308,42 +305,44 @@ class PackageModel(QObject): disablePackageTriggered = pyqtSignal(str) - installedPackagesChanged = pyqtSignal(bool) + installed = pyqtSignal(bool) - uninstalledPackagesChanged = pyqtSignal(bool) + updated = pyqtSignal(bool) - updatePackagesChanged = pyqtSignal(bool) + busyChanged = pyqtSignal() - def _setIsUpdating(self, value: bool) -> None: - self._is_updating = value + @pyqtSlot() + def install(self): + self.setBusy(True) + self.installPackageTriggered.emit(self.packageId, self.downloadURL) - def _setIsInstalling(self, value: bool) -> None: - self._is_installing = value + @pyqtSlot() + def uninstall(self): + self.setBusy(True) + self.uninstallPackageTriggered.emit(self.packageId) - def _setIsUninstalling(self, value: bool) -> None: - self._is_uninstalling = value + @pyqtProperty(bool, notify= busyChanged) + def busy(self): + """ + Property indicating that some kind of upgrade is active. + """ + return self._is_busy + + def setBusy(self, value: bool): + if self._is_busy != value: + self._is_busy = value + self.busyChanged.emit() def _packageInstalled(self, package_id: str, success: bool) -> None: if self._package_id != package_id: return - if self._is_updating: - self.updatePackagesChanged.emit(success) - self._is_updating = False - if self._is_installing: - self.installedPackagesChanged.emit(success) - self._is_installing = False - if self._is_uninstalling: - self.uninstalledPackagesChanged.emit(success) - self._is_uninstalling = False + self.setBusy(not self._is_busy) + self.stateManageButtonChanged.emit() def _getRecentlyInstalled(self) -> bool: return (self._package_id in self._package_manager.getPackagesToInstall() or self._package_id in self._package_manager.getPackagesToRemove()) \ and self._package_id not in self._package_manager.package_infosWithUpdate - @pyqtProperty(bool, constant = True) - def isRecentlyInstalledChanged(self) -> bool: - return self._is_recently_installed - def _getRecentlyUpdated(self) -> bool: return self._package_id in self._package_manager.package_infosWithUpdate and self._package_id in self._package_manager.getPackagesToInstall() diff --git a/plugins/Marketplace/resources/qml/PackageCardHeader.qml b/plugins/Marketplace/resources/qml/PackageCardHeader.qml index 55a4ae8731..96335ecc9d 100644 --- a/plugins/Marketplace/resources/qml/PackageCardHeader.qml +++ b/plugins/Marketplace/resources/qml/PackageCardHeader.qml @@ -207,18 +207,15 @@ Item id: installManageButton visible: (showManageButtons || confirmed) && ((packageData.isBundled && packageData.canDowngrade) || !packageData.isBundled) && !updateManageButton.confirmed enabled: !updateManageButton.busy - - confirmed: packageData.isRecentlyInstalledChanged - - button_style: confirmed ? packageData.isInstalled : !packageData.isInstalled + busy: packageData.busy + button_style: !packageData.isInstalled Layout.alignment: Qt.AlignTop text: { - if (button_style) + if (!packageData.isInstalled) { if (busy) { return catalog.i18nc("@button", "Installing..."); } - else if (confirmed) { return catalog.i18nc("@button", "Installed"); } else { return catalog.i18nc("@button", "Install"); } } else @@ -226,41 +223,19 @@ Item if (packageData.canDowngrade) { if (busy) { return catalog.i18nc("@button", "Downgrading..."); } - else if (confirmed) { return catalog.i18nc("@button", "Downgraded"); } else { return catalog.i18nc("@button", "Downgrade"); } } else { - if (busy) { return catalog.i18nc("@button", "Uninstalling..."); } - else if (confirmed) { return catalog.i18nc("@button", "Uninstalled"); } - else { return catalog.i18nc("@button", "Uninstall"); } + return catalog.i18nc("@button", "Uninstall"); } } } onClicked: { - busy = true - if (packageData.isInstalled){ packageData.installPackageTriggered(packageData.packageId, packageData.downloadURL); } - else { packageData.uninstallPackageTriggered(packageData.packageId); } - } - - Connections - { - target: packageData - - function onInstalledPackagesChanged(success) - { - installManageButton.busy = false; - installManageButton.confirmed = success; - } - function onUninstalledPackagesChanged(success) - { - installManageButton.busy = false; - installManageButton.confirmed = success; - installManageButton.button_style = !installManageButton.button_style; - } - + if (packageData.isInstalled){ packageData.uninstall() } + else { packageData.install()} } } @@ -284,7 +259,7 @@ Item onClicked: { - busy = true; + busy = true packageData.updatePackageTriggered(packageData.packageId); } @@ -292,7 +267,7 @@ Item { target: packageData - function onUpdatePackagesChanged(succes) + function updated(succes) { updateManageButton.busy = false; updateManageButton.confirmed = succes;