Fixed state of manage buttons

Contributes to: CURA-8587
This commit is contained in:
Jelle Spijker 2021-12-06 09:14:40 +01:00
parent a51b29cdf6
commit 863e92d0d2
No known key found for this signature in database
GPG key ID: 6662DC033BE6B99A
5 changed files with 227 additions and 138 deletions

View file

@ -48,9 +48,8 @@ class LocalPackageList(PackageList):
self.setIsLoading(True) self.setIsLoading(True)
# Obtain and sort the local packages # Obtain and sort the local packages
Logger.debug(f"Number of local packages: {len(self._manager.local_packages)} -> {[p['package_id'] for p in self._manager.local_packages]}")
self.setItems([{"package": p} for p in [self._makePackageModel(p) for p in self._manager.local_packages]]) self.setItems([{"package": p} for p in [self._makePackageModel(p) for p in self._manager.local_packages]])
self.sort(attrgetter("sectionTitle", "canUpdate", "displayName"), key = "package", reverse = True) self.sort(attrgetter("sectionTitle", "can_update", "displayName"), key = "package", reverse = True)
self.checkForUpdates(self._manager.local_packages) self.checkForUpdates(self._manager.local_packages)
self.setIsLoading(False) self.setIsLoading(False)
@ -90,8 +89,8 @@ class LocalPackageList(PackageList):
return return
for package_data in response_data["data"]: for package_data in response_data["data"]:
package = self._getPackageModel(package_data["package_id"]) package = self.getPackageModel(package_data["package_id"])
package.download_url = package_data.get("download_url", "") package.download_url = package_data.get("download_url", "")
package.canUpdate = True package.canUpdate = True
self.sort(attrgetter("sectionTitle", "canUpdate", "displayName"), key = "package", reverse = True) self.sort(attrgetter("sectionTitle", "can_update", "displayName"), key = "package", reverse = True)

View file

