File indexing completed on 2024-04-28 04:21:03

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"