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 }