123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- // 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
- // As both the PackageCard and Package contain similar components; a package icon, title, author bar. These components
- // are combined into the reusable "PackageCardHeader" component
- Item
- {
- default property alias contents: contentItem.children
- property var packageData
- property bool showDisableButton: false
- property bool showInstallButton: false
- property bool showUpdateButton: false
- property string missingPackageReadMoreUrl: "https://support.ultimaker.com/hc/en-us/articles/360011968360-Using-the-Ultimaker-Marketplace?utm_source=cura&utm_medium=software&utm_campaign=load-file-material-missing"
- width: parent.width
- height: UM.Theme.getSize("card").height
- // card icon
- Item
- {
- 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
- property bool packageHasIcon: packageData.iconUrl != ""
- Image
- {
- visible: parent.packageHasIcon
- anchors.fill: parent
- source: packageData.iconUrl
- }
- UM.ColorImage
- {
- visible: !parent.packageHasIcon
- anchors.fill: parent
- color: UM.Theme.getColor("text")
- source:
- {
- switch (packageData.packageType)
- {
- case "plugin":
- return Qt.resolvedUrl("../images/Plugin.svg");
- case "material":
- return Qt.resolvedUrl("../images/Spool.svg");
- default:
- return Qt.resolvedUrl("../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
- UM.StatusIcon
- {
- width: UM.Theme.getSize("section_icon").width + UM.Theme.getSize("narrow_margin").width
- height: UM.Theme.getSize("section_icon").height
- status: UM.StatusIcon.Status.WARNING
- visible: packageData.isMissingPackageInformation
- }
- UM.Label
- {
- text: packageData.displayName
- font: UM.Theme.getFont("medium_bold")
- verticalAlignment: Text.AlignTop
- }
- VerifiedIcon
- {
- enabled: packageData.isCheckedByUltimaker
- visible: packageData.isCheckedByUltimaker
- }
- UM.Label
- {
- id: packageVersionLabel
- text: packageData.packageVersion
- Layout.fillWidth: true
- }
- Button
- {
- id: externalLinkButton
- visible: !packageData.isMissingPackageInformation
- // 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
- width: UM.Theme.getSize("card_tiny_icon").width + 2 * padding
- height: UM.Theme.getSize("card_tiny_icon").width + 2 * padding
- contentItem: UM.ColorImage
- {
- 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.marketplaceURL)
- }
- }
- // When a package Card companent is created and children are provided to it they are rendered here
- Item {
- id: contentItem
- Layout.fillHeight: true
- Layout.preferredWidth: parent.width
- }
- // Author and action buttons.
- RowLayout
- {
- id: authorAndActionButton
- Layout.preferredWidth: parent.width
- Layout.preferredHeight: childrenRect.height
- spacing: UM.Theme.getSize("narrow_margin").width
- // label "By"
- UM.Label
- {
- id: authorBy
- visible: !packageData.isMissingPackageInformation
- Layout.alignment: Qt.AlignCenter
- text: catalog.i18nc("@label Is followed by the name of an author", "By")
- font: UM.Theme.getFont("default")
- color: UM.Theme.getColor("text")
- }
- // clickable author name
- Item
- {
- visible: !packageData.isMissingPackageInformation
- Layout.fillWidth: true
- implicitHeight: authorBy.height
- Layout.alignment: Qt.AlignTop
- Cura.TertiaryButton
- {
- 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)
- }
- }
- Item
- {
- visible: packageData.isMissingPackageInformation
- Layout.fillWidth: true
- implicitHeight: readMoreButton.height
- Layout.alignment: Qt.AlignTop
- Cura.TertiaryButton
- {
- id: readMoreButton
- text: catalog.i18nc("@button:label", "Learn More")
- leftPadding: 0
- rightPadding: 0
- iconSource: UM.Theme.getIcon("LinkExternal")
- isIconOnRightSide: true
- onClicked: Qt.openUrlExternally(missingPackageReadMoreUrl)
- }
- }
- ManageButton
- {
- id: enableManageButton
- visible: showDisableButton && packageData.isInstalled && !packageData.isToBeInstalled && packageData.packageType != "material" && !packageData.isMissingPackageInformation
- enabled: !packageData.busy
- button_style: !packageData.isActive
- Layout.alignment: Qt.AlignTop
- text: button_style ? catalog.i18nc("@button", "Enable") : catalog.i18nc("@button", "Disable")
- onClicked: packageData.isActive ? packageData.disable(): packageData.enable()
- }
- ManageButton
- {
- id: installManageButton
- visible: showInstallButton && (packageData.canDowngrade || !packageData.isBundled) && !packageData.isMissingPackageInformation
- enabled: !packageData.busy
- busy: packageData.busy
- button_style: !(packageData.isInstalled || packageData.isToBeInstalled)
- Layout.alignment: Qt.AlignTop
- text:
- {
- if (packageData.canDowngrade)
- {
- if (busy) { return catalog.i18nc("@button", "Downgrading..."); }
- else { return catalog.i18nc("@button", "Downgrade"); }
- }
- if (!(packageData.isInstalled || packageData.isToBeInstalled))
- {
- if (busy) { return catalog.i18nc("@button", "Installing..."); }
- else { return catalog.i18nc("@button", "Install"); }
- }
- else
- {
- return catalog.i18nc("@button", "Uninstall");
- }
- }
- onClicked: packageData.isInstalled || packageData.isToBeInstalled ? packageData.uninstall(): packageData.install()
- }
- ManageButton
- {
- id: updateManageButton
- visible: showUpdateButton && packageData.canUpdate && !packageData.isMissingPackageInformation
- enabled: !packageData.busy
- busy: packageData.busy
- Layout.alignment: Qt.AlignTop
- text: busy ? catalog.i18nc("@button", "Updating..."): catalog.i18nc("@button", "Update")
- onClicked: packageData.update()
- }
- }
- }
- }
|