Warning, /multimedia/elisa/src/qml/MediaTrackMetadataDelegate.qml is written in an unsupported language. File is not indexed.

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003    SPDX-FileCopyrightText: 2020 (c) Devin Lin <espidev@gmail.com>
0004 
0005    SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 import QtQuick 2.10
0009 import QtQuick.Controls 2.2
0010 import QtQuick.Layouts 1.2
0011 import org.kde.kirigami 2.5 as Kirigami
0012 import org.kde.elisa 1.0
0013 
0014 RowLayout {
0015     id: delegateRow
0016     property real maximumWidth: Number.POSITIVE_INFINITY
0017 
0018     property string name
0019     property int index
0020     property var type
0021     property var display
0022     property bool isRemovable
0023     property bool readOnly
0024     property string url
0025 
0026     spacing: 0
0027 
0028     signal edited()
0029     signal deleteField()
0030 
0031     Loader {
0032         id: textDisplayLoader
0033         active: readOnly && (type === EditableTrackMetadataModel.TextEntry || type === EditableTrackMetadataModel.IntegerEntry || type === EditableTrackMetadataModel.UrlEntry || type === EditableTrackMetadataModel.DurationEntry) && typeof display !== "undefined"
0034         visible: active
0035         Layout.maximumWidth: Math.min(Kirigami.Units.gridUnit * 20, delegateRow.maximumWidth)
0036 
0037         sourceComponent: LabelWithToolTip {
0038             text: display
0039             horizontalAlignment: Text.AlignLeft
0040             elide: Text.ElideRight
0041             wrapMode: Text.WordWrap
0042         }
0043     }
0044 
0045     Loader {
0046         id: longTextDisplayLoader
0047         active: readOnly && (type === EditableTrackMetadataModel.LongTextEntry) && typeof display !== "undefined"
0048         visible: active
0049         Layout.maximumWidth: Math.min(Kirigami.Units.gridUnit * 20, delegateRow.maximumWidth)
0050 
0051         sourceComponent: Label {
0052             text: display
0053             textFormat: Text.PlainText
0054             horizontalAlignment: Text.AlignLeft
0055             elide: Text.ElideRight
0056             wrapMode: Text.WordWrap
0057         }
0058     }
0059 
0060     Loader {
0061         active: readOnly && (type === EditableTrackMetadataModel.DateEntry) && typeof display !== "undefined"
0062         visible: active
0063         Layout.maximumWidth: Math.min(Kirigami.Units.gridUnit * 20, delegateRow.maximumWidth)
0064 
0065         sourceComponent: LabelWithToolTip {
0066             text: rawDate.toLocaleDateString(Locale.ShortFormat)
0067 
0068             horizontalAlignment: Text.AlignLeft
0069             elide: Text.ElideRight
0070             property date rawDate: new Date(display)
0071         }
0072     }
0073 
0074     Loader {
0075         id: editTextDisplayLoader
0076 
0077         focus: index === 0
0078 
0079         active: !readOnly && (type === EditableTrackMetadataModel.TextEntry || type === EditableTrackMetadataModel.UrlEntry || type === EditableTrackMetadataModel.IntegerEntry)
0080         visible: active
0081 
0082         sourceComponent: TextField {
0083             enabled: !delegateRow.readOnly
0084             text: display
0085 
0086             focus: index === 0
0087 
0088             horizontalAlignment: Text.AlignLeft
0089 
0090             onTextEdited: {
0091                 if (display !== text) {
0092                     display = text
0093 
0094                     edited()
0095                 }
0096             }
0097         }
0098     }
0099 
0100     Loader {
0101         focus: index === 0
0102 
0103         active: type === EditableTrackMetadataModel.RatingEntry && typeof display !== "undefined"
0104         visible: active
0105 
0106         sourceComponent: ElisaApplication.useFavoriteStyleRatings ? favoriteButton : ratingStars
0107 
0108         Component {
0109             id: ratingStars
0110 
0111             RatingStar {
0112                 starRating: delegateRow.display
0113 
0114                 readOnly: delegateRow.readOnly
0115 
0116                 anchors.verticalCenter: parent.verticalCenter
0117 
0118                 onRatingEdited: {
0119                     if (display !== starRating) {
0120                         display = starRating
0121                         ElisaApplication.musicManager.updateSingleFileMetaData(url, DataTypes.RatingRole, starRating)
0122                         edited()
0123                     }
0124                 }
0125             }
0126         }
0127 
0128         Component {
0129             id: favoriteButton
0130 
0131             FlatButtonWithToolTip {
0132                 readonly property bool isFavorite: delegateRow.display === 10
0133 
0134                 text: isFavorite ? i18nc("@action:button", "Un-mark this song as a favorite") : i18nc("@action:button", "Mark this song as a favorite")
0135                 icon.name: isFavorite ? "rating" : "rating-unrated"
0136 
0137                 onClicked: {
0138                     const newRating = isFavorite ? 0 : 10;
0139                     // Change icon immediately in case backend is slow
0140                     icon.name = isFavorite ? "rating-unrated" : "rating";
0141                     ElisaApplication.musicManager.updateSingleFileMetaData(url, DataTypes.RatingRole, newRating)
0142                     edited()
0143                 }
0144             }
0145         }
0146     }
0147 
0148     Loader {
0149         id: editLongTextDisplayLoader
0150 
0151         active: !readOnly && (type === EditableTrackMetadataModel.LongTextEntry)
0152         visible: active
0153         Layout.maximumHeight: Kirigami.Units.gridUnit * 10
0154         Layout.minimumWidth: Kirigami.Units.gridUnit * 8
0155 
0156         sourceComponent: ScrollView {
0157             TextArea {
0158                 enabled: !delegateRow.readOnly
0159                 text: display
0160 
0161                 focus: index === 0
0162 
0163                 horizontalAlignment: TextEdit.AlignLeft
0164 
0165                 selectByMouse: true
0166 
0167                 wrapMode: TextEdit.Wrap
0168 
0169                 onEditingFinished: {
0170                     if (display !== text) {
0171                         display = text
0172 
0173                         edited()
0174                     }
0175                 }
0176             }
0177         }
0178     }
0179 
0180     FlatButtonWithToolTip {
0181         Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium
0182         Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium
0183 
0184         icon.name: 'delete'
0185         text: i18nc("@action:button remove a metadata tag", "Remove this tag")
0186 
0187         visible: !readOnly && isRemovable
0188         onClicked: deleteField()
0189     }
0190 }
0191