File indexing completed on 2024-04-14 05:46:50

0001 /**
0002  * SPDX-FileCopyrightText: 2022 by Alexander Stippich <a.stippich@gmx.net>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "OCRLanguageModel.h"
0008 
0009 #include <QLocale>
0010 
0011 OCRLanguageModel::OCRLanguageModel(QObject *parent) : QAbstractListModel(parent)
0012 {
0013 }
0014 
0015 OCRLanguageModel::~OCRLanguageModel()
0016 {
0017 }
0018 
0019 QHash<int, QByteArray> OCRLanguageModel::roleNames() const
0020 {
0021     QHash<int, QByteArray> roles;
0022     roles[NameRole] = "name";
0023     roles[CodeRole] = "code";
0024     roles[UseRole] = "use";
0025     return roles;
0026 }
0027 
0028 int OCRLanguageModel::rowCount(const QModelIndex &) const
0029 {
0030     return m_languages.count();
0031 }
0032     
0033 QVariant OCRLanguageModel::data(const QModelIndex &index, int role) const
0034 {
0035     if (!index.isValid()) {
0036         return QVariant();
0037     }
0038 
0039     if (index.row() >= m_languages.size() || index.row() < 0) {
0040         return QVariant();
0041     }
0042     
0043     switch (role) {
0044     case NameRole:
0045         return m_languages.at(index.row()).name;
0046         break;
0047     case CodeRole:
0048         return m_languages.at(index.row()).code;
0049         break;
0050     case UseRole:
0051         return m_languages.at(index.row()).use;
0052         break;
0053     }
0054     return QVariant();
0055 }
0056 
0057 bool OCRLanguageModel::setData(const QModelIndex &index, const QVariant &value, int role)
0058 {
0059     if (index.row() >= 0 && index.row() < m_languages.size() && role == UseRole) {
0060         m_languages[index.row()].use = value.toBool();
0061         return true;
0062     }
0063     return false;
0064 }
0065 
0066 void OCRLanguageModel::setLanguages(const std::vector<std::string> &availableLanguages)
0067 {
0068     beginResetModel();
0069     // improve with Qt 6.3 (alpha 3 code support added)
0070     for (const auto &language : availableLanguages) {
0071         QString languageCode = QString::fromLocal8Bit(language.c_str());
0072         if (languageCode != QStringLiteral("osd")) {
0073             QLocale locale(languageCode.left(2));
0074             m_languages.append({locale.nativeLanguageName(), languageCode, false});
0075         }
0076     }
0077     endResetModel();
0078 }
0079 
0080 std::string OCRLanguageModel::getLanguagesString() const
0081 {
0082     std::string languageCodes;
0083     for (int i = 0; i < m_languages.size(); i++) {
0084         if (m_languages.at(i).use) {
0085             if (languageCodes.size() > 1) {
0086                 languageCodes.append("+");
0087             }
0088             languageCodes.append(m_languages.at(i).code.toStdString());
0089         }
0090     }
0091     if (languageCodes.empty() && m_languages.size() != 0) {
0092         languageCodes.append(m_languages.constFirst().code.toStdString());
0093     }
0094     return languageCodes;
0095 }
0096 
0097 #include "moc_OCRLanguageModel.cpp"