@ -112,19 +112,26 @@ class PackageList(ListModel):
:return: ``True`` if a Footer should be displayed in the ListView, e.q.: paginated lists, ``False`` Otherwise""" :return: ``True`` if a Footer should be displayed in the ListView, e.q.: paginated lists, ``False`` Otherwise"""
return self._has_footer return self._has_footer
def _connectManageButtonSignals(self, package: PackageModel) -> None: def getPackageModel(self, package_id: str) -> PackageModel:
package.installPackageTriggered.connect(self.installPackage)
package.uninstallPackageTriggered.connect(self.uninstallPackage)
package.updatePackageTriggered.connect(self.installPackage)
package.enablePackageTriggered.connect(self.enablePackage)
package.disablePackageTriggered.connect(self.disablePackage)
def _getPackageModel(self, package_id: str) -> PackageModel:
index = self.find("package", package_id) index = self.find("package", package_id)
return self.getItem(index)["package"] return self.getItem(index)["package"]
canInstallChanged = pyqtSignal(str, bool) canInstallChanged = pyqtSignal(str, bool)
def _install(self, package_id: str, update: bool = False) -> None:
package_path = self._to_install.pop(package_id)
Logger.debug(f"Installing {package_id}")
to_be_installed = self._manager.installPackage(package_path) is not None
package = self.getPackageModel(package_id)
if package.can_update and to_be_installed:
package.can_update = False
if update:
package.is_updating = False
else:
package.is_recently_installed = True
package.is_installing = False
self.subscribeUserToPackage(package_id, str(package.sdk_version))
def download(self, package_id: str, url: str, update: bool = False) -> None: def download(self, package_id: str, url: str, update: bool = False) -> None:
def downloadFinished(reply: "QNetworkReply") -> None: def downloadFinished(reply: "QNetworkReply") -> None:
@ -159,34 +166,13 @@ class PackageList(ListModel):
if reply: if reply:
reply_string = bytes(reply.readAll()).decode() reply_string = bytes(reply.readAll()).decode()
Logger.error(f"Failed to download package: {package_id} due to {reply_string}") Logger.error(f"Failed to download package: {package_id} due to {reply_string}")
package = self._getPackageModel(package_id) package = self.getPackageModel(package_id)
if update: if update:
package.setIsUpdating(False) package.is_updating = False
else: else:
package.setIsInstalling(False) package.is_installing = False
@pyqtSlot(str) def subscribeUserToPackage(self, package_id: str, sdk_version: str) -> None:
def installPackage(self, package_id: str) -> None:
package = self._getPackageModel(package_id)
url = package.download_url
Logger.debug(f"Trying to download and install {package_id} from {url}")
self.download(package_id, url)
def _install(self, package_id: str, update: bool = False) -> None:
package_path = self._to_install.pop(package_id)
Logger.debug(f"Installing {package_id}")
to_be_installed = self._manager.installPackage(package_path) is not None
package = self._getPackageModel(package_id)
if package.canUpdate and to_be_installed:
package.canUpdate = False
package.setManageInstallState(to_be_installed)
if update:
package.setIsUpdating(False)
else:
package.setIsInstalling(False)
self._subscribe(package_id, str(package.sdk_version))
def _subscribe(self, package_id: str, sdk_version: str) -> None:
if self._account.isLoggedIn: if self._account.isLoggedIn:
Logger.debug(f"Subscribing the user for package: {package_id}") Logger.debug(f"Subscribing the user for package: {package_id}")
HttpRequestManager.getInstance().put( HttpRequestManager.getInstance().put(
@ -195,32 +181,58 @@ class PackageList(ListModel):
scope = self._scope scope = self._scope
) )
@pyqtSlot(str) def unsunscribeUserFromPackage(self, package_id: str) -> None:
def uninstallPackage(self, package_id: str) -> None:
Logger.debug(f"Uninstalling {package_id}")
package = self._getPackageModel(package_id)
self._manager.removePackage(package_id)
package.setIsInstalling(False)
package.setManageInstallState(False)
self._unsunscribe(package_id)
def _unsunscribe(self, package_id: str) -> None:
if self._account.isLoggedIn: if self._account.isLoggedIn:
Logger.debug(f"Unsubscribing the user for package: {package_id}") Logger.debug(f"Unsubscribing the user for package: {package_id}")
HttpRequestManager.getInstance().delete(url = f"{USER_PACKAGES_URL}/{package_id}", scope = self._scope) HttpRequestManager.getInstance().delete(url = f"{USER_PACKAGES_URL}/{package_id}", scope = self._scope)
# --- Handle the manage package buttons ---
def _connectManageButtonSignals(self, package: PackageModel) -> None:
package.installPackageTriggered.connect(self.installPackage)
package.uninstallPackageTriggered.connect(self.uninstallPackage)
package.updatePackageTriggered.connect(self.installPackage)
package.enablePackageTriggered.connect(self.enablePackage)
package.disablePackageTriggered.connect(self.disablePackage)
@pyqtSlot(str)
def installPackage(self, package_id: str) -> None:
package = self.getPackageModel(package_id)
package.is_installing = True
url = package.download_url
Logger.debug(f"Trying to download and install {package_id} from {url}")
self.download(package_id, url)
@pyqtSlot(str)
def uninstallPackage(self, package_id: str) -> None:
Logger.debug(f"Uninstalling {package_id}")
package = self.getPackageModel(package_id)
package.is_installing = True
self._manager.removePackage(package_id)
package.is_installing = False
self.unsunscribeUserFromPackage(package_id)
@pyqtSlot(str) @pyqtSlot(str)
def updatePackage(self, package_id: str) -> None: def updatePackage(self, package_id: str) -> None:
package = self.getPackageModel(package_id)
package.is_updating = True
self._manager.removePackage(package_id, force_add = True) self._manager.removePackage(package_id, force_add = True)
package = self._getPackageModel(package_id)
url = package.download_url url = package.download_url
Logger.debug(f"Trying to download and update {package_id} from {url}") Logger.debug(f"Trying to download and update {package_id} from {url}")
self.download(package_id, url, True) self.download(package_id, url, True)
@pyqtSlot(str) @pyqtSlot(str)
def enablePackage(self, package_id: str) -> None: def enablePackage(self, package_id: str) -> None:
package = self.getPackageModel(package_id)
package.is_enabling = True
Logger.debug(f"Enabling {package_id}") Logger.debug(f"Enabling {package_id}")
# TODO: implement enabling functionality
package.is_enabling = False
@pyqtSlot(str) @pyqtSlot(str)
def disablePackage(self, package_id: str) -> None: def disablePackage(self, package_id: str) -> None:
package = self.getPackageModel(package_id)
package.is_enabling = True
Logger.debug(f"Disabling {package_id}") Logger.debug(f"Disabling {package_id}")
# TODO: implement disabling functionality
package.is_enabling = False

