mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
Fix/Implement update in toolbox
This commit is contained in:
parent
8718ee34c9
commit
0f0b6a9712
5 changed files with 57 additions and 21 deletions
|
@ -136,14 +136,14 @@ class CuraPackageManager(QObject):
|
||||||
all_installed_ids = all_installed_ids.union(set(self._bundled_package_dict.keys()))
|
all_installed_ids = all_installed_ids.union(set(self._bundled_package_dict.keys()))
|
||||||
if self._installed_package_dict.keys():
|
if self._installed_package_dict.keys():
|
||||||
all_installed_ids = all_installed_ids.union(set(self._installed_package_dict.keys()))
|
all_installed_ids = all_installed_ids.union(set(self._installed_package_dict.keys()))
|
||||||
|
all_installed_ids = all_installed_ids.difference(self._to_remove_package_set)
|
||||||
|
# If it's going to be installed and to be removed, then the package is being updated and it should be listed.
|
||||||
if self._to_install_package_dict.keys():
|
if self._to_install_package_dict.keys():
|
||||||
all_installed_ids = all_installed_ids.union(set(self._to_install_package_dict.keys()))
|
all_installed_ids = all_installed_ids.union(set(self._to_install_package_dict.keys()))
|
||||||
all_installed_ids = all_installed_ids.difference(self._to_remove_package_set)
|
|
||||||
|
|
||||||
# map of <package_type> -> <package_id> -> <package_info>
|
# map of <package_type> -> <package_id> -> <package_info>
|
||||||
installed_packages_dict = {}
|
installed_packages_dict = {}
|
||||||
for package_id in all_installed_ids:
|
for package_id in all_installed_ids:
|
||||||
|
|
||||||
# Skip required plugins as they should not be tampered with
|
# Skip required plugins as they should not be tampered with
|
||||||
if package_id in Application.getInstance().getRequiredPlugins():
|
if package_id in Application.getInstance().getRequiredPlugins():
|
||||||
continue
|
continue
|
||||||
|
@ -194,10 +194,10 @@ class CuraPackageManager(QObject):
|
||||||
return
|
return
|
||||||
package_id = package_info["package_id"]
|
package_id = package_info["package_id"]
|
||||||
|
|
||||||
# Check the delayed installation and removal lists first
|
# # Check the delayed installation and removal lists first
|
||||||
if package_id in self._to_remove_package_set:
|
# if package_id in self._to_remove_package_set:
|
||||||
self._to_remove_package_set.remove(package_id)
|
# self._to_remove_package_set.remove(package_id)
|
||||||
has_changes = True
|
# has_changes = True
|
||||||
|
|
||||||
# Check if it is installed
|
# Check if it is installed
|
||||||
installed_package_info = self.getInstalledPackageInfo(package_info["package_id"])
|
installed_package_info = self.getInstalledPackageInfo(package_info["package_id"])
|
||||||
|
@ -235,20 +235,22 @@ class CuraPackageManager(QObject):
|
||||||
self.installedPackagesChanged.emit()
|
self.installedPackagesChanged.emit()
|
||||||
|
|
||||||
# Schedules the given package to be removed upon the next start.
|
# Schedules the given package to be removed upon the next start.
|
||||||
|
# \param package_id id of the package
|
||||||
|
# \param force_add is used when updating. In that case you actually want to uninstall & install
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def removePackage(self, package_id: str) -> None:
|
def removePackage(self, package_id: str, force_add: bool = False) -> None:
|
||||||
# Check the delayed installation and removal lists first
|
# Check the delayed installation and removal lists first
|
||||||
if not self.isPackageInstalled(package_id):
|
if not self.isPackageInstalled(package_id):
|
||||||
Logger.log("i", "Attempt to remove package [%s] that is not installed, do nothing.", package_id)
|
Logger.log("i", "Attempt to remove package [%s] that is not installed, do nothing.", package_id)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Remove from the delayed installation list if present
|
if package_id not in self._to_install_package_dict or force_add:
|
||||||
if package_id in self._to_install_package_dict:
|
# Schedule for a delayed removal:
|
||||||
|
self._to_remove_package_set.add(package_id)
|
||||||
|
else:
|
||||||
|
# Remove from the delayed installation list if present
|
||||||
del self._to_install_package_dict[package_id]
|
del self._to_install_package_dict[package_id]
|
||||||
|
|
||||||
# Schedule for a delayed removal:
|
|
||||||
self._to_remove_package_set.add(package_id)
|
|
||||||
|
|
||||||
self._saveManagementData()
|
self._saveManagementData()
|
||||||
self.installedPackagesChanged.emit()
|
self.installedPackagesChanged.emit()
|
||||||
|
|
||||||
|
|
|
@ -102,4 +102,4 @@ Item
|
||||||
onMetadataChanged: canUpdate = toolbox.canUpdate(model.id)
|
onMetadataChanged: canUpdate = toolbox.canUpdate(model.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,10 @@ Column
|
||||||
font: UM.Theme.getFont("default_bold")
|
font: UM.Theme.getFont("default_bold")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClicked: toolbox.update(model.id)
|
onClicked: {
|
||||||
|
// Must do all stuff in 1 function as the current ToolboxInstalledTile object is going to disappear...
|
||||||
|
toolbox.update(model.id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ProgressBar
|
ProgressBar
|
||||||
{
|
{
|
||||||
|
@ -90,4 +93,4 @@ Column
|
||||||
}
|
}
|
||||||
onClicked: toolbox.uninstall(model.id)
|
onClicked: toolbox.uninstall(model.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ class Toolbox(QObject, Extension):
|
||||||
"plugins_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)),
|
"plugins_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)),
|
||||||
"materials_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url))
|
"materials_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url))
|
||||||
}
|
}
|
||||||
|
self._to_update = [] # Package_ids that are waiting to be updated
|
||||||
|
|
||||||
# Data:
|
# Data:
|
||||||
self._metadata = {
|
self._metadata = {
|
||||||
|
@ -216,13 +217,29 @@ class Toolbox(QObject, Extension):
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def uninstall(self, plugin_id: str) -> None:
|
def uninstall(self, plugin_id: str) -> None:
|
||||||
self._package_manager.removePackage(plugin_id)
|
self._package_manager.removePackage(plugin_id, force_add = True)
|
||||||
self.installChanged.emit()
|
self.installChanged.emit()
|
||||||
self._updateInstalledModels()
|
self._updateInstalledModels()
|
||||||
self.metadataChanged.emit()
|
self.metadataChanged.emit()
|
||||||
self._restart_required = True
|
self._restart_required = True
|
||||||
self.restartRequiredChanged.emit()
|
self.restartRequiredChanged.emit()
|
||||||
|
|
||||||
|
## Actual update packages that are in self._to_update
|
||||||
|
def _update(self) -> None:
|
||||||
|
if self._to_update:
|
||||||
|
plugin_id = self._to_update.pop(0)
|
||||||
|
Logger.log("d", "Updating package [%s]..." % plugin_id)
|
||||||
|
self.uninstall(plugin_id)
|
||||||
|
self.startDownload(self.getRemotePackageURL(plugin_id))
|
||||||
|
if self._to_update:
|
||||||
|
self._application.callLater(self._update)
|
||||||
|
|
||||||
|
## Update a plugin by plugin_id
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def update(self, plugin_id: str) -> None:
|
||||||
|
self._to_update.append(plugin_id)
|
||||||
|
self._application.callLater(self._update)
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def enable(self, plugin_id: str) -> None:
|
def enable(self, plugin_id: str) -> None:
|
||||||
self._plugin_registry.enablePlugin(plugin_id)
|
self._plugin_registry.enablePlugin(plugin_id)
|
||||||
|
@ -251,6 +268,23 @@ class Toolbox(QObject, Extension):
|
||||||
def restart(self):
|
def restart(self):
|
||||||
CuraApplication.getInstance().windowClosed()
|
CuraApplication.getInstance().windowClosed()
|
||||||
|
|
||||||
|
def getRemotePackage(self, package_id: str) -> Optional[Dict]:
|
||||||
|
# TODO: make the lookup in a dict, not a loop. canUpdate is called for every item.
|
||||||
|
remote_package = None
|
||||||
|
for package in self._metadata["packages"]:
|
||||||
|
if package["package_id"] == package_id:
|
||||||
|
remote_package = package
|
||||||
|
break
|
||||||
|
return remote_package
|
||||||
|
|
||||||
|
@pyqtSlot(str, result = str)
|
||||||
|
def getRemotePackageURL(self, package_id: str) -> str:
|
||||||
|
remote_package = self.getRemotePackage(package_id)
|
||||||
|
if remote_package:
|
||||||
|
return remote_package["download_url"]
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
# Checks
|
# Checks
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
@pyqtSlot(str, result = bool)
|
@pyqtSlot(str, result = bool)
|
||||||
|
@ -259,10 +293,7 @@ class Toolbox(QObject, Extension):
|
||||||
if local_package is None:
|
if local_package is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
remote_package = None
|
remote_package = self.getRemotePackage(package_id)
|
||||||
for package in self._metadata["packages"]:
|
|
||||||
if package["package_id"] == package_id:
|
|
||||||
remote_package = package
|
|
||||||
if remote_package is None:
|
if remote_package is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -736,7 +736,7 @@
|
||||||
"package_type": "material",
|
"package_type": "material",
|
||||||
"display_name": "Dagoma Chromatik PLA",
|
"display_name": "Dagoma Chromatik PLA",
|
||||||
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "0.9.5",
|
||||||
"cura_version": 4,
|
"cura_version": 4,
|
||||||
"website": "https://dagoma.fr/boutique/filaments.html",
|
"website": "https://dagoma.fr/boutique/filaments.html",
|
||||||
"author": {
|
"author": {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue