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

0001 /*
0002    SPDX-FileCopyrightText: 2017 (c) Alexander Stippich <a.stippich@gmx.net>
0003    SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0004    SPDX-FileCopyrightText: 2020 (c) Devin Lin <espidev@gmail.com>
0005 
0006    SPDX-License-Identifier: LGPL-3.0-or-later
0007  */
0008 
0009 
0010 import QtQuick 2.7
0011 import QtQuick.Controls 2.2
0012 import QtQuick.Window 2.2
0013 import QtQml.Models 2.2
0014 import QtQuick.Layouts 1.2
0015 import QtQuick.Dialogs as Dialogs
0016 
0017 import org.kde.kirigami 2.13 as Kirigami
0018 import org.kde.elisa 1.0
0019 
0020 Kirigami.FormLayout {
0021     id: form
0022     property var metadataModel
0023 
0024     property var modelType
0025     property bool showDeleteButton
0026     property bool isCreating
0027     property bool isModifying
0028     property bool canAddMoreMetadata
0029     property alias imageItem: imageParent
0030     property alias showImage: imageParent.visible
0031 
0032     signal close()
0033 
0034     function apply() {
0035         metadataModel.saveData()
0036         isCreating = false
0037         isModifying = false
0038     }
0039 
0040     function applyAndClose() {
0041         apply()
0042         close()
0043     }
0044 
0045     function cancel() {
0046         metadataModel.resetData()
0047         isCreating = false
0048         isModifying = false
0049     }
0050 
0051     function cancelAndClose() {
0052         cancel()
0053         close()
0054     }
0055 
0056     function deleteItem() {
0057         ElisaApplication.musicManager.deleteElementById(modelType, metadataModel.databaseId)
0058         metadataModel.resetData() // Need this otherwise the closing dialog appears if the data has been modified
0059         close()
0060     }
0061 
0062     readonly property Dialogs.MessageDialog dirtyClosingDialog: Dialogs.MessageDialog {
0063         id: dirtyClosingDialog
0064 
0065         title: i18nc("@title:window", "Warning")
0066         text: i18nc("@info", 'You have unsaved changes. Do you want to apply the changes or discard them?')
0067         buttons: Dialogs.MessageDialog.Save | Dialogs.MessageDialog.Discard | Dialogs.MessageDialog.Cancel
0068 
0069         onButtonClicked: (button, role) => {
0070             switch(button) {
0071                 case Dialogs.MessageDialog.Save: {
0072                     form.metadataModel.saveData()
0073                     form.close()
0074                 }
0075                 case Dialogs.MessageDialog.Discard: {
0076                     form.metadataModel.resetData()
0077                     form.close()
0078                 }
0079             }
0080             close()
0081         }
0082     }
0083 
0084     Kirigami.InlineMessage {
0085         id: formInvalidNotification
0086 
0087         text: i18nc("@label", "Data is not valid. %1", metadataModel.errorMessage)
0088         type: Kirigami.MessageType.Error
0089         showCloseButton: false
0090         visible: !metadataModel.isDataValid && metadataModel.isDirty
0091 
0092         Layout.topMargin: Kirigami.Units.largeSpacing
0093         Layout.fillWidth: true
0094         Layout.rightMargin: Kirigami.Units.largeSpacing
0095         Layout.leftMargin: Kirigami.Units.largeSpacing
0096     }
0097 
0098     Item {
0099         id: imageParent
0100         implicitHeight: elisaTheme.coverImageSize
0101         implicitWidth: elisaTheme.coverImageSize
0102 
0103         ImageWithFallback {
0104             id: metadataImage
0105 
0106             source: metadataModel.coverUrl
0107             fallback: Qt.resolvedUrl(elisaTheme.defaultAlbumImage)
0108 
0109             sourceSize.width: elisaTheme.coverImageSize * Screen.devicePixelRatio
0110             sourceSize.height: elisaTheme.coverImageSize * Screen.devicePixelRatio
0111 
0112             fillMode: Image.PreserveAspectFit
0113             anchors.fill: parent
0114         }
0115     }
0116 
0117     // metadata rows
0118     Repeater {
0119         model: metadataModel
0120 
0121         delegate: RowLayout {
0122             readonly property string formLabelText: i18nc("Track metadata form label, e.g. 'Artist:'", "%1:", model.name)
0123             // Make labels bold on mobile read-only mode to help differentiate label from metadata
0124             readonly property bool singleColumnPlainText: !form.wideMode && !form.isCreating && !form.isModifying
0125             Kirigami.FormData.label: singleColumnPlainText ? "<b>" + formLabelText + "</b>" : formLabelText
0126 
0127             MediaTrackMetadataDelegate {
0128                 index: model.index
0129                 name: model.name
0130                 display: model.display
0131                 type: model.type
0132                 isRemovable: model.isRemovable
0133 
0134                 onEdited: model.display = display
0135                 readOnly: (!isModifying && !isCreating) || (metadataModel.isReadOnly || model.isReadOnly)
0136 
0137                 onDeleteField: metadataModel.removeData(model.index)
0138                 Layout.minimumHeight: Kirigami.Units.gridUnit * 1.5
0139             }
0140         }
0141     }
0142 
0143     // add tag row
0144     ComboBox {
0145         id: selectedField
0146         Kirigami.FormData.label: i18nc("@label:listbox", "Add new tag:")
0147         visible: isModifying && !metadataModel.isReadOnly && canAddMoreMetadata
0148 
0149         textRole: "modelData"
0150         valueRole: "modelData"
0151 
0152         model: metadataModel.extraMetadata
0153         enabled: metadataModel.extraMetadata.length
0154 
0155         onActivated: metadataModel.addData(selectedField.currentValue)
0156     }
0157 }