View file

@ -61,9 +61,11 @@ class PackageModel(QObject):
if not self._icon_url or self._icon_url == "": if not self._icon_url or self._icon_url == "":
self._icon_url = author_data.get("icon_url", "") self._icon_url = author_data.get("icon_url", "")
self._can_update = False
self._is_installing = False self._is_installing = False
self.is_recently_installed = False
self._can_update = False
self._is_updating = False self._is_updating = False
self._is_enabling = False
self._section_title = section_title self._section_title = section_title
self.sdk_version = package_data.get("sdk_version_semver", "") self.sdk_version = package_data.get("sdk_version_semver", "")
# Note that there's a lot more info in the package_data than just these specified here. # Note that there's a lot more info in the package_data than just these specified here.
@ -262,88 +264,9 @@ class PackageModel(QObject):
def isCompatibleAirManager(self) -> bool: def isCompatibleAirManager(self) -> bool:
return self._is_compatible_air_manager return self._is_compatible_air_manager
isInstallingChanged = pyqtSignal() # --- manage buttons signals ---
def setIsInstalling(self, value: bool) -> None: stateManageButtonChanged = pyqtSignal()
if value != self._is_installing:
self._is_installing = value
self.isInstallingChanged.emit()
@pyqtProperty(bool, fset = setIsInstalling, notify = isInstallingChanged)
def isInstalling(self) -> bool:
return self._is_installing
isUpdatingChanged = pyqtSignal()
def setIsUpdating(self, value: bool) -> None:
if value != self._is_updating:
self._is_updating = value
self.isUpdatingChanged.emit()
@pyqtProperty(bool, fset = setIsUpdating, notify = isUpdatingChanged)
def isUpdating(self) -> bool:
return self._is_updating
isInstalledChanged = pyqtSignal()
@pyqtProperty(bool, notify = isInstalledChanged)
def isInstalled(self):
return self._is_installed
isEnabledChanged = pyqtSignal()
@pyqtProperty(bool, notify = isEnabledChanged)
def isEnabled(self) -> bool:
return self._is_active
manageEnableStateChanged = pyqtSignal()
@pyqtProperty(str, notify = manageEnableStateChanged)
def manageEnableState(self) -> str:
# TODO: Handle manual installed packages
if self._is_installed:
if self._is_active:
return "secondary"
else:
return "primary"
else:
return "hidden"
manageInstallStateChanged = pyqtSignal()
def setManageInstallState(self, value: bool) -> None:
if value != self._is_installed:
self._is_installed = value
self.manageInstallStateChanged.emit()
self.manageEnableStateChanged.emit()
@pyqtProperty(str, notify = manageInstallStateChanged)
def manageInstallState(self) -> str:
if self._is_installed:
if self._is_bundled:
return "hidden"
else:
return "secondary"
else:
return "primary"
manageUpdateStateChanged = pyqtSignal()
@pyqtProperty(str, notify = manageUpdateStateChanged)
def manageUpdateState(self) -> str:
if self._can_update:
return "primary"
return "hidden"
@property
def canUpdate(self) -> bool:
return self._can_update
@canUpdate.setter
def canUpdate(self, value):
if value != self._can_update:
self._can_update = value
self.manageUpdateStateChanged.emit()
installPackageTriggered = pyqtSignal(str) installPackageTriggered = pyqtSignal(str)
@ -354,3 +277,162 @@ class PackageModel(QObject):
enablePackageTriggered = pyqtSignal(str) enablePackageTriggered = pyqtSignal(str)
disablePackageTriggered = pyqtSignal(str) disablePackageTriggered = pyqtSignal(str)
# --- enabling ---
@pyqtProperty(str, notify = stateManageButtonChanged)
def stateManageEnableButton(self) -> str:
if self._is_enabling:
return "busy"
if self.is_recently_installed:
return "hidden"
if self._package_type == "material":
if self._is_bundled: # TODO: Check if a bundled material can/should be un-/install en-/disabled
return "secondary"
return "hidden"
if not self._is_installed:
return "hidden"
if self._is_installed and self._is_active:
return "secondary"
return "primary"
@property
def is_enabling(self) -> bool:
return self._is_enabling
@is_enabling.setter
def is_enabling(self, value: bool) -> None:
if value != self._is_enabling:
self._is_enabling = value
self.stateManageButtonChanged.emit()
# --- Installing ---
@pyqtProperty(str, notify = stateManageButtonChanged)
def stateManageInstallButton(self) -> str:
if self._is_installing:
return "busy"
if self.is_recently_installed:
return "secondary"
if self._is_installed:
if self._is_bundled:
return "hidden"
else:
return "secondary"
else:
return "primary"
@property
def is_installing(self) -> bool:
return self._is_installing
@is_installing.setter
def is_installing(self, value: bool) -> None:
if value != self._is_installing:
self._is_installing = value
self.stateManageButtonChanged.emit()
# --- Updating ---
@pyqtProperty(str, notify = stateManageButtonChanged)
def stateManageUpdateButton(self) -> str:
if self._is_updating:
return "busy"
if self._can_update:
return "primary"
return "hidden"
@property
def is_updating(self) -> bool:
return self._is_updating
@is_updating.setter
def is_updating(self, value: bool) -> None:
if value != self._is_updating:
self._is_updating = value
self.stateManageButtonChanged.emit()
@property
def can_update(self) -> bool:
return self._can_update
@can_update.setter
def can_update(self, value: bool) -> None:
if value != self._can_update:
self._can_update = value
self.stateManageButtonChanged.emit()
# ----
# isInstalledChanged = pyqtSignal()
#
# @pyqtProperty(bool, notify = isInstalledChanged)
# def isInstalled(self):
# return self._is_installed
#
# isEnabledChanged = pyqtSignal()
#
#
#f
# @pyqtProperty(bool, notify = isEnabledChanged)
# def isEnabled(self) -> bool:
# return self._is_active
#
#
#
# isManageEnableStateChanged = pyqtSignalf()
#
# @pyqtProperty(str, notify = isManageEnableStateChanged)
# def isManageEnableState(self) -> str:
# if self.isEnabling:
# return "busy"
# if self.
#
# manageEnableStateChanged = pyqtSignal()
#
# @pyqtProperty(str, notify = manageEnableStateChanged)
# def manageEnableState(self) -> str:
# # TODO: Handle manual installed packages
# if self._is_installed:
# if self._is_active:
# return "secondary"
# else:
# return "primary"
# else:
# return "hidden"
#
# manageInstallStateChanged = pyqtSignal()
#
# def setManageInstallState(self, value: bool) -> None:
# if value != self._is_installed:
# self._is_installed = value
# self.manageInstallStateChanged.emit()
# self.manageEnableStateChanged.emit()
#
# @pyqtProperty(str, notify = manageInstallStateChanged)
# def manageInstallState(self) -> str:
# if self._is_installed:
# if self._is_bundled:
# return "hidden"
# else:
# return "secondary"
# else:
# return "primary"
#
# manageUpdateStateChanged = pyqtSignal()
#
# @pyqtProperty(str, notify = manageUpdateStateChanged)
# def manageUpdateState(self) -> str:
# if self._can_update:
# return "primary"
# return "hidden"
#

