You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.2 KiB
172 lines
6.2 KiB
/* |
|
* localelistmodel.cpp |
|
* Copyright 2014 Sebastian Kügler <sebas@kde.org> |
|
* Copyright 2021 Han Young <hanyoung@protonmail.com> |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
*/ |
|
|
|
#include "localelistmodel.h" |
|
#include "exampleutility.h" |
|
#include "kcmregionandlang.h" |
|
#include "settingtype.h" |
|
|
|
#include <QTextCodec> |
|
|
|
using namespace KCM_RegionAndLang; |
|
|
|
LocaleListModel::LocaleListModel(QObject *parent) |
|
: QAbstractListModel(parent) |
|
{ |
|
const QList<QLocale> m_locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); |
|
m_localeData.reserve(m_locales.size() + 1); |
|
// we use first QString for title in Unset option |
|
m_localeData.push_back(LocaleData{i18n("Default for System"), QString(), QString(), QString(), i18n("Default"), QLocale()}); |
|
for (auto &locale : m_locales) { |
|
m_localeData.push_back(LocaleData{.nativeName = locale.nativeLanguageName(), |
|
.englishName = QLocale::languageToString(locale.language()), |
|
.nativeCountryName = locale.nativeCountryName(), |
|
.englishCountryName = QLocale::countryToString(locale.country()), |
|
.countryCode = locale.name(), |
|
.locale = locale}); |
|
} |
|
} |
|
|
|
int LocaleListModel::rowCount(const QModelIndex &parent) const |
|
{ |
|
Q_UNUSED(parent) |
|
return m_localeData.size(); |
|
} |
|
|
|
QVariant LocaleListModel::data(const QModelIndex &index, int role) const |
|
{ |
|
int dataIndex = index.row(); |
|
const auto &data = m_localeData.at(dataIndex); |
|
switch (role) { |
|
case FlagIcon: { |
|
QString countryCode; |
|
const QStringList split = data.countryCode.split(QLatin1Char('_')); |
|
if (split.size() > 1) { |
|
countryCode = split[1].toLower(); |
|
} |
|
auto flagIconPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, |
|
QStringLiteral("kf" QT_STRINGIFY(QT_VERSION_MAJOR) "/locale/countries/%1/flag.png").arg(countryCode)); |
|
return flagIconPath; |
|
} |
|
case DisplayName: { |
|
// 0 is unset option, 1 is locale C |
|
if (dataIndex == 1) { |
|
return data.countryCode; |
|
} |
|
const QString clabel = !data.nativeCountryName.isEmpty() ? data.nativeCountryName : data.englishCountryName; |
|
QString languageName; |
|
if (!data.nativeName.isEmpty()) { |
|
languageName = data.nativeName; |
|
} else { |
|
languageName = data.englishName; |
|
} |
|
if (dataIndex == 0) { |
|
return languageName; |
|
} |
|
return i18nc("the first is language name, the second is the country name, like 'English (America)'", "%1 (%2)", languageName, clabel); |
|
} |
|
case LocaleName: { |
|
QString cvalue = data.countryCode; |
|
if (!cvalue.contains(QLatin1Char('.')) && cvalue != QLatin1Char('C') && cvalue != i18n("Default")) { |
|
// explicitly add the encoding, |
|
// otherwise Qt doesn't accept dead keys and garbles the output as well |
|
cvalue.append(QLatin1Char('.') + QTextCodec::codecForLocale()->name()); |
|
} |
|
return cvalue; |
|
} |
|
case Example: { |
|
switch (m_configType) { |
|
case Lang: |
|
return {}; |
|
case Numeric: |
|
return Utility::numericExample(data.locale); |
|
case Time: |
|
return Utility::timeExample(data.locale); |
|
case Currency: |
|
return Utility::monetaryExample(data.locale); |
|
case Measurement: |
|
return Utility::measurementExample(data.locale); |
|
case PaperSize: |
|
return Utility::paperSizeExample(data.locale); |
|
#ifdef LC_ADDRESS |
|
case Address: |
|
return Utility::addressExample(data.locale); |
|
case NameStyle: |
|
return Utility::nameStyleExample(data.locale); |
|
case PhoneNumbers: |
|
return Utility::phoneNumbersExample(data.locale); |
|
#endif |
|
} |
|
return {}; |
|
} |
|
case FilterRole: { |
|
return data.englishCountryName.toLower() + data.nativeCountryName.toLower() + data.nativeName.toLower() + data.englishName.toLower() |
|
+ data.countryCode.toLower(); |
|
} |
|
} |
|
Q_UNREACHABLE(); |
|
return {}; |
|
} |
|
|
|
QHash<int, QByteArray> LocaleListModel::roleNames() const |
|
{ |
|
return {{LocaleName, QByteArrayLiteral("localeName")}, |
|
{DisplayName, QByteArrayLiteral("display")}, |
|
{FlagIcon, QByteArrayLiteral("flag")}, |
|
{Example, QByteArrayLiteral("example")}, |
|
{FilterRole, QByteArrayLiteral("filter")}}; |
|
} |
|
|
|
int LocaleListModel::selectedConfig() const |
|
{ |
|
return m_configType; |
|
} |
|
|
|
void LocaleListModel::setSelectedConfig(int config) |
|
{ |
|
if (config != m_configType) { |
|
m_configType = static_cast<SettingType>(config); |
|
} |
|
Q_EMIT selectedConfigChanged(); |
|
Q_EMIT dataChanged(createIndex(0, 0), createIndex(rowCount(), 0), QVector<int>(1, Example)); |
|
} |
|
|
|
void LocaleListModel::setLang(const QString &lang) |
|
{ |
|
QString tmpLang = lang; |
|
bool isC = false; |
|
if (lang.isEmpty()) { |
|
tmpLang = qgetenv("LANG"); |
|
if (tmpLang.isEmpty()) { |
|
tmpLang = QStringLiteral("C"); |
|
isC = true; |
|
} |
|
} |
|
|
|
LocaleData &data = m_localeData.front(); |
|
if (isC) { |
|
data.nativeName = i18nc("@info:title, meaning the current locale is system default(which is `C`)", "System Default C"); |
|
} else { |
|
data.nativeName = |
|
i18nc("@info:title the current locale is the default for %1, %1 is the country name", "Default for %1", QLocale(tmpLang).nativeLanguageName()); |
|
} |
|
data.locale = QLocale(tmpLang); |
|
|
|
Q_EMIT dataChanged(createIndex(0, 0), createIndex(0, 0)); |
|
}
|
|
|