File indexing completed on 2024-04-21 03:51:09
0001 /* 0002 SPDX-FileCopyrightText: 2008-2010 Frederik Gladhorn <gladhorn@kde.org> 0003 SPDX-FileCopyrightText: 2008 Daniel Laidig <d.laidig@gmx.de> 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "statisticsmainwindow.h" 0008 0009 #include <QHeaderView> 0010 0011 #include <KActionCollection> 0012 #include <KConfig> 0013 #include <KLocalizedString> 0014 0015 #include <KEduVocDocument> 0016 0017 #include "lessonstatisticsview.h" 0018 #include "parleyactions.h" 0019 #include "parleymainwindow.h" 0020 #include "practice/configure/configurepracticedialog.h" 0021 #include "statisticsmodel.h" 0022 0023 #include "prefs.h" 0024 0025 #include "conjugationoptions.h" 0026 #include "ui_statisticsmainwindow.h" 0027 0028 StatisticsMainWindow::StatisticsMainWindow(const std::shared_ptr<KEduVocDocument> &doc, ParleyMainWindow *parent) 0029 : KXmlGuiWindow(parent) 0030 , m_mainWindow(parent) 0031 , m_doc(doc) 0032 , m_ui(new Ui::StatisticsMainWindow) 0033 { 0034 // KXmlGui 0035 setXMLFile(QStringLiteral("statisticsui.rc")); 0036 setObjectName(QStringLiteral("Statistics")); 0037 0038 QWidget *mainWidget = new QWidget(this); 0039 setCentralWidget(mainWidget); 0040 m_ui->setupUi(mainWidget); 0041 // m_ui->caption->setText(i18nc("caption for an overview of the confidence levels for a document" 0042 // "Statistics for \"%1\"", m_doc->title())); 0043 m_statisticsModel = new StatisticsModel(this); 0044 0045 setDocument(doc); 0046 initActions(); 0047 initPracticeModeSelection(); 0048 initLanguages(); 0049 initPracticeMode(); 0050 0051 KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("parleyrc")), objectName()); 0052 applyMainWindowSettings(cfg); 0053 } 0054 0055 StatisticsMainWindow::~StatisticsMainWindow() 0056 { 0057 if (m_conjugationOptions) { 0058 m_conjugationOptions->updateSettings(); 0059 } 0060 KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("parleyrc")), objectName()); 0061 saveMainWindowSettings(cfg); 0062 delete m_ui; 0063 } 0064 0065 void StatisticsMainWindow::syncConfig() 0066 { 0067 // qDebug() << "save tenses"; 0068 if (m_conjugationOptions) { 0069 m_conjugationOptions->updateSettings(); 0070 } 0071 } 0072 0073 void StatisticsMainWindow::setDocument(const std::shared_ptr<KEduVocDocument> &doc) 0074 { 0075 m_doc = doc; 0076 m_statisticsModel->setDocument(doc); 0077 m_ui->lessonStatistics->setModel(m_statisticsModel); 0078 m_ui->lessonStatistics->restoreExpandedStatus(); 0079 m_ui->lessonStatistics->resizeColumnToContents(0); 0080 } 0081 0082 void StatisticsMainWindow::initActions() 0083 { 0084 ParleyActions::create(ParleyActions::EnterEditMode, m_mainWindow, SLOT(showEditor()), actionCollection()); 0085 ParleyActions::create(ParleyActions::StartPractice, m_mainWindow, SLOT(startPractice()), actionCollection()); 0086 ParleyActions::create(ParleyActions::ConfigurePractice, m_mainWindow, SLOT(configurePractice()), actionCollection()); 0087 } 0088 0089 void StatisticsMainWindow::initPracticeModeSelection() 0090 { 0091 switch (Prefs::practiceMode()) { 0092 case Prefs::EnumPracticeMode::FlashCardsPractice: 0093 m_ui->flashCard->setChecked(true); 0094 break; 0095 case Prefs::EnumPracticeMode::MixedLettersPractice: 0096 m_ui->mixedLetters->setChecked(true); 0097 break; 0098 case Prefs::EnumPracticeMode::MultipleChoicePractice: 0099 m_ui->multipleChoice->setChecked(true); 0100 break; 0101 case Prefs::EnumPracticeMode::WrittenPractice: 0102 m_ui->written->setChecked(true); 0103 break; 0104 case Prefs::EnumPracticeMode::ExampleSentencesPractice: 0105 m_ui->exampleSentence->setChecked(true); 0106 break; 0107 case Prefs::EnumPracticeMode::GenderPractice: 0108 m_ui->gender->setChecked(true); 0109 break; 0110 case Prefs::EnumPracticeMode::ComparisonPractice: 0111 m_ui->comparisonForms->setChecked(true); 0112 break; 0113 case Prefs::EnumPracticeMode::ConjugationPractice: 0114 m_ui->conjugations->setChecked(true); 0115 showConjugationOptions(); 0116 break; 0117 default: 0118 break; 0119 } 0120 connect(m_ui->flashCard, &QRadioButton::clicked, this, [=] { 0121 practiceModeSelected(Prefs::EnumPracticeMode::FlashCardsPractice); 0122 }); 0123 connect(m_ui->mixedLetters, &QRadioButton::clicked, this, [=] { 0124 practiceModeSelected(Prefs::EnumPracticeMode::MixedLettersPractice); 0125 }); 0126 connect(m_ui->multipleChoice, &QRadioButton::clicked, this, [=] { 0127 practiceModeSelected(Prefs::EnumPracticeMode::MultipleChoicePractice); 0128 }); 0129 connect(m_ui->written, &QRadioButton::clicked, this, [=] { 0130 practiceModeSelected(Prefs::EnumPracticeMode::WrittenPractice); 0131 }); 0132 connect(m_ui->exampleSentence, &QRadioButton::clicked, this, [=] { 0133 practiceModeSelected(Prefs::EnumPracticeMode::ExampleSentencesPractice); 0134 }); 0135 connect(m_ui->gender, &QRadioButton::clicked, this, [=] { 0136 practiceModeSelected(Prefs::EnumPracticeMode::GenderPractice); 0137 }); 0138 connect(m_ui->comparisonForms, &QRadioButton::clicked, this, [=] { 0139 practiceModeSelected(Prefs::EnumPracticeMode::ComparisonPractice); 0140 }); 0141 connect(m_ui->conjugations, &QRadioButton::clicked, this, [=] { 0142 practiceModeSelected(Prefs::EnumPracticeMode::ConjugationPractice); 0143 }); 0144 } 0145 0146 void StatisticsMainWindow::initLanguages() 0147 { 0148 // qDebug() << "init languages: " << Prefs::learningLanguage() << Prefs::knownLanguage(); 0149 const int totalNumLanguages = m_doc->identifierCount(); 0150 0151 if (Prefs::knownLanguage() < 0 || totalNumLanguages <= Prefs::knownLanguage()) { 0152 Prefs::setKnownLanguage(0); 0153 } 0154 if (Prefs::learningLanguage() < 0 || totalNumLanguages <= Prefs::learningLanguage()) { 0155 Prefs::setLearningLanguage(0); 0156 } 0157 0158 if (Prefs::knownLanguage() >= totalNumLanguages || Prefs::learningLanguage() >= totalNumLanguages || Prefs::learningLanguage() == Prefs::knownLanguage()) { 0159 Prefs::setKnownLanguage(0); 0160 Prefs::setLearningLanguage(1); 0161 // qDebug() << "Invalid language selection."; 0162 } 0163 0164 // Insert data into the comboboxes. 0165 for (int i = 0; i < totalNumLanguages; ++i) { 0166 m_ui->learnedLanguage->insertItem(i, m_doc->identifier(i).name()); 0167 m_ui->knownLanguage->insertItem(i, m_doc->identifier(i).name()); 0168 } 0169 m_ui->learnedLanguage->setCurrentIndex(Prefs::learningLanguage()); 0170 m_ui->knownLanguage->setCurrentIndex(Prefs::knownLanguage()); 0171 0172 connect(m_ui->learnedLanguage, SIGNAL(currentIndexChanged(int)), SLOT(languagesChanged())); 0173 connect(m_ui->knownLanguage, SIGNAL(currentIndexChanged(int)), SLOT(languagesChanged())); 0174 0175 languagesChanged(); 0176 } 0177 0178 void StatisticsMainWindow::languagesChanged() 0179 { 0180 int knownLanguage = m_ui->knownLanguage->currentIndex(); 0181 int learningLanguage = m_ui->learnedLanguage->currentIndex(); 0182 Prefs::setLearningLanguage(learningLanguage); 0183 Prefs::setKnownLanguage(knownLanguage); 0184 0185 Q_EMIT languagesChanged(knownLanguage, learningLanguage); 0186 0187 updateVisibleColumns(); 0188 updateModelSettings(); 0189 } 0190 0191 void StatisticsMainWindow::initPracticeMode() 0192 { 0193 m_ui->practiceDirection->insertItem(0, i18n("Known to Learning")); 0194 m_ui->practiceDirection->insertItem(1, i18n("Learning to Known")); 0195 m_ui->practiceDirection->insertItem(2, i18n("Mixed Directions")); 0196 // m_ui->practiceDirection->insertItem(3, i18n("Mixed Directions with Sound")); 0197 0198 int practiceDirection(Prefs::rememberPracticeDirection() ? practiceDirectionForPracticeMode(Prefs::practiceMode()) : Prefs::practiceDirection()); 0199 0200 if (practiceDirection < 0 || 3 < practiceDirection) 0201 Prefs::setPracticeDirection(Prefs::EnumPracticeDirection::MixedDirectionsWordsOnly); 0202 0203 m_ui->practiceDirection->setCurrentIndex(practiceDirection); 0204 connect(m_ui->practiceDirection, 0205 static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), 0206 this, 0207 &StatisticsMainWindow::practiceDirectionChanged); 0208 0209 m_ui->rememberPracticeDirection->setChecked(Prefs::rememberPracticeDirection()); 0210 connect(m_ui->rememberPracticeDirection, &QCheckBox::toggled, this, &StatisticsMainWindow::rememberPracticeDirectionChanged); 0211 } 0212 0213 void StatisticsMainWindow::practiceModeSelected(int mode) 0214 { 0215 int previousPracticeMode = Prefs::practiceMode(); 0216 Prefs::setPracticeMode(static_cast<Prefs::EnumPracticeMode::type>(mode)); 0217 // qDebug() << "mode: " << mode << Prefs::practiceMode(); 0218 0219 showConjugationOptions(mode == Prefs::EnumPracticeMode::ConjugationPractice); 0220 0221 if (Prefs::rememberPracticeDirection()) { 0222 setPracticeDirectionForPracticeMode(Prefs::practiceDirection(), previousPracticeMode); 0223 m_ui->practiceDirection->setCurrentIndex(practiceDirectionForPracticeMode(mode)); 0224 } 0225 0226 updateModelSettings(); 0227 } 0228 0229 void StatisticsMainWindow::practiceDirectionChanged(int mode) 0230 { 0231 // qDebug() << "new practice direction:" << mode; 0232 Prefs::setPracticeDirection(static_cast<Prefs::EnumPracticeDirection::type>(mode)); 0233 if (Prefs::rememberPracticeDirection()) { 0234 setPracticeDirectionForPracticeMode(mode, Prefs::practiceMode()); 0235 } 0236 updateVisibleColumns(); 0237 updateModelSettings(); 0238 } 0239 0240 void StatisticsMainWindow::rememberPracticeDirectionChanged(bool checked) 0241 { 0242 // qDebug() << "remember practice direction changed to: " << checked; 0243 Prefs::setRememberPracticeDirection(checked); 0244 if (checked) { 0245 setPracticeDirectionForPracticeMode(Prefs::practiceDirection(), Prefs::practiceMode()); 0246 } 0247 } 0248 0249 void StatisticsMainWindow::updateVisibleColumns() 0250 { 0251 bool isHidden; 0252 for (int i = ContainerModel::FirstDataColumn; i < m_ui->lessonStatistics->header()->count(); i++) { 0253 int iLang = i - ContainerModel::FirstDataColumn; 0254 0255 switch (Prefs::practiceDirection()) { 0256 case Prefs::EnumPracticeDirection::LearningToKnown: 0257 isHidden = iLang != Prefs::knownLanguage(); 0258 break; 0259 case Prefs::EnumPracticeDirection::MixedDirectionsWordsOnly: 0260 case Prefs::EnumPracticeDirection::MixedDirectionsWithSound: 0261 isHidden = iLang != Prefs::knownLanguage() && iLang != Prefs::learningLanguage(); 0262 break; 0263 case Prefs::EnumPracticeDirection::KnownToLearning: 0264 // Use KnownToLearning as default. 0265 default: 0266 isHidden = iLang != Prefs::learningLanguage(); 0267 break; 0268 } 0269 0270 m_ui->lessonStatistics->setColumnHidden(i, isHidden); 0271 m_ui->lessonStatistics->adjustColumnWidths(); 0272 } 0273 } 0274 0275 void StatisticsMainWindow::showConjugationOptions(bool visible) 0276 { 0277 if (!m_conjugationOptions && !visible) { 0278 return; 0279 } 0280 0281 if (!m_conjugationOptions) { 0282 m_conjugationOptions = new ConjugationOptions(m_doc.get(), m_ui->modeSpecificOptions); 0283 QHBoxLayout *layout = new QHBoxLayout(m_ui->modeSpecificOptions); 0284 layout->setContentsMargins(0, 0, 0, 0); 0285 layout->addWidget(m_conjugationOptions); 0286 connect(this, QOverload<int, int>::of(&StatisticsMainWindow::languagesChanged), m_conjugationOptions, &ConjugationOptions::setLanguages); 0287 m_conjugationOptions->setLanguages(Prefs::knownLanguage(), Prefs::learningLanguage()); 0288 connect(m_conjugationOptions, &ConjugationOptions::checkBoxChanged, this, &StatisticsMainWindow::updateModelSettings); 0289 } 0290 m_conjugationOptions->setVisible(visible); 0291 } 0292 0293 void StatisticsMainWindow::configurePractice() 0294 { 0295 ConfigurePracticeDialog dialog(m_doc.get(), this, QStringLiteral("practice settings"), Prefs::self()); 0296 dialog.exec(); 0297 } 0298 0299 int StatisticsMainWindow::practiceDirectionForPracticeMode(int mode) const 0300 { 0301 int direction = Prefs::practiceDirectionsByPracticeMode().value(mode, Prefs::practiceDirection()); 0302 if ((direction < 0) || (direction > Prefs::EnumPracticeDirection::MixedDirectionsWordsOnly)) { 0303 direction = Prefs::EnumPracticeDirection::MixedDirectionsWordsOnly; 0304 } 0305 return direction; 0306 } 0307 0308 void StatisticsMainWindow::setPracticeDirectionForPracticeMode(int direction, int mode) 0309 { 0310 QList<int> directions = Prefs::practiceDirectionsByPracticeMode(); 0311 // Expand list if fields not used before 0312 for (int i = directions.size() - 1; i < mode; ++i) { 0313 directions.append(Prefs::practiceDirection()); 0314 } 0315 directions[mode] = direction; 0316 Prefs::setPracticeDirectionsByPracticeMode(directions); 0317 } 0318 0319 void StatisticsMainWindow::updateModelSettings() 0320 { 0321 m_ui->lessonStatistics->saveExpandedStatus(); 0322 m_statisticsModel->updateDocumentSettings(); 0323 m_ui->lessonStatistics->restoreExpandedStatus(); 0324 } 0325 0326 #include "moc_statisticsmainwindow.cpp"