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"