File indexing completed on 2024-05-12 12:20:41
0001 // SPDX-FileCopyrightText: 2021 Tobias Leupold <tl at stonemx dot de> 0002 // SPDX-FileCopyrightText: 2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at> 0003 // 0004 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 0006 // Local includes 0007 #include "MetaDataDisplay.h" 0008 0009 // KDE includes 0010 #include <KLocalizedString> 0011 0012 // Qt includes 0013 #include <QDateTime> 0014 #include <QDebug> 0015 #include <QDesktopServices> 0016 #include <QDir> 0017 #include <QFileInfo> 0018 #include <QGridLayout> 0019 #include <QLabel> 0020 #include <QLocale> 0021 #include <QMimeDatabase> 0022 #include <QUrl> 0023 #include <QVBoxLayout> 0024 0025 static QString s_noPerm = QStringLiteral("-"); 0026 static const QMimeDatabase s_mimeDB; 0027 0028 Exif::MetaDataDisplay::MetaDataDisplay(QWidget *parent) 0029 : QWidget(parent) 0030 { 0031 auto *mainLayout = new QVBoxLayout(this); 0032 auto *layout = new QGridLayout; 0033 mainLayout->addLayout(layout); 0034 0035 int row = 0; 0036 0037 layout->addWidget(keyLabel(i18n("Absolute path:")), row, 0); 0038 m_absolutePath = valueLabel(); 0039 connect(m_absolutePath, &QLabel::linkActivated, this, &Exif::MetaDataDisplay::openDir); 0040 layout->addWidget(m_absolutePath, row++, 1); 0041 0042 layout->addWidget(keyLabel(i18n("MIME type:")), row, 0); 0043 m_mimeType = valueLabel(); 0044 layout->addWidget(m_mimeType, row++, 1); 0045 0046 layout->addWidget(keyLabel(i18n("Size:")), row, 0); 0047 m_size = valueLabel(); 0048 layout->addWidget(m_size, row++, 1); 0049 0050 layout->addWidget(keyLabel(i18n("Created:")), row, 0); 0051 m_created = valueLabel(); 0052 layout->addWidget(m_created, row++, 1); 0053 0054 layout->addWidget(keyLabel(i18n("Changed:")), row, 0); 0055 m_modified = valueLabel(); 0056 layout->addWidget(m_modified, row++, 1); 0057 0058 layout->addWidget(keyLabel(i18n("Owner:")), row, 0); 0059 m_owner = valueLabel(); 0060 layout->addWidget(m_owner, row++, 1); 0061 0062 layout->addWidget(keyLabel(i18n("Group:")), row, 0); 0063 m_group = valueLabel(); 0064 layout->addWidget(m_group, row++, 1); 0065 0066 layout->addWidget(keyLabel(i18n("Permissions:")), row, 0); 0067 m_permissions = valueLabel(); 0068 layout->addWidget(m_permissions, row++, 1); 0069 0070 mainLayout->addStretch(); 0071 } 0072 0073 QLabel *Exif::MetaDataDisplay::keyLabel(const QString &text) 0074 { 0075 auto *label = new QLabel; 0076 label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); 0077 label->setAlignment(Qt::AlignTop); 0078 label->setText(text); 0079 return label; 0080 } 0081 0082 QLabel *Exif::MetaDataDisplay::valueLabel() 0083 { 0084 auto *label = new QLabel; 0085 label->setWordWrap(true); 0086 label->setTextInteractionFlags(Qt::TextBrowserInteraction); 0087 return label; 0088 } 0089 0090 void Exif::MetaDataDisplay::setFileName(const QString &fileName) 0091 { 0092 const QFileInfo info(fileName); 0093 // This QLocale object should be able to be const, but due to QTBUG-71445, it can't be, 0094 // unless we depend on >= Qt 5.13. 0095 // FIXME: Make this const as soon as we depend on >= Qt 5.13 0096 QLocale locale; 0097 0098 m_fileDir = info.absoluteDir().canonicalPath(); 0099 0100 m_absolutePath->setText(QStringLiteral("%1<br/><a href=\"#\">%2</a>").arg(fileName, i18n("Open folder with a file manager"))); 0101 0102 m_mimeType->setText(s_mimeDB.mimeTypeForFile(fileName).name()); 0103 0104 const auto size = info.size(); 0105 m_size->setText(i18nc("File size composed of a pre-formatted (already localized) " 0106 "human-readable file size (%1) and the number of bytes (%2)", 0107 "%1 (%2 B)", locale.formattedDataSize(size), size)); 0108 0109 m_created->setText(locale.toString(info.birthTime())); 0110 0111 m_modified->setText(locale.toString(info.lastModified())); 0112 0113 m_owner->setText(info.owner()); 0114 0115 m_group->setText(info.group()); 0116 0117 const auto permissions = QFile::permissions(fileName); 0118 0119 // clang-format off 0120 QString parsedPermissions; 0121 parsedPermissions.append((permissions & QFile::ReadOwner) 0122 ? i18nc("File permission shortcut for \"reading allowed\"", "r") : s_noPerm); 0123 parsedPermissions.append((permissions & QFile::WriteOwner) 0124 ? i18nc("File permission shortcut for \"writing allowed\"", "w") : s_noPerm); 0125 parsedPermissions.append((permissions & QFile::ExeOwner) 0126 ? i18nc("File permission shortcut for \"executing allowed\"", "x") : s_noPerm); 0127 parsedPermissions.append((permissions & QFile::ReadGroup) 0128 ? i18nc("File permission shortcut for \"reading allowed\"", "r") : s_noPerm); 0129 parsedPermissions.append((permissions & QFile::WriteGroup) 0130 ? i18nc("File permission shortcut for \"writing allowed\"", "w") : s_noPerm); 0131 parsedPermissions.append((permissions & QFile::ExeGroup) 0132 ? i18nc("File permission shortcut for \"executing allowed\"", "x") : s_noPerm); 0133 parsedPermissions.append((permissions & QFile::ReadOther) 0134 ? i18nc("File permission shortcut for \"reading allowed\"", "r") : s_noPerm); 0135 parsedPermissions.append((permissions & QFile::WriteOther) 0136 ? i18nc("File permission shortcut for \"writing allowed\"", "w") : s_noPerm); 0137 parsedPermissions.append((permissions & QFile::ExeOther) 0138 ? i18nc("File permission shortcut for \"executing allowed\"", "x") : s_noPerm); 0139 0140 auto hex = 0x0000; 0141 if (permissions & QFile::ReadOwner) { hex |= QFile::ReadOwner; } 0142 if (permissions & QFile::WriteOwner) { hex |= QFile::WriteOwner; } 0143 if (permissions & QFile::ExeOwner) { hex |= QFile::ExeOwner; } 0144 if (permissions & QFile::ReadGroup) { hex |= QFile::ReadGroup; } 0145 if (permissions & QFile::WriteGroup) { hex |= QFile::WriteGroup; } 0146 if (permissions & QFile::ExeGroup) { hex |= QFile::ExeGroup; } 0147 if (permissions & QFile::ReadOther) { hex |= QFile::ReadOther; } 0148 if (permissions & QFile::WriteOther) { hex |= QFile::WriteOther; } 0149 if (permissions & QFile::ExeOther) { hex |= QFile::ExeOther; } 0150 // clang-format on 0151 0152 auto octalPermissions = QString::number(hex, 16); 0153 octalPermissions = octalPermissions.remove(1, 1).prepend(QStringLiteral("0")); 0154 0155 m_permissions->setText(i18nc("File permissions string compiled from a parsed variant (e.g. " 0156 "\"rw-rw-r--\", %1) and it's octal representation (e.g. \"0644\")", 0157 "%1 (%2)", parsedPermissions, octalPermissions)); 0158 } 0159 0160 void Exif::MetaDataDisplay::openDir() 0161 { 0162 QDesktopServices::openUrl(QUrl::fromLocalFile(m_fileDir)); 0163 } 0164 0165 #include "moc_MetaDataDisplay.cpp"