File indexing completed on 2024-04-28 07:39:33

0001 /*
0002     SPDX-FileCopyrightText: 2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "statisticsmodel.h"
0007 #include "statisticslegendwidget.h"
0008 #include "utils.h"
0009 
0010 #include <KEduVocExpression>
0011 #include <KEduVocTranslation>
0012 #include <KEduVocWordtype>
0013 #include <KLocalizedString>
0014 #include <QDebug>
0015 #include <QGradient>
0016 
0017 StatisticsModel::StatisticsModel(QObject *parent)
0018     : ContainerModel(KEduVocContainer::Lesson, parent)
0019 {
0020 }
0021 
0022 QVariant StatisticsModel::headerData(int section, Qt::Orientation orientation, int role) const
0023 {
0024     if (section >= FirstDataColumn) {
0025         if (role == Qt::DisplayRole && m_doc->identifierCount() > (section - FirstDataColumn)) {
0026             return i18nc("Confidence level in language, table header", "Confidence (%1)", m_doc->identifier(section - FirstDataColumn).name());
0027         }
0028     }
0029     return ContainerModel::headerData(section, orientation, role);
0030 }
0031 
0032 QVariant StatisticsModel::data(const QModelIndex &index, int role) const
0033 {
0034     Q_ASSERT(!m_documentSettings.isEmpty());
0035 
0036     KEduVocContainer *container = static_cast<KEduVocContainer *>(index.internalPointer());
0037 
0038     // Entrie count
0039     if (index.column() == TotalCountColumn) {
0040         if (role == Qt::DisplayRole) {
0041             switch (Prefs::practiceDirection()) {
0042             case Prefs::EnumPracticeDirection::KnownToLearning:
0043                 return entryCountForPracticeMode(container, Prefs::learningLanguage());
0044             case Prefs::EnumPracticeDirection::LearningToKnown:
0045                 return entryCountForPracticeMode(container, Prefs::knownLanguage());
0046             case Prefs::EnumPracticeDirection::MixedDirectionsWordsOnly:
0047             case Prefs::EnumPracticeDirection::MixedDirectionsWithSound:
0048                 return entryCountForPracticeMode(container, Prefs::knownLanguage()) + entryCountForPracticeMode(container, Prefs::learningLanguage());
0049             default:
0050                 return entryCountForPracticeMode(container, Prefs::learningLanguage());
0051             }
0052         }
0053         if (role == Qt::TextAlignmentRole) {
0054             return Qt::AlignRight;
0055         }
0056     }
0057 
0058     // Colorbars
0059     if (index.column() >= FirstDataColumn) {
0060         int translation = index.column() - FirstDataColumn;
0061         switch (role) {
0062         case Container: {
0063             // Return a pointer to the container we are working on.
0064             QVariant var;
0065             var.setValue(container);
0066             return var;
0067         }
0068         case TotalPercent: // Average grade
0069             return averageGradeForPracticeMode(container, translation);
0070         case TotalCount:
0071             return entryCountForPracticeMode(container, translation);
0072         case ActiveConjugationTenses:
0073             return m_documentSettings.at(translation)->conjugationTenses();
0074         default:
0075             if ((role >= Grade0) && (role <= Grade7)) {
0076                 return expressionsOfGradeForPracticeMode(container, translation, role - Grade0);
0077             }
0078         }
0079     }
0080 
0081     // Checkboxes
0082     if (index.column() == 0 && role == Qt::CheckStateRole) {
0083         if (container->inPractice()) {
0084             return Qt::Checked;
0085         } else {
0086             return Qt::Unchecked;
0087         }
0088     }
0089 
0090     return ContainerModel::data(index, role);
0091 }
0092 
0093 int StatisticsModel::averageGradeForPracticeMode(KEduVocContainer *container, int translation) const
0094 {
0095     if (m_documentSettings.size() <= translation) {
0096         return 0;
0097     }
0098     WordCount wordCount;
0099     wordCount.fillFromContainerForPracticeMode(*container, translation, m_documentSettings.at(translation)->conjugationTenses());
0100     return wordCount.percentageCompleted();
0101 }
0102 
0103 int StatisticsModel::entryCountForPracticeMode(KEduVocContainer *container, int translation) const
0104 {
0105     if (m_documentSettings.size() <= translation) {
0106         return 0;
0107     }
0108     WordCount wordCount;
0109     wordCount.fillFromContainerForPracticeMode(*container, translation, m_documentSettings.at(translation)->conjugationTenses());
0110     return wordCount.totalWords - wordCount.invalid;
0111 }
0112 
0113 int StatisticsModel::expressionsOfGradeForPracticeMode(KEduVocContainer *container, int translation, grade_t grade) const
0114 {
0115     if (m_documentSettings.size() <= translation) {
0116         return 0;
0117     }
0118     WordCount wordCount;
0119     wordCount.fillFromContainerForPracticeMode(*container, translation, m_documentSettings.at(translation)->conjugationTenses());
0120     return wordCount.grades[grade];
0121 }
0122 
0123 Qt::ItemFlags StatisticsModel::flags(const QModelIndex &index) const
0124 {
0125     if (index.isValid()) {
0126         if (index.column() == 0) {
0127             return (Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
0128         }
0129         return (Qt::ItemIsEnabled | Qt::ItemIsSelectable);
0130     }
0131     return Qt::NoItemFlags;
0132 }
0133 
0134 int StatisticsModel::columnCount(const QModelIndex &parent) const
0135 {
0136     Q_UNUSED(parent)
0137     return m_doc->identifierCount() + FirstDataColumn;
0138 }
0139 
0140 Qt::DropActions StatisticsModel::supportedDragActions() const
0141 {
0142     return Qt::IgnoreAction;
0143 }
0144 
0145 KEduVocContainer *StatisticsModel::rootContainer() const
0146 {
0147     if (!m_doc) {
0148         return nullptr;
0149     }
0150     return m_doc->lesson();
0151 }
0152 
0153 void StatisticsModel::loadDocumentsSettings()
0154 {
0155     m_documentSettings.clear();
0156     if (!m_doc) {
0157         return;
0158     }
0159     for (int i = 0; i < m_doc->identifierCount(); ++i) {
0160         m_documentSettings << QSharedPointer<DocumentSettings>(new DocumentSettings(m_doc->url().url() + QString::number(i)));
0161         m_documentSettings.last()->load();
0162     }
0163 }
0164 
0165 void StatisticsModel::setDocument(const std::shared_ptr<KEduVocDocument> &doc)
0166 {
0167     beginResetModel();
0168     m_doc = doc;
0169     loadDocumentsSettings();
0170     endResetModel();
0171 }
0172 
0173 void StatisticsModel::updateDocumentSettings()
0174 {
0175     beginResetModel();
0176     loadDocumentsSettings();
0177     endResetModel();
0178 }
0179 
0180 std::shared_ptr<KEduVocDocument> StatisticsModel::document() const
0181 {
0182     return m_doc;
0183 }
0184 
0185 #include "moc_statisticsmodel.cpp"