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 }