File indexing completed on 2022-11-29 18:12:05

0001 /*
0002     SPDX-FileCopyrightText: 2004 Sebastian Stein <seb.kde@hpfsc.de>
0003     SPDX-FileCopyrightText: 2008 Tadeu Araujo <tadeu.araujo@ltia.fc.unesp.br>
0004     SPDX-FileCopyrightText: 2008 Danilo Balzaque <danilo.balzaque@ltia.fc.unesp.br>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "ExerciseFactorize.h"
0010 
0011 /* these includes are needed for KDE support */
0012 #include <KLocalizedString>
0013 
0014 /* these includes are needed for Qt support */
0015 #include <QApplication>
0016 #include <QGridLayout>
0017 #include <QLabel>
0018 #include <QPushButton>
0019 #include <QRandomGenerator>
0020 
0021 #ifdef DEBUG
0022 #include <QDebug>
0023 #endif
0024 
0025 /* standard C++ library includes */
0026 #include <cstdlib>
0027 
0028 #include "PrimeNumber.h"
0029 #include "RationalWidget.h"
0030 #include "settingsclass.h"
0031 
0032 /* ----- public member functions ----- */
0033 
0034 /* constructor */
0035 ExerciseFactorize::ExerciseFactorize(QWidget * parent) :
0036     ExerciseBase(parent)
0037 {
0038 #ifdef DEBUG
0039     qDebug() << QStringLiteral("constructor ExerciseFactorize()");
0040 #endif
0041 
0042     /* create a new task */
0043     QApplication::setOverrideCursor(Qt::WaitCursor);  /* show the sand clock */
0044     createTask();
0045     QApplication::restoreOverrideCursor(); /* show the normal cursor */
0046 
0047     // the next thing to do on a button click would be to check the entered
0048     // result
0049     m_currentState = _CHECK_TASK;
0050 
0051     QFont defaultFont = SettingsClass::taskFont();
0052 
0053     taskWidget = new QWidget(this);
0054     taskWidget->setObjectName(QStringLiteral("taskWidget"));
0055     checkWidget = new QWidget(this);
0056     checkWidget->setObjectName(QStringLiteral("checkWidget"));
0057 
0058     baseGrid = new QGridLayout(this);
0059     baseGrid->setObjectName(QStringLiteral("baseGrid"));
0060     baseGrid->setColumnStretch(0, 1);
0061 
0062     baseGrid->addWidget(taskWidget, 0, 0);
0063     baseGrid->addWidget(checkWidget, 0, 1);
0064 
0065     taskLayout = new QGridLayout(taskWidget);
0066     taskLayout->setObjectName(QStringLiteral("taskLayout"));
0067     taskLayout->setRowStretch(0, 1);
0068     taskLayout->setRowStretch(6, 1);
0069     taskLayout->setColumnStretch(0, 1);
0070     taskLayout->setColumnStretch(7, 1);
0071 
0072     checkLayout = new QGridLayout(checkWidget);
0073     checkLayout->setObjectName(QStringLiteral("checkLayout"));
0074 
0075     m_taskLabel = new QLabel(this);
0076     m_taskLabel->setObjectName(QStringLiteral("taskLabel"));
0077     m_taskLabel->setFont(defaultFont);
0078     taskLayout->addWidget(m_taskLabel, 1, 1);
0079 
0080     defaultFont.setBold(true);
0081 
0082     m_equalSignLabel = new QLabel(this);
0083     m_equalSignLabel->setObjectName(QStringLiteral("equalSignLabel"));
0084     m_equalSignLabel->setText(QStringLiteral("="));
0085     m_equalSignLabel->setFont(defaultFont);
0086     taskLayout->addWidget(m_equalSignLabel, 1, 2);
0087 
0088     m_factorsEnteredEdit = new PrimeFactorsLineEdit(this);
0089     m_factorsEnteredEdit->setObjectName(QStringLiteral("factorsEnteredEdit"));
0090     QPalette pal;
0091     pal.setColor(m_factorsEnteredEdit->foregroundRole(), QColor(0, 0, 0));
0092     //m_factorsEnteredEdit->setPalette (pal);
0093     m_factorsEnteredEdit->setFont(defaultFont);
0094     m_factorsEnteredEdit->setFixedSize(320, 35);
0095     taskLayout->addWidget(m_factorsEnteredEdit, 1, 3, 1, 5);
0096 
0097     connect(m_factorsEnteredEdit, &PrimeFactorsLineEdit::contentIsRight, this, &ExerciseFactorize::editContentChanged);
0098     connect(m_factorsEnteredEdit, &PrimeFactorsLineEdit::returnPressed, this, &ExerciseFactorize::slotFactorsEditReturnPressed);
0099 
0100     defaultFont.setPointSize(10);
0101 
0102     m_factor2Button = new QPushButton(this);
0103     m_factor2Button->setObjectName(QStringLiteral("factor2Button"));
0104     m_factor2Button->setFixedSize(50, 35);
0105     m_factor2Button->setFont(defaultFont);
0106     taskLayout->addWidget(m_factor2Button, 4, 3);
0107 
0108     m_factor3Button = new QPushButton(this);
0109     m_factor3Button->setObjectName(QStringLiteral("factor3Button"));
0110     m_factor3Button->setFixedSize(50, 35);
0111     m_factor3Button->setFont(defaultFont);
0112     taskLayout->addWidget(m_factor3Button, 4, 4);
0113 
0114     m_factor5Button = new QPushButton(this);
0115     m_factor5Button->setObjectName(QStringLiteral("factor5Button"));
0116     m_factor5Button->setFixedSize(50, 35);
0117     m_factor5Button->setFont(defaultFont);
0118     taskLayout->addWidget(m_factor5Button, 4, 5);
0119 
0120     m_factor7Button = new QPushButton(this);
0121     m_factor7Button->setObjectName(QStringLiteral("factor7Button"));
0122     m_factor7Button->setFixedSize(50, 35);
0123     m_factor7Button->setFont(defaultFont);
0124     taskLayout->addWidget(m_factor7Button, 4, 6);
0125 
0126     m_factor11Button = new QPushButton(this);
0127     m_factor11Button->setObjectName(QStringLiteral("factor11Button"));
0128     m_factor11Button->setFixedSize(50, 35);
0129     m_factor11Button->setFont(defaultFont);
0130     taskLayout->addWidget(m_factor11Button, 5, 3);
0131 
0132     m_factor13Button = new QPushButton(this);
0133     m_factor13Button->setObjectName(QStringLiteral("factor13Button"));
0134     m_factor13Button->setFixedSize(50, 35);
0135     m_factor13Button->setFont(defaultFont);
0136     taskLayout->addWidget(m_factor13Button, 5, 4);
0137 
0138     m_factor17Button = new QPushButton(this);
0139     m_factor17Button->setObjectName(QStringLiteral("factor17Button"));
0140     m_factor17Button->setFixedSize(50, 35);
0141     m_factor17Button->setFont(defaultFont);
0142     taskLayout->addWidget(m_factor17Button, 5, 5);
0143 
0144     m_factor19Button = new QPushButton(this);
0145     m_factor19Button->setObjectName(QStringLiteral("factor19Button"));
0146     m_factor19Button->setFixedSize(50, 35);
0147     m_factor19Button->setFont(defaultFont);
0148     taskLayout->addWidget(m_factor19Button, 5, 6);
0149 
0150     m_removeLastFactorButton = new QPushButton(this);
0151     m_removeLastFactorButton->setObjectName(QStringLiteral("removeLastFactor"));
0152     m_removeLastFactorButton->setFixedSize(115, 35);
0153     m_removeLastFactorButton->setFont(defaultFont);
0154     m_removeLastFactorButton->setText(i18n("Backspace"));
0155     taskLayout->addWidget(m_removeLastFactorButton, 3, 4, 1, 3, Qt::AlignRight);
0156 
0157     defaultFont.setPointSize(10);
0158 
0159     m_skipButton = new QPushButton(this);
0160     m_skipButton->setObjectName(QStringLiteral("m_skipButton"));
0161     m_skipButton->setText(i18n("&Skip"));
0162     m_skipButton->setToolTip(i18n("Click on this button to skip this question."));
0163     m_skipButton->setFont(defaultFont);
0164     QObject::connect(m_skipButton, &QPushButton::clicked, this, &ExerciseFactorize::slotSkipButtonClicked);
0165     checkLayout->addWidget(m_skipButton, 1, 1);
0166 
0167     // the check task button
0168     m_checkButton = new QPushButton(this);
0169     m_checkButton->setObjectName(QStringLiteral("m_checkButton"));
0170     m_checkButton->setText(i18n("&Check"));
0171     m_checkButton->setToolTip(i18n("Click on this button to check your result. The button will not work if you have not entered a result yet."));
0172     QObject::connect(m_checkButton, &QPushButton::clicked, this, &ExerciseFactorize::slotCheckButtonClicked);
0173     m_checkButton->setFont(defaultFont);
0174     m_checkButton->setDefault(true);  // is the default button of the dialog
0175     checkLayout->addWidget(m_checkButton, 1, 0);
0176 
0177     // next is the result widget
0178     m_resultWidget = new ResultWidget(this,  m_factorsResult);
0179     m_resultWidget->setObjectName(QStringLiteral("m_resultWidget"));
0180     checkLayout->addWidget(m_resultWidget, 0, 0, 1, 2);
0181 
0182     // the current task
0183     QString tmp_str;
0184     tmp_str.setNum(m_taskNumber);
0185     m_taskLabel->setText(tmp_str);
0186 
0187     // now set the color for the task label
0188     pal = QPalette();
0189     pal.setColor(m_taskLabel->foregroundRole(), SettingsClass::numberColor());
0190     m_taskLabel->setPalette(pal);
0191 
0192     // now set the color for the equal sign
0193     pal = QPalette();
0194     pal.setColor(m_equalSignLabel->foregroundRole(), SettingsClass::operationColor());
0195     m_equalSignLabel->setPalette(pal);
0196 
0197     // the prime factor buttons
0198     m_factor2Button->setText(i18n("2"));
0199     m_factor3Button->setText(i18n("3"));
0200     m_factor5Button->setText(i18n("5"));
0201     m_factor7Button->setText(i18n("7"));
0202     m_factor11Button->setText(i18n("11"));
0203     m_factor13Button->setText(i18n("13"));
0204     m_factor17Button->setText(i18n("17"));
0205     m_factor19Button->setText(i18n("19"));
0206     QObject::connect(m_factor2Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor2ButtonClicked);
0207     QObject::connect(m_factor3Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor3ButtonClicked);
0208     QObject::connect(m_factor5Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor5ButtonClicked);
0209     QObject::connect(m_factor7Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor7ButtonClicked);
0210     QObject::connect(m_factor11Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor11ButtonClicked);
0211     QObject::connect(m_factor13Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor13ButtonClicked);
0212     QObject::connect(m_factor17Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor17ButtonClicked);
0213     QObject::connect(m_factor19Button, &QPushButton::clicked, this, &ExerciseFactorize::slotFactor19ButtonClicked);
0214 
0215     // add tooltips to the factor buttons
0216     m_factor2Button->setToolTip(i18n("Add prime factor 2."));
0217     m_factor3Button->setToolTip(i18n("Add prime factor 3."));
0218     m_factor5Button->setToolTip(i18n("Add prime factor 5."));
0219     m_factor7Button->setToolTip(i18n("Add prime factor 7."));
0220     m_factor11Button->setToolTip(i18n("Add prime factor 11."));
0221     m_factor13Button->setToolTip(i18n("Add prime factor 13."));
0222     m_factor17Button->setToolTip(i18n("Add prime factor 17."));
0223     m_factor19Button->setToolTip(i18n("Add prime factor 19."));
0224 
0225     // the remove last factor button
0226     m_removeLastFactorButton->setEnabled(false);
0227     QObject::connect(m_removeLastFactorButton, &QPushButton::clicked, this, &ExerciseFactorize::slotRemoveLastFactorButtonClicked);
0228     m_removeLastFactorButton->setToolTip(i18n("Removes the last entered prime factor."));
0229 
0230     m_factor2Button->setFocusPolicy(Qt::NoFocus);
0231     m_factor3Button->setFocusPolicy(Qt::NoFocus);
0232     m_factor5Button->setFocusPolicy(Qt::NoFocus);
0233     m_factor7Button->setFocusPolicy(Qt::NoFocus);
0234     m_factor11Button->setFocusPolicy(Qt::NoFocus);
0235     m_factor13Button->setFocusPolicy(Qt::NoFocus);
0236     m_factor17Button->setFocusPolicy(Qt::NoFocus);
0237     m_factor19Button->setFocusPolicy(Qt::NoFocus);
0238     m_removeLastFactorButton->setFocusPolicy(Qt::NoFocus);
0239 
0240     setLayout(baseGrid);
0241     taskWidget->setLayout(taskLayout);
0242     checkWidget->setLayout(checkLayout);
0243 
0244     // add tooltip and qwhatsthis help to the widget
0245     setToolTip(i18n("In this exercise you have to factorize a given number."));
0246     setWhatsThis(i18n("In this exercise you have to factorize a given number. You have to enter all prime factors of the number. You can add a prime factor by clicking on the corresponding button. The chosen prime factors will be shown in the input field. Do not forget to enter all prime factors, even when a prime factor repeats several times. Click the 'Backspace' button to remove the last entered prime factor."));
0247 
0248     m_edit = true;
0249 }
0250 
0251 /* destructor */
0252 ExerciseFactorize::~ExerciseFactorize()
0253 {
0254 #ifdef DEBUG
0255     qDebug() << QStringLiteral("destructor ExerciseFactorize()");
0256 #endif
0257 
0258     /* no need to delete any child widgets, Qt does it by itself */
0259 }
0260 
0261 /** resets the current state, creates a new task and count the last task as
0262  * wrong, if it wasn't solved (in _NEXT_TASK state) yet
0263  * mainly used after changing the task parameters */
0264 void ExerciseFactorize::forceNewTask()
0265 {
0266 #ifdef DEBUG
0267     qDebug() << QStringLiteral("forceNewTask ExerciseFactorize()");
0268 #endif
0269 
0270     if (m_currentState == _CHECK_TASK) {
0271         // emit the signal for skipped
0272         Q_EMIT signalExerciseSkipped();
0273     }
0274     m_currentState = _CHECK_TASK;
0275     m_checkButton->setText(i18n("&Check"));
0276 
0277     // Maybe the skip button was clicked with while
0278     // wrong content was int the QLineEdit so...
0279     // Set the QLineEdit's background to white
0280     QPalette palette;
0281     palette.setColor(QPalette::Base, Qt::white);
0282     m_factorsEnteredEdit->setPalette(palette);
0283     // and enable all buttons that could be disabled.
0284     setButtonsEnabled(true);
0285 
0286     // generate next task
0287     (void) nextTask();
0288 }
0289 
0290 
0291 /* ------ public slots ------ */
0292 
0293 void ExerciseFactorize::update()
0294 {
0295     // now set the color for the task label
0296     QPalette pal;
0297     pal.setColor(m_taskLabel->foregroundRole(), SettingsClass::numberColor());
0298     m_taskLabel->setPalette(pal);
0299 
0300     // now set the color for the equal sign
0301     pal = QPalette();
0302     pal.setColor(m_equalSignLabel->foregroundRole(), SettingsClass::operationColor());
0303     m_equalSignLabel->setPalette(pal);
0304 
0305     // and the factors
0306     m_resultWidget->update();
0307 
0308     // update for itself
0309     ((QWidget *) this)->update();
0310 }
0311 
0312 
0313 /* ------ private member functions ------ */
0314 
0315 void ExerciseFactorize::createTask()
0316 {
0317     uint uint_number;
0318     PrimeNumber tmp_primenumber;
0319 
0320     // just pick one number out of the possible numbers to factorize
0321     m_taskNumber = possibleTasks[QRandomGenerator::global()->bounded(numberPossibleTasks)];
0322 
0323     // now get the primefactors of the taskNumber
0324     m_factorsResult.clear();
0325     uint_number = m_taskNumber;
0326     tmp_primenumber.move_first();
0327     do {
0328         // check if the current primenumber is a divisor
0329         if (uint_number % tmp_primenumber.get_current() != 0) {
0330             // no, it is not a divisor, go on with next primenumber
0331             tmp_primenumber.move_forward();
0332         } else {
0333             // current primenumber is a divisor
0334             m_factorsResult.append(tmp_primenumber.get_current());
0335             uint_number = uint(uint_number / tmp_primenumber.get_current());
0336         }
0337     } while (uint_number != 1);
0338 
0339     return;
0340 }
0341 
0342 /** - checks, if the user solved the task correctly
0343         - emits signals if task was solved correctly or wrong */
0344 void ExerciseFactorize::showResult()
0345 {
0346     uint uint_result = 0;
0347 
0348     // change the tooltip of the check button
0349     m_checkButton->setToolTip(i18n("Click on this button to get to the next question."));
0350 
0351     // disable prime factor buttons
0352     m_factor2Button->setEnabled(false);
0353     m_factor3Button->setEnabled(false);
0354     m_factor5Button->setEnabled(false);
0355     m_factor7Button->setEnabled(false);
0356     m_factor11Button->setEnabled(false);
0357     m_factor13Button->setEnabled(false);
0358     m_factor17Button->setEnabled(false);
0359     m_factor19Button->setEnabled(false);
0360     m_skipButton->setEnabled(false);
0361 
0362     // disable factor removal button as well
0363     m_removeLastFactorButton->setEnabled(false);
0364 
0365     // show the result
0366     m_resultWidget->setFactors(m_factorsResult);
0367 
0368     // now calculate the product of the prime factors entered by the user
0369     for (int tmp_uint = 0; tmp_uint < m_factorsEntered.count(); tmp_uint++) {
0370         if (tmp_uint == 0) {
0371             uint_result = m_factorsEntered[0];
0372         } else {
0373             uint_result *= m_factorsEntered[tmp_uint];
0374         }
0375     }
0376 
0377     if (uint_result == m_taskNumber) {
0378         // emit the signal for correct
0379         Q_EMIT signalExerciseSolvedCorrect();
0380 
0381         /* yes, the user entered the correct result */
0382         m_resultWidget->setResult(Ratio(), 1);
0383     } else {
0384         // emit the signal for wrong
0385         Q_EMIT signalExerciseSolvedWrong();
0386 
0387         /* no, the user entered the wrong result */
0388         m_resultWidget->setResult(Ratio(), 0);
0389     } /* if (entered_result == result) */
0390 
0391     m_edit = false;
0392 
0393     return;
0394 }
0395 
0396 /** generate the next task and show it to the user */
0397 void ExerciseFactorize::nextTask()
0398 {
0399     // change the tooltip of the check button
0400     m_checkButton->setToolTip(i18n("Click on this button to check your result. The button will not work if you have not entered a result yet."));
0401 
0402     // enable prime factor buttons
0403     m_factor2Button->setEnabled(true);
0404     m_factor3Button->setEnabled(true);
0405     m_factor5Button->setEnabled(true);
0406     m_factor7Button->setEnabled(true);
0407     m_factor11Button->setEnabled(true);
0408     m_factor13Button->setEnabled(true);
0409     m_factor17Button->setEnabled(true);
0410     m_factor19Button->setEnabled(true);
0411     m_skipButton->setEnabled(true);
0412 
0413     // disable the factor removal button, there are no factors to be removed yet
0414     m_removeLastFactorButton->setEnabled(false);
0415 
0416     m_resultWidget->setResult(Ratio(), -1);
0417 
0418     /* clear user input */
0419     m_factorsEntered.clear();
0420     m_factorsResult.clear();
0421     m_factorsEnteredEdit->clear();
0422 
0423     m_factorsEnteredEdit->setFocus();
0424 
0425     /* create a new task */
0426     QApplication::setOverrideCursor(Qt::WaitCursor);  /* show the sand clock */
0427     createTask();
0428     QApplication::restoreOverrideCursor(); /* show the normal cursor */
0429 
0430     // update the task widget
0431     QString tmp_str;
0432     tmp_str.setNum(m_taskNumber);
0433     m_taskLabel->setText(tmp_str);
0434 
0435     m_edit = true;
0436 
0437     return;
0438 }
0439 
0440 void ExerciseFactorize::addFactor(uint factor)
0441 {
0442     // add the new entered factor
0443     m_factorsEntered.append(factor);
0444 
0445     // a factor was added, so the user can can remove one again
0446     m_removeLastFactorButton->setEnabled(true);
0447 
0448     // update the line edit
0449     updateEnteredEdit();
0450 
0451     return;
0452 }
0453 
0454 void ExerciseFactorize::updateEnteredEdit()
0455 {
0456     // the string to be shown in the entered edit
0457     QString str_output;
0458     QString str_tmp;
0459 
0460     // find the end of the list
0461     uintList::iterator it;
0462 
0463 
0464     for (it = m_factorsEntered.begin(); it != m_factorsEntered.end(); ++it) {
0465         // convert the factor into a string
0466         str_tmp.setNum(*it);
0467 
0468         // add the factor with a *
0469         if (it == m_factorsEntered.begin()) {
0470             str_output = str_tmp;
0471         } else {
0472             str_output += QStringLiteral(" x ") + str_tmp;
0473         }
0474     }
0475 
0476     // set the text into the line edit
0477     m_factorsEnteredEdit->setText(str_output);
0478 
0479     return;
0480 }
0481 
0482 /* ------ private slots ------ */
0483 
0484 void ExerciseFactorize::slotFactorsEditReturnPressed()
0485 {
0486     if (m_checkButton->isEnabled()) {
0487         slotCheckButtonClicked();
0488     }
0489 }
0490 
0491 void ExerciseFactorize::slotCheckButtonClicked()
0492 {
0493     if (m_currentState == _CHECK_TASK) {
0494         // if nothing has been entered by the user, we don't check the result yet
0495         if (m_factorsEntered.count() == 0)
0496             return;
0497         m_currentState = _NEXT_TASK;
0498         m_checkButton->setText(i18n("N&ext"));
0499         (void) showResult();
0500     } else {
0501         m_currentState = _CHECK_TASK;
0502         m_checkButton->setText(i18n("&Check"));
0503         (void) nextTask();
0504     }
0505 
0506     // update the line edit
0507     updateEnteredEdit();
0508     return;
0509 }
0510 
0511 void ExerciseFactorize::slotSkipButtonClicked()
0512 {
0513     forceNewTask();
0514     // update the line edit
0515     updateEnteredEdit();
0516 
0517     return;
0518 }
0519 
0520 void ExerciseFactorize::slotFactor2ButtonClicked()
0521 {
0522     addFactor(2);
0523 
0524     return;
0525 }
0526 
0527 void ExerciseFactorize::slotFactor3ButtonClicked()
0528 {
0529     addFactor(3);
0530 
0531     return;
0532 }
0533 
0534 void ExerciseFactorize::slotFactor5ButtonClicked()
0535 {
0536     addFactor(5);
0537 
0538     return;
0539 }
0540 
0541 void ExerciseFactorize::slotFactor7ButtonClicked()
0542 {
0543     addFactor(7);
0544 
0545     return;
0546 }
0547 
0548 void ExerciseFactorize::slotFactor11ButtonClicked()
0549 {
0550     addFactor(11);
0551 
0552     return;
0553 }
0554 
0555 void ExerciseFactorize::slotFactor13ButtonClicked()
0556 {
0557     addFactor(13);
0558 
0559     return;
0560 }
0561 
0562 void ExerciseFactorize::slotFactor17ButtonClicked()
0563 {
0564     addFactor(17);
0565 
0566     return;
0567 }
0568 
0569 void ExerciseFactorize::slotFactor19ButtonClicked()
0570 {
0571     addFactor(19);
0572 
0573     return;
0574 }
0575 
0576 void ExerciseFactorize::slotRemoveLastFactorButtonClicked()
0577 {
0578     if (m_factorsEntered.count() > 0) {
0579         // find the end of the list
0580         uintList::iterator it = m_factorsEntered.end();
0581         --it;
0582 
0583         // remove last item
0584         m_factorsEntered.erase(it);
0585     }
0586 
0587     // if the list is empty, we have to disable the delete button
0588     if (m_factorsEntered.count() == 0)
0589         m_removeLastFactorButton->setEnabled(false);
0590 
0591     // update the line edit
0592     updateEnteredEdit();
0593 
0594     return;
0595 }
0596 
0597 void ExerciseFactorize::showEvent(QShowEvent *)
0598 {
0599 #ifdef DEBUG
0600     qDebug() << QStringLiteral("ExerciseFactorize::showEvent()");
0601 #endif
0602 
0603     if (isVisible())
0604         m_factorsEnteredEdit->setFocus();
0605 }
0606 
0607 void ExerciseFactorize::editContentChanged(bool correct)
0608 {
0609     if (correct) {
0610         const QStringList factors = m_factorsEnteredEdit->getFactors();
0611 
0612         m_factorsEntered.clear();
0613         for (const QString & auxStr : factors) {
0614             m_factorsEntered.append(auxStr.toUInt());
0615         }
0616     }
0617     setButtonsEnabled(correct);
0618 }
0619 
0620 void ExerciseFactorize::setButtonsEnabled(bool enabled)
0621 {
0622     // set the state of the buttons involved in factorization
0623     m_checkButton->setEnabled(enabled);
0624     m_factor2Button->setEnabled(enabled);
0625     m_factor3Button->setEnabled(enabled);
0626     m_factor5Button->setEnabled(enabled);
0627     m_factor7Button->setEnabled(enabled);
0628     m_factor11Button->setEnabled(enabled);
0629     m_factor13Button->setEnabled(enabled);
0630     m_factor17Button->setEnabled(enabled);
0631     m_factor19Button->setEnabled(enabled);
0632     m_removeLastFactorButton->setEnabled(enabled);
0633 }
0634 
0635