Simplify the update logic in the package model / card

CURA-8587
This commit is contained in:
Jaime van Kessel 2021-12-13 14:15:16 +01:00
parent 4b358496d9
commit 62f99a28b3
2 changed files with 36 additions and 62 deletions

View file

@ -5,7 +5,7 @@ import re
from enum import Enum from enum import Enum
from typing import Any, cast, Dict, List, Optional 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.CuraApplication import CuraApplication
from cura.CuraPackageManager import CuraPackageManager from cura.CuraPackageManager import CuraPackageManager
@ -73,16 +73,11 @@ class PackageModel(QObject):
self.enablePackageTriggered.connect(self._plugin_registry.enablePlugin) self.enablePackageTriggered.connect(self._plugin_registry.enablePlugin)
self.disablePackageTriggered.connect(self._plugin_registry.disablePlugin) self.disablePackageTriggered.connect(self._plugin_registry.disablePlugin)
self._is_updating = False
self._is_recently_updated = self._getRecentlyUpdated() self._is_recently_updated = self._getRecentlyUpdated()
self._is_installing = False
self._is_uninstalling = False
self._is_recently_installed = self._getRecentlyInstalled() self._is_recently_installed = self._getRecentlyInstalled()
self.updatePackageTriggered.connect(lambda pkg: self._setIsUpdating(True)) 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._plugin_registry.hasPluginsEnabledOrDisabledChanged.connect(self.stateManageButtonChanged)
self._package_manager.packageInstalled.connect(lambda pkg_id: self._packageInstalled(pkg_id, True)) 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.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._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: def __eq__(self, other: object) -> bool:
if isinstance(other, PackageModel): if isinstance(other, PackageModel):
return other == self return other == self
@ -308,42 +305,44 @@ class PackageModel(QObject):
disablePackageTriggered = pyqtSignal(str) 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: @pyqtSlot()
self._is_updating = value def install(self):
self.setBusy(True)
self.installPackageTriggered.emit(self.packageId, self.downloadURL)
def _setIsInstalling(self, value: bool) -> None: @pyqtSlot()
self._is_installing = value def uninstall(self):
self.setBusy(True)
self.uninstallPackageTriggered.emit(self.packageId)
def _setIsUninstalling(self, value: bool) -> None: @pyqtProperty(bool, notify= busyChanged)
self._is_uninstalling = value 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: def _packageInstalled(self, package_id: str, success: bool) -> None:
if self._package_id != package_id: if self._package_id != package_id:
return return
if self._is_updating: self.setBusy(not self._is_busy)
self.updatePackagesChanged.emit(success) self.stateManageButtonChanged.emit()
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
def _getRecentlyInstalled(self) -> bool: def _getRecentlyInstalled(self) -> bool:
return (self._package_id in self._package_manager.getPackagesToInstall() or self._package_id in self._package_manager.getPackagesToRemove()) \ 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 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: def _getRecentlyUpdated(self) -> bool:
return self._package_id in self._package_manager.package_infosWithUpdate and self._package_id in self._package_manager.getPackagesToInstall() return self._package_id in self._package_manager.package_infosWithUpdate and self._package_id in self._package_manager.getPackagesToInstall()

View file

@ -207,18 +207,15 @@ Item
id: installManageButton id: installManageButton
visible: (showManageButtons || confirmed) && ((packageData.isBundled && packageData.canDowngrade) || !packageData.isBundled) && !updateManageButton.confirmed visible: (showManageButtons || confirmed) && ((packageData.isBundled && packageData.canDowngrade) || !packageData.isBundled) && !updateManageButton.confirmed
enabled: !updateManageButton.busy enabled: !updateManageButton.busy
busy: packageData.busy
confirmed: packageData.isRecentlyInstalledChanged button_style: !packageData.isInstalled
button_style: confirmed ? packageData.isInstalled : !packageData.isInstalled
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
text: text:
{ {
if (button_style) if (!packageData.isInstalled)
{ {
if (busy) { return catalog.i18nc("@button", "Installing..."); } if (busy) { return catalog.i18nc("@button", "Installing..."); }
else if (confirmed) { return catalog.i18nc("@button", "Installed"); }
else { return catalog.i18nc("@button", "Install"); } else { return catalog.i18nc("@button", "Install"); }
} }
else else
@ -226,41 +223,19 @@ Item
if (packageData.canDowngrade) if (packageData.canDowngrade)
{ {
if (busy) { return catalog.i18nc("@button", "Downgrading..."); } if (busy) { return catalog.i18nc("@button", "Downgrading..."); }
else if (confirmed) { return catalog.i18nc("@button", "Downgraded"); }
else { return catalog.i18nc("@button", "Downgrade"); } else { return catalog.i18nc("@button", "Downgrade"); }
} }
else else
{ {
if (busy) { return catalog.i18nc("@button", "Uninstalling..."); } return catalog.i18nc("@button", "Uninstall");
else if (confirmed) { return catalog.i18nc("@button", "Uninstalled"); }
else { return catalog.i18nc("@button", "Uninstall"); }
} }
} }
} }
onClicked: onClicked:
{ {
busy = true if (packageData.isInstalled){ packageData.uninstall() }
if (packageData.isInstalled){ packageData.installPackageTriggered(packageData.packageId, packageData.downloadURL); } else { packageData.install()}
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;
}
} }
} }
@ -284,7 +259,7 @@ Item
onClicked: onClicked:
{ {
busy = true; busy = true
packageData.updatePackageTriggered(packageData.packageId); packageData.updatePackageTriggered(packageData.packageId);
} }
@ -292,7 +267,7 @@ Item
{ {
target: packageData target: packageData
function onUpdatePackagesChanged(succes) function updated(succes)
{ {
updateManageButton.busy = false; updateManageButton.busy = false;
updateManageButton.confirmed = succes; updateManageButton.confirmed = succes;