diff options
-rwxr-xr-x | cura/CuraApplication.py | 1 | ||||
-rw-r--r-- | cura/CuraPackageManager.py | 8 | ||||
-rw-r--r-- | plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml | 3 | ||||
-rw-r--r-- | plugins/Toolbox/src/Toolbox.py | 56 | ||||
-rw-r--r-- | resources/bundled_packages.json | 272 | ||||
-rw-r--r-- | resources/qml/JobSpecs.qml | 4 |
6 files changed, 337 insertions, 7 deletions
diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e416196775..05070e4432 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -302,7 +302,6 @@ class CuraApplication(QtApplication): self._platform_activity = False self._scene_bounding_box = AxisAlignedBox.Null - self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index 09253a4c77..3d4a360c7e 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -133,7 +133,7 @@ class CuraPackageManager(QObject): return None - def getAllInstalledPackagesInfo(self) -> dict: + def getAllInstalledPackageIDs(self) -> set: # Add bundled, installed, and to-install packages to the set of installed package IDs all_installed_ids = set() @@ -146,6 +146,12 @@ class CuraPackageManager(QObject): if self._to_install_package_dict.keys(): all_installed_ids = all_installed_ids.union(set(self._to_install_package_dict.keys())) + return all_installed_ids + + def getAllInstalledPackagesInfo(self) -> dict: + + all_installed_ids = self.getAllInstalledPackageIDs() + # map of <package_type> -> <package_id> -> <package_info> installed_packages_dict = {} for package_id in all_installed_ids: diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml b/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml index f82fb049d8..cd1e4cdbda 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml @@ -34,6 +34,7 @@ Column // Don't allow installing while another download is running enabled: installed || !(toolbox.isDownloading && toolbox.activePackage != model) opacity: enabled ? 1.0 : 0.5 + visible: !updateButton.visible // Don't show when the update button is visible } ToolboxProgressButton @@ -55,7 +56,7 @@ Column // Don't allow installing while another download is running enabled: !(toolbox.isDownloading && toolbox.activePackage != model) opacity: enabled ? 1.0 : 0.5 - visible: installed && canUpdate + visible: canUpdate } Connections { diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index b019dfccbe..b9264b89df 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -64,14 +64,17 @@ class Toolbox(QObject, Extension): ] self._request_urls = {} self._to_update = [] # Package_ids that are waiting to be updated + self._old_plugin_ids = [] # Data: self._metadata = { "authors": [], "packages": [], "plugins_showcase": [], + "plugins_available": [], "plugins_installed": [], "materials_showcase": [], + "materials_available": [], "materials_installed": [] } @@ -166,7 +169,9 @@ class Toolbox(QObject, Extension): "authors": QUrl("{base_url}/authors".format(base_url=self._api_url)), "packages": QUrl("{base_url}/packages".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)) + "plugins_available": QUrl("{base_url}/packages?package_type=plugin".format(base_url=self._api_url)), + "materials_showcase": QUrl("{base_url}/showcase".format(base_url=self._api_url)), + "materials_available": QUrl("{base_url}/packages?package_type=material".format(base_url=self._api_url)) } # Get the API root for the packages API depending on Cura version settings. @@ -233,15 +238,52 @@ class Toolbox(QObject, Extension): dialog = Application.getInstance().createQmlComponent(path, {"toolbox": self}) return dialog + + def _convertPluginMetadata(self, plugin: dict) -> dict: + formatted = { + "package_id": plugin["id"], + "package_type": "plugin", + "display_name": plugin["plugin"]["name"], + "package_version": plugin["plugin"]["version"], + "sdk_version": plugin["plugin"]["api"], + "author": { + "author_id": plugin["plugin"]["author"], + "display_name": plugin["plugin"]["author"] + }, + "is_installed": True, + "description": plugin["plugin"]["description"] + } + return formatted + @pyqtSlot() def _updateInstalledModels(self) -> None: + + # This is moved here to avoid code duplication and so that after installing plugins they get removed from the + # list of old plugins + old_plugin_ids = self._plugin_registry.getInstalledPlugins() + installed_package_ids = self._package_manager.getAllInstalledPackageIDs() + + self._old_plugin_ids = [] + self._old_plugin_metadata = [] + + for plugin_id in old_plugin_ids: + if plugin_id not in installed_package_ids: + Logger.log('i', 'Found a plugin that was installed with the old plugin browser: %s', plugin_id) + + old_metadata = self._plugin_registry.getMetaData(plugin_id) + new_metadata = self._convertPluginMetadata(old_metadata) + + self._old_plugin_ids.append(plugin_id) + self._old_plugin_metadata.append(new_metadata) + all_packages = self._package_manager.getAllInstalledPackagesInfo() if "plugin" in all_packages: - self._metadata["plugins_installed"] = all_packages["plugin"] + self._metadata["plugins_installed"] = all_packages["plugin"] + self._old_plugin_metadata self._models["plugins_installed"].setMetadata(self._metadata["plugins_installed"]) self.metadataChanged.emit() if "material" in all_packages: self._metadata["materials_installed"] = all_packages["material"] + # TODO: ADD MATERIALS HERE ONCE MATERIALS PORTION OF TOOLBOX IS LIVE self._models["materials_installed"].setMetadata(self._metadata["materials_installed"]) self.metadataChanged.emit() @@ -325,6 +367,9 @@ class Toolbox(QObject, Extension): # -------------------------------------------------------------------------- @pyqtSlot(str, result = bool) def canUpdate(self, package_id: str) -> bool: + if self.isOldPlugin(package_id): + return True + local_package = self._package_manager.getInstalledPackageInfo(package_id) if local_package is None: return False @@ -363,6 +408,13 @@ class Toolbox(QObject, Extension): return True return False + # Check for plugins that were installed with the old plugin browser + @pyqtSlot(str, result = bool) + def isOldPlugin(self, plugin_id: str) -> bool: + if plugin_id in self._old_plugin_ids: + return True + return False + def loadingComplete(self) -> bool: populated = 0 for list in self._metadata.items(): diff --git a/resources/bundled_packages.json b/resources/bundled_packages.json index ab6bf7e925..7f3ba2a92e 100644 --- a/resources/bundled_packages.json +++ b/resources/bundled_packages.json @@ -1132,5 +1132,277 @@ "website": "https://www.vellemanprojects.eu" } } + }, + "ConsoleLogger": { + "package_info": { + "package_id": "ConsoleLogger", + "package_type": "plugin", + "display_name": "Console Logger", + "description": "Outputs log information to the console.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "OBJReader": { + "package_info": { + "package_id": "OBJReader", + "package_type": "plugin", + "display_name": "Wavefront OBJ Reader", + "description": "Makes it possible to read Wavefront OBJ files.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "OBJWriter": { + "package_info": { + "package_id": "OBJWriter", + "package_type": "plugin", + "display_name": "Wavefront OBJ Writer", + "description": "Makes it possible to write Wavefront OBJ files.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "STLReader": { + "package_info": { + "package_id": "STLReader", + "package_type": "plugin", + "display_name": "STL Reader", + "description": "Provides support for reading STL files.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "STLWriter": { + "package_info": { + "package_id": "STLWriter", + "package_type": "plugin", + "display_name": "STL Writer", + "description": "Provides support for writing STL files.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "FileLogger": { + "package_info": { + "package_id": "FileLogger", + "package_type": "plugin", + "display_name": "File Logger", + "description": "Outputs log information to a file in your settings folder.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "LocalContainerProvider": { + "package_info": { + "package_id": "LocalContainerProvider", + "package_type": "plugin", + "display_name": "Local Container Provider", + "description": "Provides built-in setting containers that come with the installation of the application.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "LocalFileOutputDevice": { + "package_info": { + "package_id": "LocalFileOutputDevice", + "package_type": "plugin", + "display_name": "Local File Output Device", + "description": "Enables saving to local files.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "CameraTool": { + "package_info": { + "package_id": "CameraTool", + "package_type": "plugin", + "display_name": "Camera Tool", + "description": "Provides the tool to manipulate the camera.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "MirrorTool": { + "package_info": { + "package_id": "MirrorTool", + "package_type": "plugin", + "display_name": "Mirror Tool", + "description": "Provides the Mirror tool.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "RotateTool": { + "package_info": { + "package_id": "RotateTool", + "package_type": "plugin", + "display_name": "Rotate Tool", + "description": "Provides the Rotate tool.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "ScaleTool": { + "package_info": { + "package_id": "ScaleTool", + "package_type": "plugin", + "display_name": "Scale Tool", + "description": "Provides the Scale tool.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "SelectionTool": { + "package_info": { + "package_id": "SelectionTool", + "package_type": "plugin", + "display_name": "Selection Tool", + "description": "Provides the Selection tool.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "TranslateTool": { + "package_info": { + "package_id": "TranslateTool", + "package_type": "plugin", + "display_name": "Move Tool", + "description": "Provides the Move tool.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "UpdateChecker": { + "package_info": { + "package_id": "UpdateChecker", + "package_type": "plugin", + "display_name": "Update Checker", + "description": "Checks for updates of the software.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, + "SimpleView": { + "package_info": { + "package_id": "SimpleView", + "package_type": "plugin", + "display_name": "Simple View", + "description": "Provides a simple solid mesh view.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } } } diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 6cd9999db7..3b10cf59d5 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -81,8 +81,8 @@ Item { text: PrintInformation.jobName horizontalAlignment: TextInput.AlignRight onEditingFinished: { - text = text == "" ? "unnamed" : text; - PrintInformation.setJobName(printJobTextfield.text, true); + var new_name = text == "" ? "unnamed" : text; + PrintInformation.setJobName(new_name, true); printJobTextfield.focus = false; } validator: RegExpValidator { |