forked from Qortal/Brooklyn
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.
72 lines
3.0 KiB
72 lines
3.0 KiB
/* |
|
SPDX-FileCopyrightText: 2014 John Layt <[email protected]> |
|
SPDX-FileCopyrightText: 2018 Eike Hein <[email protected]> |
|
SPDX-FileCopyrightText: 2021 Harald Sitter <[email protected]> |
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <QAbstractListModel> |
|
|
|
#include <KLocalizedString> |
|
|
|
#include "language.h" |
|
|
|
using LanguageVector = QVector<Language *>; |
|
|
|
class TranslationsModel : public QAbstractListModel |
|
{ |
|
Q_OBJECT |
|
Q_PROPERTY(QStringList selectedLanguages READ selectedLanguages WRITE setSelectedLanguages NOTIFY selectedLanguagesChanged) |
|
Q_PROPERTY(QStringList missingLanguages READ missingLanguages NOTIFY missingLanguagesChanged) |
|
public: |
|
enum AdditionalRoles { |
|
Object = Qt::UserRole + 1, |
|
LanguageCode, |
|
IsSelected, // mutable whether the language is marked for use |
|
SelectionPreference, // integer index of selection preference (establishes the order of selections) |
|
IsIncomplete, // whether the language is missing distro packages (not relevant when not IsSelected) |
|
IsInstalling, // only true when the language was incomplete and is on the way to completion |
|
}; |
|
Q_ENUM(AdditionalRoles) |
|
|
|
using QAbstractListModel::QAbstractListModel; |
|
|
|
QHash<int, QByteArray> roleNames() const override; |
|
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; |
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override; |
|
|
|
QStringList selectedLanguages() const; |
|
void setSelectedLanguages(const QStringList &languages); |
|
|
|
QStringList missingLanguages() const; |
|
|
|
Q_INVOKABLE void move(int from, int to); |
|
Q_INVOKABLE void remove(const QString &languageCode); |
|
|
|
Q_SIGNALS: |
|
void selectedLanguagesChanged(const QStringList &languages) const; |
|
void missingLanguagesChanged() const; |
|
|
|
private: |
|
QString languageCodeToName(const QString &languageCode) const; |
|
LanguageVector makeLanguages(const QStringList &codes); |
|
|
|
// The indices of these two must always be the same. This is to ensure that we can map between them. |
|
// This is the overarching data set of all known languages. This is a strict super set of m_selectedLanguages. |
|
// Could have used a hash here but it'd a bit clunky since we most of the time need to access an index so |
|
// we'd constantly have to .values() and .keys(). |
|
// The list of "known" languages cannot change at runtime really. They are all expected to be present all the time. |
|
const QStringList m_languageCodes = KLocalizedString::availableDomainTranslations("plasmashell").values(); |
|
const LanguageVector m_languages = makeLanguages(m_languageCodes); |
|
|
|
// This tracks the selection and order of selected languages. It's a bit like an additional layer of model data. |
|
QStringList m_selectedLanguages; |
|
|
|
// Languages that were configured but are indeed missing from our model. These are only language codes. |
|
// We intentionally do not model this properly to keep things simple! |
|
QStringList m_missingLanguages; |
|
};
|
|
|