File indexing completed on 2024-06-23 04:42:36

0001 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #include "timezonelistmodel.h"
0005 #include <KLocalizedString>
0006 #include <QByteArray>
0007 #include <QDebug>
0008 #include <QMetaEnum>
0009 #include <QTimeZone>
0010 
0011 TimeZoneListModel::TimeZoneListModel(QObject *parent)
0012     : QAbstractListModel(parent)
0013 {
0014     // Reimplementation of IncidenceEditorPage's KTimeZoneComboBox
0015     // Read all system time zones
0016     const QList<QByteArray> lstTimeZoneIds = QTimeZone::availableTimeZoneIds();
0017     m_timeZones.reserve(lstTimeZoneIds.count());
0018 
0019     std::copy(lstTimeZoneIds.begin(), lstTimeZoneIds.end(), std::back_inserter(m_timeZones));
0020     std::sort(m_timeZones.begin(), m_timeZones.end()); // clazy:exclude=detaching-member
0021 
0022     // Prepend Local, UTC and Floating, for convenience
0023     m_timeZones.prepend("UTC"); // do not use i18n here  index=2
0024     m_timeZones.prepend("Floating"); // do not use i18n here  index=1
0025     m_timeZones.prepend(QTimeZone::systemTimeZoneId()); // index=0
0026 }
0027 
0028 QVariant TimeZoneListModel::data(const QModelIndex &idx, int role) const
0029 {
0030     if (!hasIndex(idx.row(), idx.column())) {
0031         return {};
0032     }
0033     auto timeZone = m_timeZones[idx.row()];
0034     switch (role) {
0035     case Qt::DisplayRole:
0036         return i18n(timeZone.replace('_', ' ').constData());
0037     case IdRole:
0038         return timeZone;
0039     default:
0040         qWarning() << "Unknown role for timezone:" << QMetaEnum::fromType<Roles>().valueToKey(role);
0041         return {};
0042     }
0043 }
0044 
0045 QHash<int, QByteArray> TimeZoneListModel::roleNames() const
0046 {
0047     return {
0048         {Qt::DisplayRole, QByteArrayLiteral("display")},
0049         {IdRole, QByteArrayLiteral("id")},
0050     };
0051 }
0052 
0053 int TimeZoneListModel::rowCount(const QModelIndex &) const
0054 {
0055     return m_timeZones.length();
0056 }
0057 
0058 int TimeZoneListModel::getTimeZoneRow(const QByteArray &timeZone)
0059 {
0060     for (int i = 0; i < rowCount(); i++) {
0061         QModelIndex idx = index(i, 0);
0062         QVariant data = idx.data(IdRole).toByteArray();
0063 
0064         if (data == timeZone)
0065             return i;
0066     }
0067 
0068     return 0;
0069 }