Warning, /frameworks/knewstuff/src/qtquick/qml/EntryDetails.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2019 Dan Leinir Turthra Jensen <admin@leinir.dk> 0003 SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 */ 0007 0008 /** 0009 * @brief A Kirigami.Page component used for displaying the details for a single entry 0010 * 0011 * This component is equivalent to the details view in the old DownloadDialog 0012 * @see KNewStuff::DownloadDialog 0013 * @since 5.63 0014 */ 0015 0016 import QtQuick 0017 import QtQuick.Controls as QQC2 0018 import QtQuick.Layouts 0019 0020 import org.kde.kirigami 2 as Kirigami 0021 import org.kde.kcmutils as KCM 0022 import org.kde.newstuff as NewStuff 0023 0024 import "private" as Private 0025 0026 KCM.SimpleKCM { 0027 id: component 0028 0029 property QtObject newStuffModel 0030 property var entry 0031 0032 property string name 0033 property var author 0034 property alias shortSummary: shortSummaryItem.text 0035 property alias summary: summaryItem.text 0036 property alias previews: screenshotsItem.screenshotsModel 0037 property string homepage 0038 property string donationLink 0039 property int status 0040 property int commentsCount 0041 property int rating 0042 property int downloadCount 0043 property var downloadLinks 0044 property string providerId 0045 property int entryType 0046 0047 Component.onCompleted: { 0048 updateContents(); 0049 newStuffModel.engine.updateEntryContents(component.entry); 0050 } 0051 0052 Connections { 0053 target: newStuffModel 0054 function onEntryChanged(changedEntry) { 0055 if (entry === changedEntry) { 0056 updateContents(); 0057 } 0058 } 0059 } 0060 0061 function updateContents() { 0062 component.providerId = entry.providerId; 0063 component.status = entry.status; 0064 0065 component.author = entry.author; 0066 component.name = entry.name; 0067 component.shortSummary = entry.shortSummary; 0068 component.summary = entry.summary; 0069 component.homepage = entry.homepage; 0070 component.donationLink = entry.donationLink; 0071 component.status = entry.status; 0072 component.commentsCount = entry.numberOfComments; 0073 component.rating = entry.rating; 0074 component.downloadCount = entry.downloadCount; 0075 0076 const modelIndex = newStuffModel.index(newStuffModel.indexOfEntry(entry), 0); 0077 component.previews = newStuffModel.data(modelIndex, NewStuff.ItemsModel.PreviewsRole); 0078 component.downloadLinks = newStuffModel.data(modelIndex, NewStuff.ItemsModel.DownloadLinksRole); 0079 0080 } 0081 0082 NewStuff.DownloadItemsSheet { 0083 id: downloadItemsSheet 0084 0085 onItemPicked: { 0086 const entryName = newStuffModel.data(newStuffModel.index(entryId, 0), NewStuff.ItemsModel.NameRole); 0087 applicationWindow().showPassiveNotification(i18ndc("knewstuff6", "A passive notification shown when installation of an item is initiated", "Installing %1 from %2", downloadName, entryName), 1500); 0088 newStuffModel.engine.install(component.entry, downloadItemId); 0089 } 0090 } 0091 0092 Private.ErrorDisplayer { 0093 engine: component.newStuffModel.engine 0094 active: component.isCurrentPage 0095 } 0096 0097 NewStuff.Author { 0098 id: entryAuthor 0099 engine: component.newStuffModel.engine 0100 providerId: component.providerId 0101 username: author.name 0102 } 0103 0104 title: i18ndc("knewstuff6", "Combined title for the entry details page made of the name of the entry, and the author's name", "%1 by %2", component.name, entryAuthor.name) 0105 0106 actions: [ 0107 Kirigami.Action { 0108 text: component.downloadLinks.length == 1 ? i18ndc("knewstuff6", "Request installation of this item, available when there is exactly one downloadable item", "Install") : i18ndc("knewstuff6", "Show installation options, where there is more than one downloadable item", "Install…") 0109 icon.name: "install" 0110 onTriggered: { 0111 if (component.downloadLinks.length == 1) { 0112 newStuffModel.engine.install(component.entry, NewStuff.ItemsModel.FirstLinkId); 0113 } else { 0114 downloadItemsSheet.downloadLinks = component.downloadLinks; 0115 downloadItemsSheet.entry = component.index; 0116 downloadItemsSheet.open(); 0117 } 0118 } 0119 enabled: component.status == NewStuff.Entry.Downloadable || component.status == NewStuff.Entry.Deleted 0120 visible: enabled 0121 }, 0122 Kirigami.Action { 0123 text: i18ndc("knewstuff6", "Request updating of this item", "Update") 0124 icon.name: "update-none" 0125 onTriggered: newStuffModel.update(component.entry, NewStuff.ItemsModel.AutoDetectLinkId) 0126 enabled: component.status == NewStuff.Entry.Updateable 0127 visible: enabled 0128 }, 0129 Kirigami.Action { 0130 text: i18ndc("knewstuff6", "Request uninstallation of this item", "Uninstall") 0131 icon.name: "edit-delete" 0132 onTriggered: newStuffModel.engine.uninstall(component.entry) 0133 enabled: component.status == NewStuff.Entry.Installed || component.status == NewStuff.Entry.Updateable 0134 visible: enabled 0135 } 0136 ] 0137 0138 ColumnLayout { 0139 spacing: Kirigami.Units.smallSpacing 0140 0141 Kirigami.AbstractCard { 0142 id: statusCard 0143 0144 readonly property string message: { 0145 switch (component.status) { 0146 case NewStuff.Entry.Downloadable: 0147 case NewStuff.Entry.Installed: 0148 case NewStuff.Entry.Updateable: 0149 case NewStuff.Entry.Deleted: 0150 return ""; 0151 case NewStuff.Entry.Installing: 0152 return i18ndc("knewstuff6", "Status message to be shown when the entry is in the process of being installed OR uninstalled", "Currently working on the item %1 by %2. Please wait…", component.name, entryAuthor.name); 0153 case NewStuff.Entry.Updating: 0154 return i18ndc("knewstuff6", "Status message to be shown when the entry is in the process of being updated", "Currently updating the item %1 by %2. Please wait…", component.name, entryAuthor.name); 0155 default: 0156 return i18ndc("knewstuff6", "Status message which should only be shown when the entry has been given some unknown or invalid status.", "This item is currently in an invalid or unknown state. <a href=\"https://bugs.kde.org/enter_bug.cgi?product=frameworks-knewstuff\">Please report this to the KDE Community in a bug report</a>."); 0157 } 0158 } 0159 0160 visible: opacity > 0 0161 opacity: message.length > 0 ? 1 : 0 0162 0163 Behavior on opacity { 0164 NumberAnimation { 0165 duration: Kirigami.Units.longDuration 0166 } 0167 } 0168 0169 Layout.fillWidth: true 0170 Layout.margins: Kirigami.Units.largeSpacing 0171 0172 contentItem: RowLayout { 0173 Layout.fillWidth: true 0174 spacing: Kirigami.Units.smallSpacing 0175 0176 QQC2.Label { 0177 Layout.fillWidth: true 0178 text: statusCard.message 0179 wrapMode: Text.Wrap 0180 onLinkActivated: Qt.openUrlExternally(link); 0181 } 0182 0183 QQC2.BusyIndicator { 0184 running: statusCard.opacity > 0 0185 } 0186 } 0187 } 0188 0189 Item { 0190 Layout.fillWidth: true 0191 height: Kirigami.Units.gridUnit * 3 0192 } 0193 0194 Private.EntryScreenshots { 0195 id: screenshotsItem 0196 Layout.fillWidth: true 0197 } 0198 0199 Kirigami.Heading { 0200 id: shortSummaryItem 0201 wrapMode: Text.Wrap 0202 Layout.fillWidth: true 0203 } 0204 0205 Kirigami.FormLayout { 0206 Layout.fillWidth: true 0207 0208 Kirigami.LinkButton { 0209 Kirigami.FormData.label: i18nd("knewstuff6", "Comments and Reviews:") 0210 enabled: component.commentsCount > 0 0211 text: i18ndc("knewstuff6", "A link which, when clicked, opens a new sub page with comments (comments with or without ratings) for this entry", "%1 Reviews and Comments", component.commentsCount) 0212 onClicked: pageStack.push(commentsPage) 0213 } 0214 0215 Private.Rating { 0216 id: ratingsItem 0217 Kirigami.FormData.label: i18nd("knewstuff6", "Rating:") 0218 rating: component.rating 0219 } 0220 0221 Kirigami.UrlButton { 0222 Kirigami.FormData.label: i18nd("knewstuff6", "Homepage:") 0223 text: i18ndc("knewstuff6", "A link which, when clicked, opens the website associated with the entry (this could be either one specific to the project, the author's homepage, or any other website they have chosen for the purpose)", "Open the homepage for %1", component.name) 0224 url: component.homepage 0225 visible: component.homepage 0226 } 0227 0228 Kirigami.UrlButton { 0229 Kirigami.FormData.label: i18nd("knewstuff6", "How To Donate:") 0230 text: i18ndc("knewstuff6", "A link which, when clicked, opens a website with information on donation in support of the entry", "Find out how to donate to this project") 0231 url: component.donationLink 0232 visible: component.donationLink 0233 } 0234 } 0235 0236 Kirigami.SelectableLabel { 0237 id: summaryItem 0238 0239 Layout.fillWidth: true 0240 Layout.margins: Kirigami.Units.largeSpacing 0241 0242 textFormat: Text.RichText 0243 } 0244 0245 Component { 0246 id: commentsPage 0247 0248 Private.EntryCommentsPage { 0249 itemsModel: component.newStuffModel 0250 entry: component.entry 0251 entryName: component.name 0252 entryAuthorId: component.author.name 0253 entryProviderId: component.providerId 0254 } 0255 } 0256 } 0257 }