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"