Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelle Spijker <j.spijker@ultimaker.com>2021-12-08 18:08:24 +0300
committerGitHub <noreply@github.com>2021-12-08 18:08:24 +0300
commitfb950e39c9f4f2300146aea5b9a2f437253236ed (patch)
tree354eeb6bd3610a0a6c0586d0f046e23977c64ada /plugins/Marketplace/resources
parentdf0c502961320bb4ed38935824473b511fe2e803 (diff)
parentc72fd12ea2b44b1380b3af372e9c96a0bfb4ea88 (diff)
Merge pull request #11037 from Ultimaker/CURA-8734_Package_card_refactor
Cura 8734 package card refactor
Diffstat (limited to 'plugins/Marketplace/resources')
-rw-r--r--plugins/Marketplace/resources/qml/ManageButton.qml283
-rw-r--r--plugins/Marketplace/resources/qml/PackageCard.qml390
-rw-r--r--plugins/Marketplace/resources/qml/PackageDetails.qml7
-rw-r--r--plugins/Marketplace/resources/qml/PackagePage.qml556
4 files changed, 723 insertions, 513 deletions
diff --git a/plugins/Marketplace/resources/qml/ManageButton.qml b/plugins/Marketplace/resources/qml/ManageButton.qml
index b2a3ec7f1b..7843805e26 100644
--- a/plugins/Marketplace/resources/qml/ManageButton.qml
+++ b/plugins/Marketplace/resources/qml/ManageButton.qml
@@ -8,229 +8,128 @@ import QtQuick.Layouts 1.1
import UM 1.6 as UM
import Cura 1.6 as Cura
-RowLayout
+Item
{
id: manageButton
- property alias primaryText: primaryButton.text
- property alias secondaryText: secondaryButton.text
- property string busyPrimaryText: busyMessageText.text
- property string busySecondaryText: busyMessageText.text
- property string confirmedPrimaryText: confirmedMessageText.text
- property string confirmedSecondaryText: confirmedMessageText.text
+ property string button_style
+ property string text
property bool busy
property bool confirmed
- property bool confirmedTextChoice: true
signal clicked(bool primary_action)
- Cura.PrimaryButton
+ property Component primaryButton: Component
{
- id: primaryButton
- enabled: manageButton.enabled
-
- onClicked:
+ Cura.PrimaryButton
{
- busyMessage.text = manageButton.busyPrimaryText
- confirmedMessage.text = manageButton.confirmedPrimaryText
- manageButton.clicked(true)
+ id: primaryButton
+ text: manageButton.text
+
+ onClicked:
+ {
+ manageButton.clicked(true)
+ }
}
}
- Cura.SecondaryButton
+ property Component secondaryButton: Component
{
- id: secondaryButton
- enabled: manageButton.enabled
-
- onClicked:
+ Cura.SecondaryButton
{
- busyMessage.text = manageButton.busySecondaryText
- confirmedMessage.text = manageButton.confirmedSecondaryText
- manageButton.clicked(false)
+ id: secondaryButton
+ text: manageButton.text
+
+ onClicked:
+ {
+ manageButton.clicked(false)
+ }
}
}
- Item
+ property Component busyButton: Component
{
- id: busyMessage
- property alias text: busyMessageText.text
- height: UM.Theme.getSize("action_button").height
- width: childrenRect.width
-
- UM.RecolorImage
+ Item
{
- id: busyIndicator
- width: height
- anchors.left: parent.left
- anchors.top: parent.top
- anchors.topMargin: UM.Theme.getSize("narrow_margin").height
- anchors.bottom: parent.bottom
- anchors.bottomMargin: anchors.topMargin
-
- source: UM.Theme.getIcon("Spinner")
- color: UM.Theme.getColor("primary")
-
- RotationAnimator
- {
- target: busyIndicator
- running: busyMessage.visible
- from: 0
- to: 360
- loops: Animation.Infinite
- duration: 2500
+ id: busyMessage
+
+ UM.RecolorImage
+ {
+ id: busyIndicator
+ width: height
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.topMargin: UM.Theme.getSize("narrow_margin").height
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: anchors.topMargin
+
+ source: UM.Theme.getIcon("Spinner")
+ color: UM.Theme.getColor("primary")
+
+ RotationAnimator
+ {
+ target: busyIndicator
+ running: busyMessage.visible
+ from: 0
+ to: 360
+ loops: Animation.Infinite
+ duration: 2500
+ }
+ }
+ Label
+ {
+ id: busyMessageText
+ anchors.left: busyIndicator.right
+ anchors.leftMargin: UM.Theme.getSize("narrow_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ text: manageButton.text
+
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("primary")
}
}
- Label
- {
- id: busyMessageText
- anchors.left: busyIndicator.right
- anchors.leftMargin: UM.Theme.getSize("narrow_margin").width
- anchors.verticalCenter: parent.verticalCenter
-
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("primary")
- }
}
- Item
+ property Component confirmButton: Component
{
- id: confirmedMessage
- property alias text: confirmedMessageText.text
+ Item
+ {
- height: UM.Theme.getSize("action_button").height
- width: childrenRect.width
+ height: UM.Theme.getSize("action_button").height
+ width: childrenRect.width
- Label
- {
- id: confirmedMessageText
- anchors.verticalCenter: parent.verticalCenter
+ Label
+ {
+ id: confirmedMessageText
+ anchors.verticalCenter: parent.verticalCenter
+ text: manageButton.text
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("primary")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("primary")
+ }
}
}
- states:
- [
- State
- {
- name: "primary"
- PropertyChanges
- {
- target: primaryButton
- visible: true
- }
- PropertyChanges
- {
- target: secondaryButton
- visible: false
- }
- PropertyChanges
- {
- target: busyMessage
- visible: false
- }
- PropertyChanges
- {
- target: confirmedMessage
- visible: false
- }
- },
- State
- {
- name: "secondary"
- PropertyChanges
- {
- target: primaryButton
- visible: false
- }
- PropertyChanges
- {
- target: secondaryButton
- visible: true
- }
- PropertyChanges
- {
- target: busyMessage
- visible: false
- }
- PropertyChanges
- {
- target: confirmedMessage
- visible: false
- }
- },
- State
- {
- name: "hidden"
- PropertyChanges
- {
- target: primaryButton
- visible: false
- }
- PropertyChanges
- {
- target: secondaryButton
- visible: false
- }
- PropertyChanges
- {
- target: busyMessage
- visible: false
- }
- PropertyChanges
- {
- target: confirmedMessage
- visible: false
- }
- },
- State
- {
- name: "busy"
- PropertyChanges
- {
- target: primaryButton
- visible: false
- }
- PropertyChanges
- {
- target: secondaryButton
- visible: false
- }
- PropertyChanges
- {
- target: busyMessage
- visible: true
- }
- PropertyChanges
- {
- target: confirmedMessage
- visible: false
- }
- },
- State
+ height: UM.Theme.getSize("action_button").height
+ width: childrenRect.width
+
+ Loader
+ {
+
+ sourceComponent:
{
- name: "confirmed"
- PropertyChanges
- {
- target: primaryButton
- visible: false
- }
- PropertyChanges
- {
- target: secondaryButton
- visible: false
- }
- PropertyChanges
- {
- target: busyMessage
- visible: false
- }
- PropertyChanges
- {
- target: confirmedMessage
- visible: true
- text: manageButton.confirmedTextChoice ? manageButton.confirmedPrimaryText : manageButton.confirmedSecondaryText
+ switch (manageButton.button_style)
+ {
+ case "primary":
+ return manageButton.primaryButton;
+ case "secondary":
+ return manageButton.secondaryButton;
+ case "busy":
+ return manageButton.busyButton;
+ case "confirmed":
+ return manageButton.confirmButton;
+ default:
+ return;
}
}
- ]
+ }
}
diff --git a/plugins/Marketplace/resources/qml/PackageCard.qml b/plugins/Marketplace/resources/qml/PackageCard.qml
index f552bd8e69..5c986c2e6e 100644
--- a/plugins/Marketplace/resources/qml/PackageCard.qml
+++ b/plugins/Marketplace/resources/qml/PackageCard.qml
@@ -12,57 +12,12 @@ Rectangle
{
id: root
property var packageData
- property bool expanded: false
property bool manageableInListView
height: childrenRect.height
color: UM.Theme.getColor("main_background")
radius: UM.Theme.getSize("default_radius").width
- states:
- [
- State
- {
- name: "Folded"
- when: !expanded
- PropertyChanges
- {
- target: shortDescription
- visible: true
- }
- PropertyChanges
- {
- target: downloadCount
- visible: false
- }
- PropertyChanges
- {
- target: extendedDescription
- visible: false
- }
- },
- State
- {
- name: "Expanded"
- when: expanded
- PropertyChanges
- {
- target: shortDescription
- visible: false
- }
- PropertyChanges
- {
- target: downloadCount
- visible: true
- }
- PropertyChanges
- {
- target: extendedDescription
- visible: true
- }
- }
- ]
-
Column
{
width: parent.width
@@ -74,6 +29,7 @@ Rectangle
width: parent.width
height: UM.Theme.getSize("card").height
+ // card icon
Image
{
id: packageItem
@@ -89,6 +45,7 @@ Rectangle
source: packageData.iconUrl != "" ? packageData.iconUrl : "../images/placeholder.svg"
}
+ //
ColumnLayout
{
anchors
@@ -187,6 +144,7 @@ Rectangle
}
}
+ // description
Item
{
id: shortDescription
@@ -258,32 +216,6 @@ Rectangle
}
}
- Row
- {
- id: downloadCount
- Layout.preferredWidth: parent.width
- Layout.fillHeight: true
-
- UM.RecolorImage
- {
- id: downloadsIcon
- width: UM.Theme.getSize("card_tiny_icon").width
- height: UM.Theme.getSize("card_tiny_icon").height
-
- source: UM.Theme.getIcon("Download")
- color: UM.Theme.getColor("text")
- }
-
- Label
- {
- anchors.verticalCenter: downloadsIcon.verticalCenter
-
- color: UM.Theme.getColor("text")
- font: UM.Theme.getFont("default")
- text: packageData.downloadCount
- }
- }
-
// Author and action buttons.
RowLayout
{
@@ -293,6 +225,7 @@ Rectangle
spacing: UM.Theme.getSize("narrow_margin").width
+ // label "By"
Label
{
id: authorBy
@@ -303,6 +236,7 @@ Rectangle
color: UM.Theme.getColor("text")
}
+ // clickable author name
Cura.TertiaryButton
{
Layout.fillWidth: true
@@ -323,17 +257,34 @@ Rectangle
ManageButton
{
id: enableManageButton
- state: !(installManageButton.confirmed || updateManageButton.confirmed) || enableManageButton.confirmed ? packageData.stateManageEnableButton : "hidden"
+ visible: !(installManageButton.confirmed || updateManageButton.confirmed) || enableManageButton.confirmed
+ button_style: packageData.stateManageEnableButton
+ Layout.alignment: Qt.AlignTop
busy: packageData.enableManageButton == "busy"
confirmed: packageData.enableManageButton == "confirmed"
- Layout.alignment: Qt.AlignTop
- primaryText: catalog.i18nc("@button", "Enable")
- busyPrimaryText: catalog.i18nc("@button", "Enabling...")
- confirmedPrimaryText: catalog.i18nc("@button", "Enabled")
- secondaryText: catalog.i18nc("@button", "Disable")
- busySecondaryText: catalog.i18nc("@button", "Disabling...")
- confirmedSecondaryText: catalog.i18nc("@button", "Disabled")
- enabled: !(installManageButton.busy || updateManageButton.busy)
+ text: {
+ switch (packageData.stateManageEnableButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Enable");
+ case "secondary":
+ return catalog.i18nc("@button", "Disable");
+ case "busy":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Enabling...");
+ } else {
+ return catalog.i18nc("@button", "Disabling...");
+ }
+ case "confirmed":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Enabled");
+ } else {
+ return catalog.i18nc("@button", "Disabled");
+ }
+ default:
+ return "";
+ }
+ }
+ enabled: !installManageButton.busy && !updateManageButton.busy
onClicked:
{
@@ -351,18 +302,34 @@ Rectangle
ManageButton
{
id: installManageButton
- state: (root.manageableInListView || root.expanded || installManageButton.confirmed) && !(enableManageButton.confirmed || updateManageButton.confirmed) ? packageData.stateManageInstallButton : "hidden"
+ visible: (root.manageableInListView || installManageButton.confirmed) && !(enableManageButton.confirmed || updateManageButton.confirmed)
+ button_style: packageData.stateManageInstallButton
busy: packageData.stateManageInstallButton == "busy"
confirmed: packageData.stateManageInstallButton == "confirmed"
Layout.alignment: Qt.AlignTop
- primaryText: catalog.i18nc("@button", "Install")
- busyPrimaryText: catalog.i18nc("@button", "Installing...")
- confirmedPrimaryText: catalog.i18nc("@button", "Installed")
- secondaryText: catalog.i18nc("@button", "Uninstall")
- busySecondaryText: catalog.i18nc("@button", "Uninstalling...")
- confirmedSecondaryText: catalog.i18nc("@button", "Uninstalled")
- confirmedTextChoice: packageData.installationStatus
- enabled: !(enableManageButton.busy || updateManageButton.busy)
+ text: {
+ switch (packageData.stateManageInstallButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Install");
+ case "secondary":
+ return catalog.i18nc("@button", "Uninstall");
+ case "busy":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Installing...");
+ } else {
+ return catalog.i18nc("@button", "Uninstalling...");
+ }
+ case "confirmed":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Installed");
+ } else {
+ return catalog.i18nc("@button", "Uninstalled");
+ }
+ default:
+ return "";
+ }
+ }
+ enabled: !enableManageButton.busy && !updateManageButton.busy
onClicked:
{
@@ -380,243 +347,32 @@ Rectangle
ManageButton
{
id: updateManageButton
- state: (root.manageableInListView || root.expanded) && (!installManageButton.confirmed || updateManageButton.confirmed) ? packageData.stateManageUpdateButton : "hidden"
+ visible: (root.manageableInListView) && (!installManageButton.confirmed || updateManageButton.confirmed)
+
+ button_style: packageData.stateManageUpdateButton
busy: packageData.stateManageUpdateButton == "busy"
confirmed: packageData.stateManageUpdateButton == "confirmed"
Layout.alignment: Qt.AlignTop
- primaryText: catalog.i18nc("@button", "Update")
- busyPrimaryText: catalog.i18nc("@button", "Updating...")
- confirmedPrimaryText: catalog.i18nc("@button", "Updated")
- enabled: !(installManageButton.busy || enableManageButton.busy)
+ enabled: !installManageButton.busy && !enableManageButton.busy
+
+ text: {
+ switch (packageData.stateManageInstallButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Update");
+ case "busy":
+ return catalog.i18nc("@button", "Updating...");
+ case "confirmed":
+ return catalog.i18nc("@button", "Updated");
+ default:
+ return "";
+ }
+ }
onClicked: packageData.updatePackageTriggered(packageData.packageId)
}
}
}
}
-
- Column
- {
- id: extendedDescription
- width: parent.width
-
- padding: UM.Theme.getSize("default_margin").width
- topPadding: 0
- spacing: UM.Theme.getSize("default_margin").height
-
- Label
- {
- width: parent.width - parent.padding * 2
-
- text: catalog.i18nc("@header", "Description")
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
-
- Label
- {
- width: parent.width - parent.padding * 2
-
- text: packageData.formattedDescription
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- linkColor: UM.Theme.getColor("text_link")
- wrapMode: Text.Wrap
- textFormat: Text.RichText
-
- onLinkActivated: UM.UrlUtil.openUrl(link, ["http", "https"])
- }
-
- Column //Separate column to have no spacing between compatible printers.
- {
- id: compatiblePrinterColumn
- width: parent.width - parent.padding * 2
-
- visible: packageData.packageType === "material"
- spacing: 0
-
- Label
- {
- width: parent.width
-
- text: catalog.i18nc("@header", "Compatible printers")
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
-
- Repeater
- {
- model: packageData.compatiblePrinters
-
- Label
- {
- width: compatiblePrinterColumn.width
-
- text: modelData
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Label
- {
- width: parent.width
-
- visible: packageData.compatiblePrinters.length == 0
- text: "(" + catalog.i18nc("@info", "No compatibility information") + ")"
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Column
- {
- id: compatibleSupportMaterialColumn
- width: parent.width - parent.padding * 2
-
- visible: packageData.packageType === "material"
- spacing: 0
-
- Label
- {
- width: parent.width
-
- text: catalog.i18nc("@header", "Compatible support materials")
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
-
- Repeater
- {
- model: packageData.compatibleSupportMaterials
-
- Label
- {
- width: compatibleSupportMaterialColumn.width
-
- text: modelData
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Label
- {
- width: parent.width
-
- visible: packageData.compatibleSupportMaterials.length == 0
- text: "(" + catalog.i18nc("@info No materials", "None") + ")"
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Column
- {
- width: parent.width - parent.padding * 2
-
- visible: packageData.packageType === "material"
- spacing: 0
-
- Label
- {
- width: parent.width
-
- text: catalog.i18nc("@header", "Compatible with Material Station")
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
-
- Label
- {
- width: parent.width
-
- text: packageData.isCompatibleMaterialStation ? catalog.i18nc("@info", "Yes") : catalog.i18nc("@info", "No")
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Column
- {
- width: parent.width - parent.padding * 2
-
- visible: packageData.packageType === "material"
- spacing: 0
-
- Label
- {
- width: parent.width
-
- text: catalog.i18nc("@header", "Optimized for Air Manager")
- font: UM.Theme.getFont("medium_bold")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
-
- Label
- {
- width: parent.width
-
- text: packageData.isCompatibleAirManager ? catalog.i18nc("@info", "Yes") : catalog.i18nc("@info", "No")
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("text")
- elide: Text.ElideRight
- }
- }
-
- Row
- {
- id: externalButtonRow
- anchors.horizontalCenter: parent.horizontalCenter
-
- spacing: UM.Theme.getSize("narrow_margin").width
-
- Cura.SecondaryButton
- {
- text: packageData.packageType === "plugin" ? catalog.i18nc("@button", "Visit plug-in website") : catalog.i18nc("@button", "Website")
- iconSource: UM.Theme.getIcon("Globe")
- outlineColor: "transparent"
- onClicked: Qt.openUrlExternally(packageData.packageInfoUrl)
- }
-
- Cura.SecondaryButton
- {
- visible: packageData.packageType === "material"
- text: catalog.i18nc("@button", "Buy spool")
- iconSource: UM.Theme.getIcon("ShoppingCart")
- outlineColor: "transparent"
- onClicked: Qt.openUrlExternally(packageData.whereToBuy)
- }
-
- Cura.SecondaryButton
- {
- visible: packageData.packageType === "material"
- text: catalog.i18nc("@button", "Safety datasheet")
- iconSource: UM.Theme.getIcon("Warning")
- outlineColor: "transparent"
- onClicked: Qt.openUrlExternally(packageData.safetyDataSheet)
- }
-
- Cura.SecondaryButton
- {
- visible: packageData.packageType === "material"
- text: catalog.i18nc("@button", "Technical datasheet")
- iconSource: UM.Theme.getIcon("DocumentFilled")
- outlineColor: "transparent"
- onClicked: Qt.openUrlExternally(packageData.technicalDataSheet)
- }
- }
- }
}
FontMetrics
diff --git a/plugins/Marketplace/resources/qml/PackageDetails.qml b/plugins/Marketplace/resources/qml/PackageDetails.qml
index fdf1c8f92c..2599c7f28c 100644
--- a/plugins/Marketplace/resources/qml/PackageDetails.qml
+++ b/plugins/Marketplace/resources/qml/PackageDetails.qml
@@ -74,11 +74,11 @@ Item
clip: true //Need to clip, not for the bottom (which is off the window) but for the top (which would overlap the header).
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
- contentHeight: expandedPackageCard.height + UM.Theme.getSize("default_margin").height * 2
+ contentHeight: packagePage.height + UM.Theme.getSize("default_margin").height * 2
- PackageCard
+ PackagePage
{
- id: expandedPackageCard
+ id: packagePage
anchors
{
left: parent.left
@@ -90,7 +90,6 @@ Item
}
packageData: detailPage.packageData
- expanded: true
}
}
}
diff --git a/plugins/Marketplace/resources/qml/PackagePage.qml b/plugins/Marketplace/resources/qml/PackagePage.qml
new file mode 100644
index 0000000000..fca25c4022
--- /dev/null
+++ b/plugins/Marketplace/resources/qml/PackagePage.qml
@@ -0,0 +1,556 @@
+// Copyright (c) 2021 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.1
+
+import UM 1.6 as UM
+import Cura 1.6 as Cura
+
+Rectangle
+{
+ id: root
+ property var packageData
+ property bool manageableInListView
+
+ height: childrenRect.height
+ color: UM.Theme.getColor("main_background")
+ radius: UM.Theme.getSize("default_radius").width
+
+ Column
+ {
+ width: parent.width
+
+ spacing: 0
+
+ Item
+ {
+ width: parent.width
+ height: UM.Theme.getSize("card").height
+
+ Image
+ {
+ id: packageItem
+ anchors
+ {
+ top: parent.top
+ left: parent.left
+ margins: UM.Theme.getSize("default_margin").width
+ }
+ width: UM.Theme.getSize("card_icon").width
+ height: width
+
+ source: packageData.iconUrl != "" ? packageData.iconUrl : "../images/placeholder.svg"
+ }
+
+ ColumnLayout
+ {
+ anchors
+ {
+ left: packageItem.right
+ leftMargin: UM.Theme.getSize("default_margin").width
+ right: parent.right
+ rightMargin: UM.Theme.getSize("default_margin").width
+ top: parent.top
+ topMargin: UM.Theme.getSize("narrow_margin").height
+ }
+ height: packageItem.height + packageItem.anchors.margins * 2
+
+ // Title row.
+ RowLayout
+ {
+ id: titleBar
+ Layout.preferredWidth: parent.width
+ Layout.preferredHeight: childrenRect.height
+
+ Label
+ {
+ text: packageData.displayName
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ verticalAlignment: Text.AlignTop
+ }
+ VerifiedIcon
+ {
+ enabled: packageData.isCheckedByUltimaker
+ visible: packageData.isCheckedByUltimaker
+ }
+
+
+ Control
+ {
+ Layout.preferredWidth: UM.Theme.getSize("card_tiny_icon").width
+ Layout.preferredHeight: UM.Theme.getSize("card_tiny_icon").height
+ Layout.alignment: Qt.AlignCenter
+ enabled: false // remove!
+ visible: false // replace packageInfo.XXXXXX
+ // TODO: waiting for materials card implementation
+
+ Cura.ToolTip
+ {
+ tooltipText: "" // TODO
+ visible: parent.hovered
+ }
+
+ UM.RecolorImage
+ {
+ anchors.fill: parent
+
+ color: UM.Theme.getColor("primary")
+ source: UM.Theme.getIcon("CheckCircle") // TODO
+ }
+
+ // onClicked: Qt.openUrlExternally( XXXXXX ) // TODO
+ }
+
+ Label
+ {
+ id: packageVersionLabel
+ text: packageData.packageVersion
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ Layout.fillWidth: true
+ }
+
+ Button
+ {
+ id: externalLinkButton
+
+ // For some reason if i set padding, they don't match up. If i set all of them explicitly, it does work?
+ leftPadding: UM.Theme.getSize("narrow_margin").width
+ rightPadding: UM.Theme.getSize("narrow_margin").width
+ topPadding: UM.Theme.getSize("narrow_margin").width
+ bottomPadding: UM.Theme.getSize("narrow_margin").width
+
+ Layout.preferredWidth: UM.Theme.getSize("card_tiny_icon").width + 2 * padding
+ Layout.preferredHeight: UM.Theme.getSize("card_tiny_icon").width + 2 * padding
+ contentItem: UM.RecolorImage
+ {
+ source: UM.Theme.getIcon("LinkExternal")
+ color: UM.Theme.getColor("icon")
+ implicitWidth: UM.Theme.getSize("card_tiny_icon").width
+ implicitHeight: UM.Theme.getSize("card_tiny_icon").height
+ }
+
+ background: Rectangle
+ {
+ color: externalLinkButton.hovered ? UM.Theme.getColor("action_button_hovered"): "transparent"
+ radius: externalLinkButton.width / 2
+ }
+ onClicked: Qt.openUrlExternally(packageData.authorInfoUrl)
+ }
+ }
+
+ Row
+ {
+ id: downloadCount
+ Layout.preferredWidth: parent.width
+ Layout.fillHeight: true
+
+ UM.RecolorImage
+ {
+ id: downloadsIcon
+ width: UM.Theme.getSize("card_tiny_icon").width
+ height: UM.Theme.getSize("card_tiny_icon").height
+
+ source: UM.Theme.getIcon("Download")
+ color: UM.Theme.getColor("text")
+ }
+
+ Label
+ {
+ anchors.verticalCenter: downloadsIcon.verticalCenter
+
+ color: UM.Theme.getColor("text")
+ font: UM.Theme.getFont("default")
+ text: packageData.downloadCount
+ }
+ }
+
+ // Author and action buttons.
+ RowLayout
+ {
+ id: authorAndActionButton
+ Layout.preferredWidth: parent.width
+ Layout.preferredHeight: childrenRect.height
+
+ spacing: UM.Theme.getSize("narrow_margin").width
+
+ Label
+ {
+ id: authorBy
+ Layout.alignment: Qt.AlignCenter
+
+ text: catalog.i18nc("@label", "By")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ }
+
+ Cura.TertiaryButton
+ {
+ Layout.fillWidth: true
+ Layout.preferredHeight: authorBy.height
+ Layout.alignment: Qt.AlignCenter
+
+ text: packageData.authorName
+ textFont: UM.Theme.getFont("default_bold")
+ textColor: UM.Theme.getColor("text") // override normal link color
+ leftPadding: 0
+ rightPadding: 0
+ iconSource: UM.Theme.getIcon("LinkExternal")
+ isIconOnRightSide: true
+
+ onClicked: Qt.openUrlExternally(packageData.authorInfoUrl)
+ }
+
+ ManageButton
+ {
+ id: enableManageButton
+ visible: !(installManageButton.confirmed || updateManageButton.confirmed) || enableManageButton.confirmed
+ button_style: packageData.stateManageEnableButton
+ Layout.alignment: Qt.AlignTop
+ busy: packageData.enableManageButton == "busy"
+ confirmed: packageData.enableManageButton == "confirmed"
+ text: {
+ switch (packageData.stateManageEnableButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Enable");
+ case "secondary":
+ return catalog.i18nc("@button", "Disable");
+ case "busy":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Enabling...");
+ } else {
+ return catalog.i18nc("@button", "Disabling...");
+ }
+ case "confirmed":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Enabled");
+ } else {
+ return catalog.i18nc("@button", "Disabled");
+ }
+ default:
+ return "";
+ }
+ }
+ enabled: !installManageButton.busy && !updateManageButton.busy
+
+ onClicked:
+ {
+ if (primary_action)
+ {
+ packageData.enablePackageTriggered(packageData.packageId)
+ }
+ else
+ {
+ packageData.disablePackageTriggered(packageData.packageId)
+ }
+ }
+ }
+
+ ManageButton
+ {
+ id: installManageButton
+ visible: !(enableManageButton.confirmed || updateManageButton.confirmed)
+ button_style: packageData.stateManageInstallButton
+ busy: packageData.stateManageInstallButton == "busy"
+ confirmed: packageData.stateManageInstallButton == "confirmed"
+ Layout.alignment: Qt.AlignTop
+ text: {
+ switch (packageData.stateManageInstallButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Install");
+ case "secondary":
+ return catalog.i18nc("@button", "Uninstall");
+ case "busy":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Installing...");
+ } else {
+ return catalog.i18nc("@button", "Uninstalling...");
+ }
+ case "confirmed":
+ if (packageData.installationStatus) {
+ return catalog.i18nc("@button", "Installed");
+ } else {
+ return catalog.i18nc("@button", "Uninstalled");
+ }
+ default:
+ return "";
+ }
+ }
+ enabled: !enableManageButton.busy && !updateManageButton.busy
+
+ onClicked:
+ {
+ if (primary_action)
+ {
+ packageData.installPackageTriggered(packageData.packageId)
+ }
+ else
+ {
+ packageData.uninstallPackageTriggered(packageData.packageId)
+ }
+ }
+ }
+
+ ManageButton
+ {
+ id: updateManageButton
+ visible: !installManageButton.confirmed || updateManageButton.confirmed
+
+ button_style: packageData.stateManageUpdateButton
+ busy: packageData.stateManageUpdateButton == "busy"
+ confirmed: packageData.stateManageUpdateButton == "confirmed"
+ Layout.alignment: Qt.AlignTop
+ enabled: !installManageButton.busy && !enableManageButton.busy
+
+ text: {
+ switch (packageData.stateManageInstallButton) {
+ case "primary":
+ return catalog.i18nc("@button", "Update");
+ case "busy":
+ return catalog.i18nc("@button", "Updating...");
+ case "confirmed":
+ return catalog.i18nc("@button", "Updated");
+ default:
+ return "";
+ }
+ }
+
+ onClicked: packageData.updatePackageTriggered(packageData.packageId)
+ }
+ }
+ }
+ }
+
+ Column
+ {
+ id: extendedDescription
+ width: parent.width
+
+ padding: UM.Theme.getSize("default_margin").width
+ topPadding: 0
+ spacing: UM.Theme.getSize("default_margin").height
+
+ Label
+ {
+ width: parent.width - parent.padding * 2
+
+ text: catalog.i18nc("@header", "Description")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+
+ Label
+ {
+ width: parent.width - parent.padding * 2
+
+ text: packageData.formattedDescription
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ linkColor: UM.Theme.getColor("text_link")
+ wrapMode: Text.Wrap
+ textFormat: Text.RichText
+
+ onLinkActivated: UM.UrlUtil.openUrl(link, ["http", "https"])
+ }
+
+ Column //Separate column to have no spacing between compatible printers.
+ {
+ id: compatiblePrinterColumn
+ width: parent.width - parent.padding * 2
+
+ visible: packageData.packageType === "material"
+ spacing: 0
+
+ Label
+ {
+ width: parent.width
+
+ text: catalog.i18nc("@header", "Compatible printers")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+
+ Repeater
+ {
+ model: packageData.compatiblePrinters
+
+ Label
+ {
+ width: compatiblePrinterColumn.width
+
+ text: modelData
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Label
+ {
+ width: parent.width
+
+ visible: packageData.compatiblePrinters.length == 0
+ text: "(" + catalog.i18nc("@info", "No compatibility information") + ")"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Column
+ {
+ id: compatibleSupportMaterialColumn
+ width: parent.width - parent.padding * 2
+
+ visible: packageData.packageType === "material"
+ spacing: 0
+
+ Label
+ {
+ width: parent.width
+
+ text: catalog.i18nc("@header", "Compatible support materials")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+
+ Repeater
+ {
+ model: packageData.compatibleSupportMaterials
+
+ Label
+ {
+ width: compatibleSupportMaterialColumn.width
+
+ text: modelData
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Label
+ {
+ width: parent.width
+
+ visible: packageData.compatibleSupportMaterials.length == 0
+ text: "(" + catalog.i18nc("@info No materials", "None") + ")"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Column
+ {
+ width: parent.width - parent.padding * 2
+
+ visible: packageData.packageType === "material"
+ spacing: 0
+
+ Label
+ {
+ width: parent.width
+
+ text: catalog.i18nc("@header", "Compatible with Material Station")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+
+ Label
+ {
+ width: parent.width
+
+ text: packageData.isCompatibleMaterialStation ? catalog.i18nc("@info", "Yes") : catalog.i18nc("@info", "No")
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Column
+ {
+ width: parent.width - parent.padding * 2
+
+ visible: packageData.packageType === "material"
+ spacing: 0
+
+ Label
+ {
+ width: parent.width
+
+ text: catalog.i18nc("@header", "Optimized for Air Manager")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+
+ Label
+ {
+ width: parent.width
+
+ text: packageData.isCompatibleAirManager ? catalog.i18nc("@info", "Yes") : catalog.i18nc("@info", "No")
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ elide: Text.ElideRight
+ }
+ }
+
+ Row
+ {
+ id: externalButtonRow
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ spacing: UM.Theme.getSize("narrow_margin").width
+
+ Cura.SecondaryButton
+ {
+ text: packageData.packageType === "plugin" ? catalog.i18nc("@button", "Visit plug-in website") : catalog.i18nc("@button", "Website")
+ iconSource: UM.Theme.getIcon("Globe")
+ outlineColor: "transparent"
+ onClicked: Qt.openUrlExternally(packageData.packageInfoUrl)
+ }
+
+ Cura.SecondaryButton
+ {
+ visible: packageData.packageType === "material"
+ text: catalog.i18nc("@button", "Buy spool")
+ iconSource: UM.Theme.getIcon("ShoppingCart")
+ outlineColor: "transparent"
+ onClicked: Qt.openUrlExternally(packageData.whereToBuy)
+ }
+
+ Cura.SecondaryButton
+ {
+ visible: packageData.packageType === "material"
+ text: catalog.i18nc("@button", "Safety datasheet")
+ iconSource: UM.Theme.getIcon("Warning")
+ outlineColor: "transparent"
+ onClicked: Qt.openUrlExternally(packageData.safetyDataSheet)
+ }
+
+ Cura.SecondaryButton
+ {
+ visible: packageData.packageType === "material"
+ text: catalog.i18nc("@button", "Technical datasheet")
+ iconSource: UM.Theme.getIcon("DocumentFilled")
+ outlineColor: "transparent"
+ onClicked: Qt.openUrlExternally(packageData.technicalDataSheet)
+ }
+ }
+ }
+ }
+
+ FontMetrics
+ {
+ id: fontMetrics
+ font: UM.Theme.getFont("default")
+ }
+}