File indexing completed on 2024-06-23 05:45:40

0001 /*
0002  * Copyright 2020 Han Young <hanyoung@protonmail.com>
0003  * Copyright 2020-2021 Devin Lin <devin@kde.org>
0004  * Copyright 2019 Nick Reitemeyer <nick.reitemeyer@web.de>
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include "addlocationmodel.h"
0010 
0011 #include "savedlocationsmodel.h"
0012 #include "utilmodel.h"
0013 
0014 #include <KConfigGroup>
0015 #include <KLocalizedString>
0016 #include <KSharedConfig>
0017 
0018 #include <QDebug>
0019 
0020 const QString TZ_CFG_GROUP = QStringLiteral("Timezones");
0021 
0022 AddLocationModel *AddLocationModel::instance()
0023 {
0024     static auto singleton = new AddLocationModel;
0025     return singleton;
0026 }
0027 
0028 AddLocationModel::AddLocationModel(QObject *parent)
0029     : QAbstractListModel(parent)
0030 {
0031     load();
0032 
0033     connect(KclockFormat::instance(), &KclockFormat::timeChanged, this, [this] {
0034         Q_EMIT dataChanged(index(0), index(m_list.size() - 1), {CurrentTimeRole});
0035     });
0036 }
0037 
0038 void AddLocationModel::load()
0039 {
0040     beginResetModel();
0041 
0042     m_list.clear();
0043 
0044     auto config = KSharedConfig::openConfig();
0045     KConfigGroup timezoneGroup = config->group(TZ_CFG_GROUP);
0046 
0047     // add other configured time zones
0048     for (QByteArray id : QTimeZone::availableTimeZoneIds()) {
0049         bool shown = timezoneGroup.readEntry(id.data(), false);
0050         m_list.append(QTimeZone(id));
0051 
0052         if (shown) {
0053             m_addedLocations.insert(QString::fromStdString(id.toStdString()));
0054         }
0055     }
0056 
0057     endResetModel();
0058 }
0059 
0060 int AddLocationModel::rowCount(const QModelIndex &parent) const
0061 {
0062     Q_UNUSED(parent);
0063     return m_list.count();
0064 }
0065 
0066 QVariant AddLocationModel::data(const QModelIndex &index, int role) const
0067 {
0068     if (!index.isValid())
0069         return QVariant();
0070 
0071     auto tz = m_list[index.row()];
0072     QString id = QString::fromStdString(tz.id().replace("_", " ").toStdString());
0073 
0074     switch (role) {
0075     case CityRole: {
0076         auto split = id.split(QLatin1Char('/'));
0077         return split[split.size() - 1];
0078     }
0079     case CountryRole:
0080         return QLocale::countryToString(tz.country());
0081     case TimeZoneRole:
0082         return tz.displayName(QDateTime::currentDateTime(), QTimeZone::ShortName);
0083     case IdRole:
0084         return id;
0085     case AddedRole:
0086         return m_addedLocations.find(id) != m_addedLocations.end();
0087     case CurrentTimeRole: {
0088         QDateTime time = QDateTime::currentDateTime();
0089         time = time.toTimeZone(tz);
0090         return KclockFormat().formatTimeString(time.time().hour(), time.time().minute());
0091     }
0092     }
0093     return QVariant();
0094 }
0095 
0096 QHash<int, QByteArray> AddLocationModel::roleNames() const
0097 {
0098     return {{CityRole, "city"}, {CountryRole, "country"}, {TimeZoneRole, "timeZone"}, {IdRole, "id"}, {AddedRole, "added"}, {CurrentTimeRole, "currentTime"}};
0099 }
0100 
0101 Qt::ItemFlags AddLocationModel::flags(const QModelIndex &index) const
0102 {
0103     Q_UNUSED(index)
0104     return Qt::ItemIsEditable;
0105 }
0106 
0107 AddLocationSearchModel *AddLocationSearchModel::instance()
0108 {
0109     static auto singleton = new AddLocationSearchModel;
0110     return singleton;
0111 }
0112 
0113 AddLocationSearchModel::AddLocationSearchModel(QObject *parent)
0114     : QSortFilterProxyModel(parent)
0115 {
0116     setFilterCaseSensitivity(Qt::CaseInsensitive);
0117     setSourceModel(AddLocationModel::instance());
0118     setFilterRole(AddLocationModel::IdRole);
0119     sort(0);
0120 }
0121 
0122 void AddLocationSearchModel::addLocation(int index)
0123 {
0124     auto config = KSharedConfig::openConfig();
0125     KConfigGroup timezoneGroup = config->group(TZ_CFG_GROUP);
0126     QString ianaId = data(this->index(index, 0), AddLocationModel::IdRole).toString().replace(QStringLiteral(" "), QStringLiteral("_"));
0127     timezoneGroup.writeEntry(ianaId, true);
0128     config->sync();
0129 
0130     AddLocationModel::instance()->load();
0131     SavedLocationsModel::instance()->load();
0132 }
0133 
0134 bool AddLocationSearchModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
0135 {
0136     return QVariant::compare(sourceModel()->data(left, AddLocationModel::CityRole), sourceModel()->data(right, AddLocationModel::CityRole))
0137         == QPartialOrdering::Less;
0138 }