File indexing completed on 2024-03-24 03:53:59
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"