File indexing completed on 2023-05-30 10:45:27

0001 /*
0002     SPDX-FileCopyrightText: 2010 Peter Hedlund <peter.hedlund@kdemail.net>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "kwqtutor.h"
0007 
0008 #include <QAction>
0009 #include <QFileDialog>
0010 #include <QMenu>
0011 #include <QPointer>
0012 #include <QTimer>
0013 #include <QRandomGenerator>
0014 
0015 #include <KLocalizedString>
0016 #include <KMessageBox>
0017 #include <KStandardAction>
0018 
0019 #include "keduvoclesson.h"
0020 #include "keduvocexpression.h"
0021 #include "kwqtutorprefs.h"
0022 #include "prefs.h"
0023 
0024 KWQTutor::KWQTutor(const QUrl &fileToOpen, QWidget *parent) : KStatusNotifierItem(parent)
0025 {
0026   KMessageBox::information(0, i18n("<qt>KWordQuiz Tutor displays flashcards on your screen in a way that allows "
0027                            "you to set a certain time interval at which flashcards will pop up.<br /><br />"
0028                            "The flashcards pop up in a non-intrusive way allowing you to carry on working "
0029                            "without stealing the focus from other programs you might be working with.<br /><br />"
0030                            "Be sure to right-click KWordQuiz Tutor icon on the panel and select Preferences. "
0031                            "There you can assign keyboard shortcuts.</qt>"),
0032                            i18n("Tutor"), QStringLiteral("firstTutorRun"));
0033 
0034   m_isRunning = false;
0035 
0036   setIconByName(QStringLiteral("kwordquiz"));
0037   connect (this, SIGNAL(quitSelected()),this, SLOT(quit()));
0038 
0039   QAction * a;
0040   QMenu * menu = new QMenu();
0041 
0042   m_tutorStartAction = new QAction(menu);
0043   m_tutorStartAction->setText(i18n("Start Exercise"));
0044   m_tutorStartAction->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0045   connect (m_tutorStartAction, &QAction::triggered, this,  &KWQTutor::startStopPressed);
0046   addAction(QStringLiteral("tutor_start"), m_tutorStartAction);
0047   menu->addAction(m_tutorStartAction);
0048 
0049   a = KStandardAction::open(this, SLOT(loadFile()), this);
0050   menu->addAction(a);
0051 
0052   a = KStandardAction::preferences(this, SLOT(showPrefMenu()), this);
0053   a->setText(i18n("Configure KWordQuiz Tutor..."));
0054   menu->addAction(a);
0055 
0056   m_globalCollection = new KActionCollection(this);
0057   a = m_globalCollection->addAction(QStringLiteral("kwq_close_flash_card"));
0058   a->setText(i18n("Close Flash Card"));
0059   //a->setGlobalShortcut(KShortcut(Qt::CTRL | Qt::ALT | Qt::Key_J));
0060   connect (a, &QAction::triggered, this, &KWQTutor::closeFlashcard);
0061 
0062   a = m_globalCollection->addAction(QStringLiteral("kwq_flip_flash_card"));
0063   a->setText(i18n("Flip Flash Card"));
0064   //a->setGlobalShortcut(KShortcut(Qt::CTRL | Qt::ALT | Qt::Key_H));
0065   connect (a, &QAction::triggered, this, &KWQTutor::flipFlashcard);
0066 
0067   m_timer = new QTimer;
0068   connect (m_timer, &QTimer::timeout, this, &KWQTutor::updateTimer);
0069 
0070   m_flashcard = new KWQTutorFlashCard();
0071 
0072   m_tutorDoc = new KEduVocDocument();
0073   if (fileToOpen.isEmpty())
0074     m_tutorDoc->open(QUrl(Prefs::lastVocabFile()));
0075   else {
0076     m_tutorDoc->open(fileToOpen);
0077     Prefs::setLastVocabFile(fileToOpen.toLocalFile());
0078   }
0079   setContextMenu(menu);
0080 
0081   if (Prefs::startExerciseAsSoonAsFileIsLoaded() && !fileToOpen.isEmpty()) //starting immediately?
0082       startStopPressed();
0083 }
0084 
0085 KWQTutor::~KWQTutor()
0086 {
0087 }
0088 
0089 void KWQTutor::updateTimer()
0090 {
0091   int interval = 0;
0092   if (Prefs::tutorTiming() == Prefs::EnumTutorTiming::FixedInterval)
0093     interval = Prefs::tutorEvery();
0094   else if (Prefs::tutorTiming() == Prefs::EnumTutorTiming::RandomInterval) {
0095     interval = QRandomGenerator::global()->bounded(Prefs::tutorMin(), Prefs::tutorMax());
0096   }
0097   qDebug() << interval;
0098   m_timer->start(1000 * 60 * interval);
0099   if (!m_flashcard->isVisible())
0100     showFlashcard(QRandomGenerator::global()->bounded(m_tutorDoc->lesson()->entryCount(KEduVocLesson::Recursive) - 1));
0101 }
0102 
0103 void KWQTutor::startStopPressed()
0104 {
0105   if (!m_isRunning && m_tutorDoc->lesson()->entryCount(KEduVocLesson::Recursive))  //make sure the file's not empty
0106   {
0107     m_isRunning = true;
0108     m_tutorStartAction->setText(i18n("Stop Exercise"));
0109     m_tutorStartAction->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-stop")));
0110     updateTimer();
0111     return;
0112   }
0113   if (m_isRunning)
0114   {
0115     m_timer->stop();
0116     m_tutorStartAction->setText(i18n("Start Exercise"));
0117     m_tutorStartAction->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0118     m_isRunning = false;
0119     m_flashcard->setVisible(false);
0120     Prefs::setTutorFlashCardGeometry(m_flashcard->geometry());
0121   }
0122 }
0123 
0124 void KWQTutor::loadFile()
0125 {
0126   QString filter = KEduVocDocument::pattern(KEduVocDocument::Reading);
0127   QPointer<QFileDialog> fd = new QFileDialog(nullptr, i18n("Open Vocabulary Document"), QString(), filter);
0128   fd->setFileMode(QFileDialog::ExistingFiles);
0129   if (fd->exec() == QDialog::Accepted)
0130   {
0131     m_tutorDoc->open(fd->selectedUrls().at(0));
0132     Prefs::setLastVocabFile(fd->selectedUrls().at(0).toLocalFile());
0133     if (Prefs::startExerciseAsSoonAsFileIsLoaded())
0134       startStopPressed();
0135   }
0136   delete fd;
0137 }
0138 
0139 void KWQTutor::showPrefMenu()
0140 {
0141   if (KWQTutorPrefs::showDialog(QStringLiteral("settings")))
0142     return;
0143 
0144   //KConfigDialog didn't find an instance of this dialog, so lets create it :
0145   KWQTutorPrefs* dialog = new KWQTutorPrefs(0, QStringLiteral("settings"),  Prefs::self(), m_globalCollection);
0146   connect(dialog, &KConfigDialog::settingsChanged, this, &KWQTutor::slotApplyPreferences);
0147   dialog->show();
0148 }
0149 
0150 void KWQTutor::slotApplyPreferences()
0151 {
0152   m_flashcard->init();
0153 }
0154 
0155 void KWQTutor::flipFlashcard()
0156 {
0157   m_currentColumn == 0 ? m_currentColumn = 1 : m_currentColumn = 0;
0158   QVariant entry (m_tutorDoc->lesson()->entry(m_currentEntry, KEduVocLesson::Recursive)->translation(m_currentColumn)->text());
0159   m_flashcard->setText(entry.toString());
0160 }
0161 
0162 void KWQTutor::closeFlashcard()
0163 {
0164   m_flashcard->close();
0165 }
0166 
0167 void KWQTutor::showFlashcard(int numberShowing)
0168 {
0169   m_currentColumn = 0;
0170   QVariant entry (m_tutorDoc->lesson()->entry(numberShowing, KEduVocLesson::Recursive)->translation(m_currentColumn)->text());
0171   m_flashcard->setText((entry).toString());
0172   m_flashcard->setGeometry(Prefs::tutorFlashCardGeometry());
0173   m_flashcard->show();
0174   m_currentEntry = numberShowing;
0175 }
0176 
0177 void KWQTutor::quit()
0178 {
0179   Prefs::self()->save();
0180 }