View file

@ -17,7 +17,7 @@ RowLayout
property string busySecondaryText: busyMessageText.text property string busySecondaryText: busyMessageText.text
property string mainState: "primary" property string mainState: "primary"
property bool enabled: true property bool enabled: true
property bool busy: false property bool busy
signal clicked(bool primary_action) signal clicked(bool primary_action)

View file

@ -355,12 +355,12 @@ Rectangle
ManageButton ManageButton
{ {
id: enableManageButton id: enableManageButton
state: packageData.stateManageEnableButton
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
primaryText: catalog.i18nc("@button", "Enable") primaryText: catalog.i18nc("@button", "Enable")
busyPrimaryText: catalog.i18nc("@button", "enabling...") busyPrimaryText: catalog.i18nc("@button", "enabling...")
secondaryText: catalog.i18nc("@button", "Disable") secondaryText: catalog.i18nc("@button", "Disable")
busySecondaryText: catalog.i18nc("@button", "disabling...") busySecondaryText: catalog.i18nc("@button", "disabling...")
mainState: packageData.manageEnableState
enabled: !(installManageButton.busy || updateManageButton.busy) enabled: !(installManageButton.busy || updateManageButton.busy)
} }
Connections Connections
@ -382,13 +382,12 @@ Rectangle
ManageButton ManageButton
{ {
id: installManageButton id: installManageButton
state: packageData.stateManageInstallButton
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
primaryText: catalog.i18nc("@button", "Install") primaryText: catalog.i18nc("@button", "Install")
busyPrimaryText: catalog.i18nc("@button", "installing...") busyPrimaryText: catalog.i18nc("@button", "installing...")
secondaryText: catalog.i18nc("@button", "Uninstall") secondaryText: catalog.i18nc("@button", "Uninstall")
busySecondaryText: catalog.i18nc("@button", "uninstalling...") busySecondaryText: catalog.i18nc("@button", "uninstalling...")
mainState: packageData.manageInstallState
busy: packageData.isInstalling
enabled: !(enableManageButton.busy || updateManageButton.busy) enabled: !(enableManageButton.busy || updateManageButton.busy)
} }
Connections Connections
@ -396,7 +395,6 @@ Rectangle
target: installManageButton target: installManageButton
function onClicked(primary_action) function onClicked(primary_action)
{ {
packageData.isInstalling = true
if (primary_action) if (primary_action)
{ {
packageData.installPackageTriggered(packageData.packageId) packageData.installPackageTriggered(packageData.packageId)
@ -411,11 +409,10 @@ Rectangle
ManageButton ManageButton
{ {
id: updateManageButton id: updateManageButton
state: packageData.stateManageUpdateButton
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
primaryText: catalog.i18nc("@button", "Update") primaryText: catalog.i18nc("@button", "Update")
busyPrimaryText: catalog.i18nc("@button", "updating...") busyPrimaryText: catalog.i18nc("@button", "updating...")
mainState: packageData.manageUpdateState
busy: packageData.isUpdating
enabled: !(installManageButton.busy || enableManageButton.busy) enabled: !(installManageButton.busy || enableManageButton.busy)
} }
Connections Connections
@ -423,7 +420,6 @@ Rectangle
target: updateManageButton target: updateManageButton
function onClicked(primary_action) function onClicked(primary_action)
{ {
packageData.isUpdating = true
packageData.updatePackageTriggered(packageData.packageId) packageData.updatePackageTriggered(packageData.packageId)
} }
} }