Warning, /graphics/koko/src/qml/InfoDrawerSidebarBase.qml is written in an unsupported language. File is not indexed.

0001 /* SPDX-FileCopyrightText: 2021 Carl Schwan <carlschwan@kde.org>
0002  * SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
0003  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0004  */
0005 
0006 import QtQuick 2.15
0007 import QtQml 2.15
0008 import QtQuick.Window 2.15
0009 import QtQuick.Templates 2.15 as T
0010 import QtQuick.Controls 2.15 as QQC2
0011 import QtQuick.Layouts 1.15
0012 import org.kde.kirigami 2.19 as Kirigami
0013 import org.kde.koko 0.1 as Koko
0014 import org.kde.coreaddons 1.0 as KCA
0015 import org.kde.koko.private 0.1 as KokoPrivate
0016 
0017 Flickable {
0018     id: flickable
0019     required property Koko.Exiv2Extractor extractor
0020     implicitWidth: column.implicitWidth + leftMargin + rightMargin
0021     implicitHeight: contentHeight + topMargin + bottomMargin
0022     contentWidth: width - leftMargin - rightMargin
0023     contentHeight: column.implicitHeight
0024     leftMargin: Kirigami.Units.largeSpacing
0025     rightMargin: Kirigami.Units.largeSpacing
0026     topMargin: Kirigami.Units.largeSpacing
0027     bottomMargin: Kirigami.Units.largeSpacing
0028     clip: true
0029     boundsBehavior: Flickable.StopAtBounds
0030     pixelAligned: true
0031     Kirigami.WheelHandler { target: flickable }
0032     ColumnLayout {
0033         id: column
0034         property real availableWidth: width - leftPadding - rightPadding
0035         spacing: Kirigami.Units.smallSpacing
0036         width: parent.width
0037         focus: true
0038         Kirigami.Heading {
0039             Layout.fillWidth: true
0040             level: 4
0041             topPadding: Kirigami.Units.smallSpacing
0042             text: i18n("File Name")
0043         }
0044         QQC2.Label {
0045             Layout.fillWidth: true
0046             text: flickable.extractor.simplifiedPath
0047             wrapMode: Text.Wrap
0048         }
0049         Kirigami.Heading {
0050             Layout.fillWidth: true
0051             level: 4
0052             text: i18n("Dimension")
0053             topPadding: Kirigami.Units.smallSpacing
0054             visible: flickable.extractor.width > 0 && flickable.extractor.height > 0
0055         }
0056         QQC2.Label {
0057             Layout.fillWidth: true
0058             text: i18nc("dimensions", "%1 x %2", flickable.extractor.width, flickable.extractor.height)
0059             visible: flickable.extractor.width > 0 && flickable.extractor.height > 0
0060         }
0061         Kirigami.Heading {
0062             Layout.fillWidth: true
0063             level: 4
0064             text: i18n("Size")
0065             topPadding: Kirigami.Units.smallSpacing
0066             visible: flickable.extractor.size !== 0
0067         }
0068         QQC2.Label {
0069             Layout.fillWidth: true
0070             text: KCA.Format.formatByteSize(flickable.extractor.size, 2)
0071             visible: flickable.extractor.size !== 0
0072         }
0073         Kirigami.Heading {
0074             Layout.fillWidth: true
0075             level: 4
0076             text: i18n("Created")
0077             topPadding: Kirigami.Units.smallSpacing
0078             visible: flickable.extractor.time.length > 0
0079         }
0080         QQC2.Label {
0081             Layout.fillWidth: true
0082             text: flickable.extractor.time
0083             visible: flickable.extractor.time.length > 0
0084         }
0085         Kirigami.Heading {
0086             Layout.fillWidth: true
0087             level: 4
0088             text: i18n("Model")
0089             topPadding: Kirigami.Units.smallSpacing
0090             visible: flickable.extractor.model.length > 0
0091         }
0092         QQC2.Label {
0093             Layout.fillWidth: true
0094             text: flickable.extractor.model
0095             visible: flickable.extractor.model.length > 0
0096         }
0097         Kirigami.Heading {
0098             Layout.fillWidth: true
0099             level: 4
0100             text: i18n("Latitude")
0101             topPadding: Kirigami.Units.smallSpacing
0102             visible: flickable.extractor.gpsLatitude !== 0
0103         }
0104         QQC2.Label {
0105             Layout.fillWidth: true
0106             text: flickable.extractor.gpsLatitude
0107             visible: flickable.extractor.gpsLatitude !== 0
0108         }
0109         Kirigami.Heading {
0110             Layout.fillWidth: true
0111             level: 4
0112             text: i18n("Longitude")
0113             topPadding: Kirigami.Units.smallSpacing
0114             visible: flickable.extractor.gpsLongitude !== 0
0115         }
0116         QQC2.Label {
0117             Layout.fillWidth: true
0118             text: flickable.extractor.gpsLongitude
0119             visible: flickable.extractor.gpsLongitude !== 0
0120         }
0121         Kirigami.Heading {
0122             Layout.fillWidth: true
0123             level: 4
0124             text: i18n("Rating")
0125             topPadding: Kirigami.Units.smallSpacing
0126         }
0127         Row {
0128             // stars look disconnected with higher spacing
0129             spacing: Kirigami.Settings.isMobile ? Kirigami.Units.smallSpacing : Math.round(Kirigami.Units.smallSpacing / 4)
0130             Accessible.role: Accessible.List
0131             Accessible.name: i18n("Current rating %1", flickable.extractor.rating)
0132             Repeater {
0133                 model: [ 1, 3, 5, 7, 9 ]
0134                 QQC2.AbstractButton {
0135                     activeFocusOnTab: true
0136                     width: height
0137                     height: Kirigami.Units.iconSizes.smallMedium
0138                     text: i18n("Set rating to %1", ratingTo)
0139                     property int ratingTo: {
0140                         if (flickable.extractor.rating == modelData + 1) {
0141                             return modelData
0142                         } else if (flickable.extractor.rating == modelData) {
0143                             return modelData - 1
0144                         } else {
0145                             return modelData + 1
0146                         }
0147                     }
0148                     contentItem: Kirigami.Icon {
0149                         source: flickable.extractor.rating > modelData ? "rating" :
0150                                 flickable.extractor.rating < modelData ? "rating-unrated" : "rating-half"
0151                         width: parent.width
0152                         height: parent.height
0153                         color: (parent.focusReason == Qt.TabFocusReason || parent.focusReason == Qt.BacktabFocusReason) && parent.activeFocus ? Kirigami.Theme.highlightColor : Kirigami.Theme.textColor
0154                     }
0155                     onClicked: {
0156                         flickable.extractor.rating = ratingTo
0157                     }
0158                 }
0159             }
0160         }
0161         Kirigami.Heading {
0162             Layout.fillWidth: true
0163             level: 4
0164             text: i18n("Description")
0165             topPadding: Kirigami.Units.smallSpacing
0166         }
0167         QQC2.TextArea {
0168             id: imageDescription
0169             text: flickable.extractor.description
0170             Layout.fillWidth: true
0171             verticalAlignment: Qt.AlignTop
0172             placeholderText: i18n("Image description…")
0173             KeyNavigation.priority: KeyNavigation.BeforeItem
0174             Keys.onTabPressed: nextItemInFocusChain().forceActiveFocus(Qt.TabFocusReason)
0175             onEditingFinished: {
0176                 flickable.extractor.description = text
0177             }
0178         }
0179         Kirigami.Heading {
0180             Layout.fillWidth: true
0181             level: 4
0182             text: i18n("Tags")
0183             topPadding: Kirigami.Units.smallSpacing
0184         }
0185         RowLayout {
0186             id: tagInputLayout
0187             spacing: Kirigami.Units.smallSpacing
0188             Layout.fillWidth: true
0189             TagInput {
0190                 id: tagInput
0191                 Layout.fillWidth: true
0192                 extractor: flickable.extractor
0193             }
0194             QQC2.Button {
0195                 enabled: tagInput.editText
0196                 display: QQC2.AbstractButton.IconOnly
0197                 icon.name: "list-add"
0198                 text: i18n("Add Tag")
0199                 onClicked: tagInput.accepted()
0200             }
0201         }
0202         Flow {
0203             Layout.preferredWidth: tagInputLayout.implicitWidth
0204             Layout.fillWidth: true
0205             spacing: Kirigami.Units.largeSpacing
0206             Repeater {
0207                 model: flickable.extractor.tags
0208                 Kirigami.Chip {
0209                     text: modelData
0210                     onRemoved: {
0211                         const index = flickable.extractor.tags.indexOf(modelData)
0212                         if (index > -1) {
0213                             flickable.extractor.tags.splice(index, 1)
0214                         }
0215                     }
0216                 }
0217             }
0218         }
0219     }
0220 }