| 1 | /* |
| 2 | This file is part of the KFileMetaData project |
| 3 | SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL |
| 6 | */ |
| 7 | |
| 8 | #include "propertyinfo.h" |
| 9 | |
| 10 | #include <KLazyLocalizedString> |
| 11 | #include <KLocalizedString> |
| 12 | |
| 13 | #include "formatstrings_p.h" |
| 14 | #include "icnamematch_p.h" |
| 15 | |
| 16 | #include <array> |
| 17 | |
| 18 | #include <QLocale> |
| 19 | |
| 20 | using namespace KFileMetaData; |
| 21 | |
| 22 | class KFileMetaData::PropertyInfoData |
| 23 | { |
| 24 | using FormatFunction = QString (&)(const QVariant&); |
| 25 | |
| 26 | public: |
| 27 | const Property::Property prop; |
| 28 | const bool shouldBeIndexed = false; |
| 29 | const QString name; |
| 30 | const KLazyLocalizedString displayName; |
| 31 | const QMetaType::Type valueType = QMetaType::UnknownType; |
| 32 | const FormatFunction formatAsString = FormatStrings::toStringFunction; |
| 33 | |
| 34 | static constexpr auto fromId(Property::Property property) -> const PropertyInfoData*; |
| 35 | static auto fromName(const QString& name) -> const PropertyInfoData*; |
| 36 | |
| 37 | static const PropertyInfoData s_Empty; |
| 38 | static const std::array<PropertyInfoData, 83> s_allProperties; |
| 39 | static const QHash<LcIdentifierName, const PropertyInfoData*> s_propertyHash; |
| 40 | }; |
| 41 | |
| 42 | const PropertyInfoData PropertyInfoData::s_Empty{ .prop: Property::Empty, .shouldBeIndexed: false, QStringLiteral("empty" ), .displayName: kli18nc(context: "@label" , text: "Empty" ) }; |
| 43 | |
| 44 | const std::array<PropertyInfoData, 83> PropertyInfoData::s_allProperties |
| 45 | { |
| 46 | PropertyInfoData{ .prop: Property::AssistiveAlternateDescription, .shouldBeIndexed: true, QStringLiteral("assistiveDescription" ), .displayName: kli18nc(context: "@label accessible alt text" , text: "Assistive Description" ), .valueType: QMetaType::QString }, |
| 47 | PropertyInfoData{ .prop: Property::Album, .shouldBeIndexed: true, QStringLiteral("album" ), .displayName: kli18nc(context: "@label music album" , text: "Album" ), .valueType: QMetaType::QString }, |
| 48 | PropertyInfoData{ .prop: Property::AlbumArtist, .shouldBeIndexed: true, QStringLiteral("albumArtist" ), .displayName: kli18nc(context: "@label" , text: "Album Artist" ), .valueType: QMetaType::QString }, |
| 49 | PropertyInfoData{ .prop: Property::Artist, .shouldBeIndexed: true, QStringLiteral("artist" ), .displayName: kli18nc(context: "@label" , text: "Artist" ), .valueType: QMetaType::QString }, |
| 50 | PropertyInfoData{ .prop: Property::AspectRatio, .shouldBeIndexed: false, QStringLiteral("aspectRatio" ), .displayName: kli18nc(context: "@label" , text: "Aspect Ratio" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAspectRatio }, |
| 51 | PropertyInfoData{ .prop: Property::Author, .shouldBeIndexed: true, QStringLiteral("author" ), .displayName: kli18nc(context: "@label" , text: "Author" ), .valueType: QMetaType::QString }, |
| 52 | PropertyInfoData{ .prop: Property::BitRate, .shouldBeIndexed: false, QStringLiteral("bitRate" ), .displayName: kli18nc(context: "@label" , text: "Bitrate" ), .valueType: QMetaType::Int, .formatAsString: FormatStrings::formatBitRate }, |
| 53 | PropertyInfoData{ .prop: Property::Channels, .shouldBeIndexed: false, QStringLiteral("channels" ), .displayName: kli18nc(context: "@label" , text: "Channels" ), .valueType: QMetaType::Int }, |
| 54 | PropertyInfoData{ .prop: Property::Comment, .shouldBeIndexed: false, QStringLiteral("comment" ), .displayName: kli18nc(context: "@label" , text: "Comment" ), .valueType: QMetaType::QString }, |
| 55 | PropertyInfoData{ .prop: Property::Description, .shouldBeIndexed: false, QStringLiteral("description" ), .displayName: kli18nc(context: "@label" , text: "Description" ), .valueType: QMetaType::QString }, |
| 56 | PropertyInfoData{ .prop: Property::Composer, .shouldBeIndexed: true, QStringLiteral("composer" ), .displayName: kli18nc(context: "@label" , text: "Composer" ), .valueType: QMetaType::QString }, |
| 57 | PropertyInfoData{ .prop: Property::Copyright, .shouldBeIndexed: false, QStringLiteral("copyright" ), .displayName: kli18nc(context: "@label" , text: "Copyright" ), .valueType: QMetaType::QString }, |
| 58 | PropertyInfoData{ .prop: Property::CreationDate, .shouldBeIndexed: false, QStringLiteral("creationDate" ), .displayName: kli18nc(context: "@label" , text: "Creation Date" ), .valueType: QMetaType::QDateTime, .formatAsString: FormatStrings::formatDate }, |
| 59 | PropertyInfoData{ .prop: Property::Duration, .shouldBeIndexed: false, QStringLiteral("duration" ), .displayName: kli18nc(context: "@label" , text: "Duration" ), .valueType: QMetaType::Int, .formatAsString: FormatStrings::formatDuration }, |
| 60 | PropertyInfoData{ .prop: Property::FrameRate, .shouldBeIndexed: false, QStringLiteral("frameRate" ), .displayName: kli18nc(context: "@label" , text: "Frame Rate" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsFrameRate }, |
| 61 | PropertyInfoData{ .prop: Property::Generator, .shouldBeIndexed: false, QStringLiteral("generator" ), .displayName: kli18nc(context: "@label" , text: "Document Generated By" ), .valueType: QMetaType::QString }, |
| 62 | PropertyInfoData{ .prop: Property::Genre, .shouldBeIndexed: true, QStringLiteral("genre" ), .displayName: kli18nc(context: "@label music genre" , text: "Genre" ), .valueType: QMetaType::QString }, |
| 63 | PropertyInfoData{ .prop: Property::Height, .shouldBeIndexed: false, QStringLiteral("height" ), .displayName: kli18nc(context: "@label" , text: "Height" ), .valueType: QMetaType::Int }, |
| 64 | PropertyInfoData{ .prop: Property::ImageDateTime, .shouldBeIndexed: false, QStringLiteral("imageDateTime" ), .displayName: kli18nc(context: "@label EXIF" , text: "Image Date Time" ), .valueType: QMetaType::QDateTime, .formatAsString: FormatStrings::formatDate }, |
| 65 | PropertyInfoData{ .prop: Property::Manufacturer, .shouldBeIndexed: false, QStringLiteral("manufacturer" ), .displayName: kli18nc(context: "@label EXIF" , text: "Manufacturer" ), .valueType: QMetaType::QString }, |
| 66 | PropertyInfoData{ .prop: Property::Model, .shouldBeIndexed: false, QStringLiteral("model" ), .displayName: kli18nc(context: "@label EXIF" , text: "Model" ), .valueType: QMetaType::QString }, |
| 67 | PropertyInfoData{ .prop: Property::ImageOrientation, .shouldBeIndexed: false, QStringLiteral("imageOrientation" ), .displayName: kli18nc(context: "@label EXIF" , text: "Image Orientation" ), .valueType: QMetaType::Int, .formatAsString: FormatStrings::formatOrientationValue }, |
| 68 | PropertyInfoData{ .prop: Property::Keywords, .shouldBeIndexed: false, QStringLiteral("keywords" ), .displayName: kli18nc(context: "@label" , text: "Keywords" ), .valueType: QMetaType::QString }, |
| 69 | PropertyInfoData{ .prop: Property::Language, .shouldBeIndexed: false, QStringLiteral("language" ), .displayName: kli18nc(context: "@label" , text: "Language" ), .valueType: QMetaType::QString }, |
| 70 | PropertyInfoData{ .prop: Property::LineCount, .shouldBeIndexed: false, QStringLiteral("lineCount" ), .displayName: kli18nc(context: "@label number of lines" , text: "Line Count" ), .valueType: QMetaType::Int }, |
| 71 | PropertyInfoData{ .prop: Property::Lyricist, .shouldBeIndexed: true, QStringLiteral("lyricist" ), .displayName: kli18nc(context: "@label" , text: "Lyricist" ), .valueType: QMetaType::QString }, |
| 72 | PropertyInfoData{ .prop: Property::PageCount, .shouldBeIndexed: false, QStringLiteral("pageCount" ), .displayName: kli18nc(context: "@label" , text: "Page Count" ), .valueType: QMetaType::Int }, |
| 73 | PropertyInfoData{ .prop: Property::PhotoApertureValue, .shouldBeIndexed: false, QStringLiteral("photoApertureValue" ), .displayName: kli18nc(context: "@label EXIF" , text: "Aperture Value" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsFNumber }, |
| 74 | PropertyInfoData{ .prop: Property::PhotoDateTimeOriginal, .shouldBeIndexed: false, QStringLiteral("photoDateTimeOriginal" ), .displayName: kli18nc(context: "@label EXIF" , text: "Original Date Time" ), .valueType: QMetaType::QDateTime, .formatAsString: FormatStrings::formatDate }, |
| 75 | PropertyInfoData{ .prop: Property::PhotoExposureBiasValue, .shouldBeIndexed: false, QStringLiteral("photoExposureBiasValue" ), .displayName: kli18nc(context: "@label EXIF" , text: "Exposure Bias" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatPhotoExposureBias }, |
| 76 | PropertyInfoData{ .prop: Property::PhotoExposureTime, .shouldBeIndexed: false, QStringLiteral("photoExposureTime" ), .displayName: kli18nc(context: "@label EXIF" , text: "Exposure Time" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatPhotoTime }, |
| 77 | PropertyInfoData{ .prop: Property::PhotoFlash, .shouldBeIndexed: false, QStringLiteral("photoFlash" ), .displayName: kli18nc(context: "@label EXIF" , text: "Flash" ), .valueType: QMetaType::Int, .formatAsString: FormatStrings::formatPhotoFlashValue }, |
| 78 | PropertyInfoData{ .prop: Property::PhotoFNumber, .shouldBeIndexed: false, QStringLiteral("photoFNumber" ), .displayName: kli18nc(context: "@label EXIF" , text: "F Number" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsFNumber }, |
| 79 | PropertyInfoData{ .prop: Property::PhotoFocalLength, .shouldBeIndexed: false, QStringLiteral("photoFocalLength" ), .displayName: kli18nc(context: "@label EXIF" , text: "Focal Length" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsMilliMeter }, |
| 80 | PropertyInfoData{ .prop: Property::PhotoFocalLengthIn35mmFilm, .shouldBeIndexed: false, QStringLiteral("photoFocalLengthIn35mmFilm" ), .displayName: kli18nc(context: "@label EXIF" , text: "Focal Length 35mm" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsMilliMeter }, |
| 81 | PropertyInfoData{ .prop: Property::PhotoGpsLatitude, .shouldBeIndexed: false, QStringLiteral("photoGpsLatitude" ), .displayName: kli18nc(context: "@label EXIF" , text: "GPS Latitude" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsDegree }, |
| 82 | PropertyInfoData{ .prop: Property::PhotoGpsLongitude, .shouldBeIndexed: false, QStringLiteral("photoGpsLongitude" ), .displayName: kli18nc(context: "@label EXIF" , text: "GPS Longitude" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsDegree }, |
| 83 | PropertyInfoData{ .prop: Property::PhotoGpsAltitude, .shouldBeIndexed: false, QStringLiteral("photoGpsAltitude" ), .displayName: kli18nc(context: "@label EXIF" , text: "GPS Altitude" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatAsMeter }, |
| 84 | PropertyInfoData{ .prop: Property::PhotoISOSpeedRatings, .shouldBeIndexed: false, QStringLiteral("photoISOSpeedRatings" ), .displayName: kli18nc(context: "@label EXIF" , text: "ISO Speed Rating" ), .valueType: QMetaType::Int }, |
| 85 | PropertyInfoData{ .prop: Property::PhotoMeteringMode, .shouldBeIndexed: false, QStringLiteral("photoMeteringMode" ), .displayName: kli18nc(context: "@label EXIF" , text: "Metering Mode" ), .valueType: QMetaType::Int }, |
| 86 | PropertyInfoData{ .prop: Property::PhotoPixelXDimension, .shouldBeIndexed: false, QStringLiteral("photoPixelXDimension" ), .displayName: kli18nc(context: "@label EXIF" , text: "X Dimension" ), .valueType: QMetaType::Int }, |
| 87 | PropertyInfoData{ .prop: Property::PhotoPixelYDimension, .shouldBeIndexed: false, QStringLiteral("photoPixelYDimension" ), .displayName: kli18nc(context: "@label EXIF" , text: "Y Dimension" ), .valueType: QMetaType::Int }, |
| 88 | PropertyInfoData{ .prop: Property::PhotoSaturation, .shouldBeIndexed: false, QStringLiteral("photoSaturation" ), .displayName: kli18nc(context: "@label EXIF" , text: "Saturation" ), .valueType: QMetaType::Int }, |
| 89 | PropertyInfoData{ .prop: Property::PhotoSharpness, .shouldBeIndexed: false, QStringLiteral("photoSharpness" ), .displayName: kli18nc(context: "@label EXIF" , text: "Sharpness" ), .valueType: QMetaType::Int }, |
| 90 | PropertyInfoData{ .prop: Property::PhotoWhiteBalance, .shouldBeIndexed: false, QStringLiteral("photoWhiteBalance" ), .displayName: kli18nc(context: "@label EXIF" , text: "White Balance" ), .valueType: QMetaType::Int }, |
| 91 | PropertyInfoData{ .prop: Property::ColorSpace, .shouldBeIndexed: false, QStringLiteral("colorSpace" ), .displayName: kli18nc(context: "@label" , text: "Color Space" ), .valueType: QMetaType::QString }, |
| 92 | PropertyInfoData{ .prop: Property::VideoCodec, .shouldBeIndexed: false, QStringLiteral("videoCodec" ), .displayName: kli18nc(context: "@label" , text: "Video Codec" ), .valueType: QMetaType::QString }, |
| 93 | PropertyInfoData{ .prop: Property::AudioCodec, .shouldBeIndexed: false, QStringLiteral("audioCodec" ), .displayName: kli18nc(context: "@label" , text: "Audio Codec" ), .valueType: QMetaType::QString }, |
| 94 | PropertyInfoData{ .prop: Property::PixelFormat, .shouldBeIndexed: false, QStringLiteral("pixelFormat" ), .displayName: kli18nc(context: "@label" , text: "Pixel Format" ), .valueType: QMetaType::QString }, |
| 95 | PropertyInfoData{ .prop: Property::Publisher, .shouldBeIndexed: true, QStringLiteral("publisher" ), .displayName: kli18nc(context: "@label" , text: "Publisher" ), .valueType: QMetaType::QString }, |
| 96 | PropertyInfoData{ .prop: Property::Label, .shouldBeIndexed: true, QStringLiteral("label" ), .displayName: kli18nc(context: "@label" , text: "Label" ), .valueType: QMetaType::QString }, |
| 97 | PropertyInfoData{ .prop: Property::ReleaseYear, .shouldBeIndexed: false, QStringLiteral("releaseYear" ), .displayName: kli18nc(context: "@label" , text: "Release Year" ), .valueType: QMetaType::Int }, |
| 98 | PropertyInfoData{ .prop: Property::SampleRate, .shouldBeIndexed: false, QStringLiteral("sampleRate" ), .displayName: kli18nc(context: "@label" , text: "Sample Rate" ), .valueType: QMetaType::Int, .formatAsString: FormatStrings::formatSampleRate }, |
| 99 | PropertyInfoData{ .prop: Property::Subject, .shouldBeIndexed: false, QStringLiteral("subject" ), .displayName: kli18nc(context: "@label" , text: "Subject" ), .valueType: QMetaType::QString }, |
| 100 | PropertyInfoData{ .prop: Property::Title, .shouldBeIndexed: true, QStringLiteral("title" ), .displayName: kli18nc(context: "@label" , text: "Title" ), .valueType: QMetaType::QString }, |
| 101 | PropertyInfoData{ .prop: Property::TrackNumber, .shouldBeIndexed: false, QStringLiteral("trackNumber" ), .displayName: kli18nc(context: "@label music track number" , text: "Track Number" ), .valueType: QMetaType::Int }, |
| 102 | PropertyInfoData{ .prop: Property::DiscNumber, .shouldBeIndexed: false, QStringLiteral("discNumber" ), .displayName: kli18nc(context: "@label music disc number" , text: "Disc Number" ), .valueType: QMetaType::Int }, |
| 103 | PropertyInfoData{ .prop: Property::Location, .shouldBeIndexed: true, QStringLiteral("location" ), .displayName: kli18nc(context: "@label" , text: "Location" ), .valueType: QMetaType::QString }, |
| 104 | PropertyInfoData{ .prop: Property::Performer, .shouldBeIndexed: true, QStringLiteral("performer" ), .displayName: kli18nc(context: "@label" , text: "Performer" ), .valueType: QMetaType::QString }, |
| 105 | PropertyInfoData{ .prop: Property::Ensemble, .shouldBeIndexed: true, QStringLiteral("ensemble" ), .displayName: kli18nc(context: "@label" , text: "Ensemble" ), .valueType: QMetaType::QString }, |
| 106 | PropertyInfoData{ .prop: Property::Arranger, .shouldBeIndexed: true, QStringLiteral("arranger" ), .displayName: kli18nc(context: "@label" , text: "Arranger" ), .valueType: QMetaType::QString }, |
| 107 | PropertyInfoData{ .prop: Property::Conductor, .shouldBeIndexed: true, QStringLiteral("conductor" ), .displayName: kli18nc(context: "@label" , text: "Conductor" ), .valueType: QMetaType::QString }, |
| 108 | PropertyInfoData{ .prop: Property::Compilation, .shouldBeIndexed: true, QStringLiteral("compilation" ), .displayName: kli18nc(context: "@label" , text: "Compilation" ), .valueType: QMetaType::QString }, |
| 109 | PropertyInfoData{ .prop: Property::License, .shouldBeIndexed: true, QStringLiteral("license" ), .displayName: kli18nc(context: "@label" , text: "License" ), .valueType: QMetaType::QString }, |
| 110 | PropertyInfoData{ .prop: Property::Lyrics, .shouldBeIndexed: true, QStringLiteral("lyrics" ), .displayName: kli18nc(context: "@label" , text: "Lyrics" ), .valueType: QMetaType::QString }, |
| 111 | PropertyInfoData{ .prop: Property::Opus, .shouldBeIndexed: false, QStringLiteral("opus" ), .displayName: kli18nc(context: "@label" , text: "Opus" ), .valueType: QMetaType::Int }, |
| 112 | PropertyInfoData{ .prop: Property::Rating, .shouldBeIndexed: false, QStringLiteral("embeddedRating" ), .displayName: kli18nc(context: "@label" , text: "Rating" ), .valueType: QMetaType::Int }, |
| 113 | PropertyInfoData{ .prop: Property::ReplayGainAlbumPeak, .shouldBeIndexed: false, QStringLiteral("replayGainAlbumPeak" ), .displayName: kli18nc(context: "@label ReplayGain is the name of a standard" , text: "ReplayGain Album Peak" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatDouble }, |
| 114 | PropertyInfoData{ .prop: Property::ReplayGainAlbumGain, .shouldBeIndexed: false, QStringLiteral("replayGainAlbumGain" ), .displayName: kli18nc(context: "@label ReplayGain is the name of a standard" , text: "ReplayGain Album Gain" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatDouble }, |
| 115 | PropertyInfoData{ .prop: Property::ReplayGainTrackPeak, .shouldBeIndexed: false, QStringLiteral("replayGainTrackPeak" ), .displayName: kli18nc(context: "@label ReplayGain is the name of a standard" , text: "ReplayGain Track Peak" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatDouble }, |
| 116 | PropertyInfoData{ .prop: Property::ReplayGainTrackGain, .shouldBeIndexed: false, QStringLiteral("replayGainTrackGain" ), .displayName: kli18nc(context: "@label ReplayGain is the name of a standard" , text: "ReplayGain Track Gain" ), .valueType: QMetaType::Double, .formatAsString: FormatStrings::formatDouble }, |
| 117 | PropertyInfoData{ .prop: Property::Width, .shouldBeIndexed: false, QStringLiteral("width" ), .displayName: kli18nc(context: "@label" , text: "Width" ), .valueType: QMetaType::Int }, |
| 118 | PropertyInfoData{ .prop: Property::WordCount, .shouldBeIndexed: false, QStringLiteral("wordCount" ), .displayName: kli18nc(context: "@label number of words" , text: "Word Count" ), .valueType: QMetaType::Int }, |
| 119 | PropertyInfoData{ .prop: Property::TranslationUnitsTotal, .shouldBeIndexed: false, QStringLiteral("translationUnitsTotal" ), .displayName: kli18nc(context: "@label number of translatable strings" , text: "Translatable Units" ), .valueType: QMetaType::Int }, |
| 120 | PropertyInfoData{ .prop: Property::TranslationUnitsWithTranslation, .shouldBeIndexed: false, QStringLiteral("translationUnitsWithTranslation" ), .displayName: kli18nc(context: "@label number of translated strings" , text: "Translations" ), .valueType: QMetaType::Int }, |
| 121 | PropertyInfoData{ .prop: Property::TranslationUnitsWithDraftTranslation, .shouldBeIndexed: false, QStringLiteral("translationUnitsWithDraftTranslation" ), .displayName: kli18nc(context: "@label number of fuzzy translated strings" , text: "Draft Translations" ), .valueType: QMetaType::Int }, |
| 122 | PropertyInfoData{ .prop: Property::TranslationLastAuthor, .shouldBeIndexed: false, QStringLiteral("translationLastAuthor" ), .displayName: kli18nc(context: "@label translation author" , text: "Author" ), .valueType: QMetaType::QString }, |
| 123 | PropertyInfoData{ .prop: Property::TranslationLastUpDate, .shouldBeIndexed: false, QStringLiteral("translationLastUpDate" ), .displayName: kli18nc(context: "@label translations last update" , text: "Last Update" ), .valueType: QMetaType::QString, .formatAsString: FormatStrings::formatDate }, |
| 124 | PropertyInfoData{ .prop: Property::TranslationTemplateDate, .shouldBeIndexed: false, QStringLiteral("translationTemplateDate" ), .displayName: kli18nc(context: "@label date of template creation8" , text: "Template Creation" ), .valueType: QMetaType::QString, .formatAsString: FormatStrings::formatDate }, |
| 125 | PropertyInfoData{ .prop: Property::OriginUrl, .shouldBeIndexed: false, QStringLiteral("originUrl" ), .displayName: kli18nc(context: "@label the URL a file was originally downloaded from" , text: "Downloaded From" ), .valueType: QMetaType::QUrl }, |
| 126 | PropertyInfoData{ .prop: Property::OriginEmailSubject, .shouldBeIndexed: false, QStringLiteral("originEmailSubject" ), .displayName: kli18nc(context: "@label the subject of an email this file was attached to" , text: "E-Mail Attachment Subject" ), .valueType: QMetaType::QString }, |
| 127 | PropertyInfoData{ .prop: Property::OriginEmailSender, .shouldBeIndexed: false, QStringLiteral("originEmailSender" ), .displayName: kli18nc(context: "@label the sender of an email this file was attached to" , text: "E-Mail Attachment Sender" ), .valueType: QMetaType::QString }, |
| 128 | PropertyInfoData{ .prop: Property::OriginEmailMessageId, .shouldBeIndexed: false, QStringLiteral("originEmailMessageId" ), .displayName: kli18nc(context: "@label the message ID of an email this file was attached to" , text: "E-Mail Attachment Message ID" ), .valueType: QMetaType::QString } |
| 129 | }; |
| 130 | |
| 131 | const QHash<LcIdentifierName, const PropertyInfoData*> PropertyInfoData::s_propertyHash = []() |
| 132 | { |
| 133 | QHash<LcIdentifierName, const PropertyInfoData*> infoHash; |
| 134 | infoHash.reserve(size: s_allProperties.size()); |
| 135 | |
| 136 | for (const auto& info: s_allProperties) { |
| 137 | infoHash[QStringView(info.name)] = &info; |
| 138 | } |
| 139 | return infoHash; |
| 140 | }(); |
| 141 | |
| 142 | constexpr auto PropertyInfoData::fromId(Property::Property property) -> const PropertyInfoData* |
| 143 | { |
| 144 | for (const auto& p : s_allProperties) { |
| 145 | if (p.prop == property) |
| 146 | return &p; |
| 147 | } |
| 148 | return &s_Empty; |
| 149 | } |
| 150 | |
| 151 | auto PropertyInfoData::fromName(const QString& name) -> const PropertyInfoData* |
| 152 | { |
| 153 | return s_propertyHash.value(key: LcIdentifierName(name), defaultValue: &s_Empty); |
| 154 | } |
| 155 | |
| 156 | |
| 157 | PropertyInfo::PropertyInfo(Property::Property property) : d(PropertyInfoData::fromId(property)) {}; |
| 158 | |
| 159 | PropertyInfo::PropertyInfo() : d(&PropertyInfoData::s_Empty) {}; |
| 160 | |
| 161 | PropertyInfo::PropertyInfo(const PropertyInfo& pi) |
| 162 | : d(pi.d) |
| 163 | { |
| 164 | } |
| 165 | |
| 166 | PropertyInfo::~PropertyInfo() = default; |
| 167 | |
| 168 | PropertyInfo& PropertyInfo::operator=(const PropertyInfo& rhs) |
| 169 | { |
| 170 | d = rhs.d; |
| 171 | return *this; |
| 172 | } |
| 173 | |
| 174 | bool PropertyInfo::operator==(const PropertyInfo& rhs) const |
| 175 | { |
| 176 | return d == rhs.d; |
| 177 | } |
| 178 | |
| 179 | QString PropertyInfo::displayName() const |
| 180 | { |
| 181 | return d->displayName.toString(); |
| 182 | } |
| 183 | |
| 184 | QString PropertyInfo::name() const |
| 185 | { |
| 186 | return d->name; |
| 187 | } |
| 188 | |
| 189 | Property::Property PropertyInfo::property() const |
| 190 | { |
| 191 | return d->prop; |
| 192 | } |
| 193 | |
| 194 | QMetaType::Type PropertyInfo::valueType() const |
| 195 | { |
| 196 | return d->valueType; |
| 197 | } |
| 198 | |
| 199 | bool PropertyInfo::shouldBeIndexed() const |
| 200 | { |
| 201 | return d->shouldBeIndexed; |
| 202 | } |
| 203 | |
| 204 | QString PropertyInfo::formatAsDisplayString(const QVariant &value) const |
| 205 | { |
| 206 | if (value.userType() == QMetaType::QVariantList || value.userType() == QMetaType::QStringList) { |
| 207 | if (d->valueType == QMetaType::QString) { |
| 208 | return QLocale().createSeparatedList(strl: value.toStringList()); |
| 209 | } else { |
| 210 | QStringList displayList; |
| 211 | const auto valueList = value.toList(); |
| 212 | for (const auto& entry : valueList) { |
| 213 | displayList << d->formatAsString(entry); |
| 214 | } |
| 215 | return QLocale().createSeparatedList(strl: displayList); |
| 216 | } |
| 217 | } else { |
| 218 | return d->formatAsString(value); |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | PropertyInfo PropertyInfo::fromName(const QString& name) |
| 223 | { |
| 224 | PropertyInfo pi; |
| 225 | pi.d = PropertyInfoData::fromName(name); |
| 226 | return pi; |
| 227 | } |
| 228 | |
| 229 | QStringList PropertyInfo::allNames() |
| 230 | { |
| 231 | static QStringList sNames = []() { |
| 232 | QStringList names; |
| 233 | names.reserve(asize: PropertyInfoData::s_allProperties.size()); |
| 234 | for (auto info: PropertyInfoData::s_allProperties) { |
| 235 | names.append(t: info.name); |
| 236 | } |
| 237 | return names; |
| 238 | }(); |
| 239 | return sNames; |
| 240 | } |
| 241 | |