diff --git a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml index 04b055ed66..9666e65613 100644 --- a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml @@ -82,9 +82,16 @@ Item } spacing: Math.floor(UM.Theme.getSize("narrow_margin").height) width: childrenRect.width + Label { - text: catalog.i18nc("@label", "Contact") + ":" + text: catalog.i18nc("@label", "Website") + ":" + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text_medium") + } + Label + { + text: catalog.i18nc("@label", "Email") + ":" font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text_medium") } @@ -100,6 +107,26 @@ Item topMargin: UM.Theme.getSize("default_margin").height } spacing: Math.floor(UM.Theme.getSize("narrow_margin").height) + + Label + { + text: + { + if (details.website) + { + return "Link" + } + else + { + return "" + } + } + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text") + linkColor: UM.Theme.getColor("text_link") + onLinkActivated: Qt.openUrlExternally(link) + } + Label { text: @@ -110,7 +137,7 @@ Item } else { - return ""+details.name+"" + return "" } } font: UM.Theme.getFont("very_small") diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml index 1efcde2110..2ab8db007b 100644 --- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml +++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml @@ -8,7 +8,31 @@ import UM 1.1 as UM Item { + id: base + property var packageData + property var technical_data_sheet_url + + function initiazeLinks() + { + var all_links = packageData.links + for(var index = 0; index < all_links.length; index++) + { + var temp_link = all_links[index] + var title = temp_link["title"] + + if(title === "Technical Data Sheet") + { + base.technical_data_sheet_url = temp_link["url"] + } + } + } + + Component.onCompleted: + { + initiazeLinks() + } + anchors.topMargin: UM.Theme.getSize("default_margin").height height: visible ? childrenRect.height : 0 visible: packageData.type == "material" && packageData.has_configs @@ -132,4 +156,27 @@ Item width: Math.floor(table.width * 0.1) } } + + + + Label + { + id: technical_data_sheet + anchors.top: table.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height / 2 + visible: base.technical_data_sheet_url !== undefined + text: + { + if (base.technical_data_sheet_url !== undefined) + { + return "%2".arg(base.technical_data_sheet_url).arg("Technical Data Sheet") + } + return "" + } + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text") + linkColor: UM.Theme.getColor("text_link") + onLinkActivated: Qt.openUrlExternally(link) + } + } diff --git a/plugins/Toolbox/src/PackagesModel.py b/plugins/Toolbox/src/PackagesModel.py index 8b9199b127..ddbd2d2665 100644 --- a/plugins/Toolbox/src/PackagesModel.py +++ b/plugins/Toolbox/src/PackagesModel.py @@ -7,6 +7,7 @@ from typing import Dict from PyQt5.QtCore import Qt, pyqtProperty from UM.Qt.ListModel import ListModel from .ConfigsModel import ConfigsModel +from UM.Logger import Logger ## Model that holds cura packages. By setting the filter property the instances held by this model can be changed. class PackagesModel(ListModel): @@ -34,6 +35,8 @@ class PackagesModel(ListModel): self.addRoleName(Qt.UserRole + 17, "supported_configs") self.addRoleName(Qt.UserRole + 18, "download_count") self.addRoleName(Qt.UserRole + 19, "tags") + self.addRoleName(Qt.UserRole + 20, "links") + self.addRoleName(Qt.UserRole + 21, "website") # List of filters for queries. The result is the union of the each list of results. self._filter = {} # type: Dict[str, str] @@ -45,10 +48,18 @@ class PackagesModel(ListModel): def _update(self): items = [] + #If a user has a slow internet connection then the metadata might be None + if self._metadata is None: + Logger.logException("w", "Failed to load packages for Toolbox") + self.setItems(items) + return + + for package in self._metadata: has_configs = False configs_model = None + data_links = [] if "data" in package: if "supported_configs" in package["data"]: if len(package["data"]["supported_configs"]) > 0: @@ -56,33 +67,38 @@ class PackagesModel(ListModel): configs_model = ConfigsModel() configs_model.setConfigs(package["data"]["supported_configs"]) + data_links = package['data']['links'] if 'links' in package['data'] else [] + if "author_id" not in package["author"] or "display_name" not in package["author"]: package["author"]["author_id"] = "" package["author"]["display_name"] = "" # raise Exception("Detected a package with malformed author data.") items.append({ - "id": package["package_id"], - "type": package["package_type"], - "name": package["display_name"], - "version": package["package_version"], - "author_id": package["author"]["author_id"], - "author_name": package["author"]["display_name"], - "author_email": package["author"]["email"] if "email" in package["author"] else None, - "description": package["description"] if "description" in package else None, - "icon_url": package["icon_url"] if "icon_url" in package else None, - "image_urls": package["image_urls"] if "image_urls" in package else None, - "download_url": package["download_url"] if "download_url" in package else None, - "last_updated": package["last_updated"] if "last_updated" in package else None, - "is_bundled": package["is_bundled"] if "is_bundled" in package else False, - "is_active": package["is_active"] if "is_active" in package else False, - "is_installed": package["is_installed"] if "is_installed" in package else False, - "has_configs": has_configs, - "supported_configs": configs_model, - "download_count": package["download_count"] if "download_count" in package else 0, - "tags": package["tags"] if "tags" in package else [] + "id": package["package_id"], + "type": package["package_type"], + "name": package["display_name"], + "version": package["package_version"], + "author_id": package["author"]["author_id"], + "author_name": package["author"]["display_name"], + "author_email": package["author"]["email"] if "email" in package["author"] else None, + "description": package["description"] if "description" in package else None, + "icon_url": package["icon_url"] if "icon_url" in package else None, + "image_urls": package["image_urls"] if "image_urls" in package else None, + "download_url": package["download_url"] if "download_url" in package else None, + "last_updated": package["last_updated"] if "last_updated" in package else None, + "is_bundled": package["is_bundled"] if "is_bundled" in package else False, + "is_active": package["is_active"] if "is_active" in package else False, + "is_installed": package["is_installed"] if "is_installed" in package else False, + "has_configs": has_configs, + "supported_configs": configs_model, + "download_count": package["download_count"] if "download_count" in package else 0, + "tags": package["tags"] if "tags" in package else [], + "links": data_links, + "website": package["website"] if "website" in package else None, }) + # Filter on all the key-word arguments. for key, value in self._filter.items(): if key is "tags":