File indexing completed on 2025-02-02 05:02:39
0001 /* 0002 SPDX-FileCopyrightText: 2018-2021 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "util.h" 0008 #include "logging.h" 0009 0010 #include <KItinerary/JsonLdDocument> 0011 #include <KItinerary/LocationUtil> 0012 0013 #include <KContacts/PhoneNumber> 0014 0015 #include <KTextToHTML> 0016 0017 #include <QAbstractItemModel> 0018 #include <QColor> 0019 #include <QDateTime> 0020 #include <QFile> 0021 #include <QImage> 0022 #include <QTimeZone> 0023 #include <QUrl> 0024 0025 #include <cmath> 0026 0027 using namespace KItinerary; 0028 0029 QDateTime Util::dateTimeStripTimezone(const QVariant& obj, const QString& propertyName) 0030 { 0031 auto dt = JsonLdDocument::readProperty(obj, propertyName.toUtf8().constData()).toDateTime(); 0032 if (!dt.isValid()) { 0033 return {}; 0034 } 0035 0036 dt.setTimeSpec(Qt::LocalTime); 0037 return dt; 0038 } 0039 0040 QVariant Util::setDateTimePreserveTimezone(const QVariant &obj, const QString& propertyName, QDateTime value) 0041 { 0042 if (!value.isValid()) { 0043 qCDebug(Log) << "Invalid date passed for property" << propertyName; 0044 return obj; 0045 } 0046 0047 QVariant o(obj); 0048 const auto oldDt = JsonLdDocument::readProperty(obj, propertyName.toUtf8().constData()).toDateTime(); 0049 if (oldDt.isValid()) { 0050 value.setTimeZone(oldDt.timeZone()); 0051 } 0052 JsonLdDocument::writeProperty(o, propertyName.toUtf8().constData(), value); 0053 return o; 0054 } 0055 0056 bool Util::isStartOfDay(const QVariant &obj, const QString &propertyName) 0057 { 0058 const auto dt = JsonLdDocument::readProperty(obj, propertyName.toUtf8().constData()).toDateTime(); 0059 return dt.isValid() && dt.time() == QTime(0, 0); 0060 } 0061 0062 bool Util::isRichText(const QString &text) 0063 { 0064 auto idx = text.indexOf(QLatin1Char('<')); 0065 if (idx >= 0 && idx < text.size() - 2) { 0066 return text[idx + 1].isLetter() || text[idx + 1] == QLatin1Char('/'); 0067 } 0068 return false; 0069 } 0070 0071 QString Util::textToHtml(const QString& text) 0072 { 0073 if (isRichText(text)) { 0074 return text; 0075 } 0076 return KTextToHTML::convertToHtml(text, KTextToHTML::ConvertPhoneNumbers | KTextToHTML::PreserveSpaces); 0077 } 0078 0079 QString Util::telephoneUrl(const QString &phoneNumber) 0080 { 0081 return QLatin1StringView("tel:") + KContacts::PhoneNumber(phoneNumber).normalizedNumber(); 0082 } 0083 0084 QString Util::emailUrl(const QString &emailAddress) 0085 { 0086 return QLatin1StringView("mailto:") + emailAddress; 0087 } 0088 0089 void Util::sortModel(QObject *model, int column, Qt::SortOrder sortOrder) 0090 { 0091 if (auto qaim = qobject_cast<QAbstractItemModel*>(model)) { 0092 qaim->sort(column, sortOrder); 0093 } 0094 } 0095 0096 bool Util::isValidColor(const QColor &color) 0097 { 0098 return color.isValid(); 0099 } 0100 0101 bool Util::isLocationChange(const QVariant &res) 0102 { 0103 return LocationUtil::isLocationChange(res); 0104 } 0105 0106 bool Util::isDarkImage(const QImage &img) 0107 { 0108 constexpr auto SAMPLE_COUNT = 32; 0109 0110 const auto xStride = std::max(1, img.width() / SAMPLE_COUNT); 0111 const auto yStride = std::max(1, img.height() / SAMPLE_COUNT); 0112 int darkCount = 0; 0113 0114 for (auto x = xStride; x < img.width(); x += xStride) { 0115 for (auto y = yStride; y < img.height(); y += yStride) { 0116 if (qGray(img.pixel(x, y)) < 128) { 0117 ++darkCount; 0118 } 0119 } 0120 } 0121 0122 return darkCount > (SAMPLE_COUNT * SAMPLE_COUNT / 2); 0123 } 0124 0125 #include "moc_util.cpp"