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":