diff options
author | Jedidiah Barber <contact@jedbarber.id.au> | 2021-07-14 11:49:10 +1200 |
---|---|---|
committer | Jedidiah Barber <contact@jedbarber.id.au> | 2021-07-14 11:49:10 +1200 |
commit | d24f813f3f2a05c112e803e4256b53535895fc98 (patch) | |
tree | 601e6ae9a1cd44bcfdcf91739a5ca36aedd827c9 /src/study/WordDrillWindow.cpp |
Diffstat (limited to 'src/study/WordDrillWindow.cpp')
-rw-r--r-- | src/study/WordDrillWindow.cpp | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/study/WordDrillWindow.cpp b/src/study/WordDrillWindow.cpp new file mode 100644 index 0000000..dd13bd1 --- /dev/null +++ b/src/study/WordDrillWindow.cpp @@ -0,0 +1,180 @@ +#include "WordDrillWindow.h" +#include "WordDrillModel.h" +#include "../dictionary/Card.h" +#include "../dictionary/CardPack.h" +#include "CardSideView.h" + +WordDrillWindow::WordDrillWindow( WordDrillModel* aModel, QWidget* aParent ): + IStudyWindow(aModel, tr("Word drill"), aParent) +{ + studyType = AppModel::WordDrill; + createUI(); // Can't call from parent constructor + setWindowIcon( QIcon(":/images/word-drill.png") ); + showNextCard(); +} + +WordDrillWindow::~WordDrillWindow() +{ + WriteSettings(); +} + +QVBoxLayout* WordDrillWindow::createLowerPanel() +{ + QHBoxLayout* cardNumLayout = new QHBoxLayout; + iCardNumLabel = new QLabel; + iCardNumLabel->setAlignment( Qt::AlignVCenter ); + iCardNumLabel->setToolTip(tr("Current card / All cards")); + iProgressBar = new QProgressBar; + iProgressBar->setTextVisible( false ); + iProgressBar->setMaximumHeight( iProgressBar->sizeHint().height()/2 ); + iProgressBar->setToolTip(tr("Progress of reviewing cards")); + iShowAnswersCB = new QCheckBox(tr("Show answers")); + iShowAnswersCB->setShortcut( tr("S", "Shortcut for 'Show answers' checkbox") ); + iShowAnswersCB->setChecked( true ); + connect( iShowAnswersCB, SIGNAL(stateChanged(int)), this, SLOT(ToggleAnswer()) ); + + cardNumLayout->addWidget( iCardNumLabel ); + cardNumLayout->addWidget( iProgressBar ); + cardNumLayout->addWidget( iShowAnswersCB ); + + iBackBtn = new QPushButton( QIcon(":/images/back.png"), tr("Back"), this); + iBackBtn->setShortcut( Qt::Key_Left ); + iBackBtn->setToolTip( tr("Go back in history") + ShortcutToStr( iBackBtn ) ); + connect( iBackBtn, SIGNAL(clicked()), qobject_cast<WordDrillModel*>(m_model), SLOT(goBack()) ); + + iForwardBtn = new QPushButton( QIcon(":/images/forward.png"), tr("Forward"), this); + iForwardBtn->setShortcut( Qt::Key_Right ); + iForwardBtn->setToolTip( tr("Go forward in history") + ShortcutToStr( iForwardBtn ) ); + connect( iForwardBtn, SIGNAL(clicked()), qobject_cast<WordDrillModel*>(m_model), SLOT(goForward()) ); + + iNextBtn = new QPushButton( QIcon(":/images/next.png"), tr("Next"), this); + iNextBtn->setShortcut( Qt::Key_Return ); + iNextBtn->setToolTip( tr("Show next card (Enter)") ); + connect( iNextBtn, SIGNAL(clicked()), qobject_cast<WordDrillModel*>(m_model), SLOT(pickNextCard()) ); + + QHBoxLayout* controlLt = new QHBoxLayout; + controlLt->addWidget( iBackBtn ); + controlLt->addWidget( iForwardBtn ); + controlLt->addWidget( iNextBtn ); + + QVBoxLayout* lowerPanelLt = new QVBoxLayout; + lowerPanelLt->addLayout( cardNumLayout ); + if( bigScreen() ) + lowerPanelLt->addLayout( controlLt ); + + return lowerPanelLt; +} + +void WordDrillWindow::setStateForNextCard() +{ + if( m_model->getCurCard() ) + state = iShowAnswersCB->isChecked()? StateAnswerVisible: StateAnswerHidden; + else + state = StateNoCards; + } + +void WordDrillWindow::processState() +{ +if( state == StateAnswerHidden || state == StateAnswerVisible ) + { + centralStackedLt->setCurrentIndex( CardPage ); + DisplayCardNum(); + UpdateButtons(); + } +switch( state ) + { + case StateAnswerHidden: + questionLabel->setQuestion( m_model->getCurCard()->getQuestion() ); + answerStackedLt->setCurrentIndex( AnsButtonPage ); + answerBtn->setFocus(); + break; + case StateAnswerVisible: + { + Card* card = m_model->getCurCard(); + if( iShowAnswersCB->isChecked() ) // StateAnswerHidden was skipped + questionLabel->setQuestion( card->getQuestion() ); + answerStackedLt->setCurrentIndex( AnsLabelPage ); + answerLabel->setQstAnsr( card->getQuestion(), card->getAnswers() ); + iNextBtn->setFocus(); + break; + } + case StateNoCards: + centralStackedLt->setCurrentIndex(MessagePage); + messageLabel->setText( + QString("<div align=\"center\" style=\"font-size: 22pt; font-weight: bold\">") + + tr("No cards available") + "</div>"); + break; + } +} + +void WordDrillWindow::DisplayCardNum() +{ +int curCardIndex = qobject_cast<WordDrillModel*>(m_model)->getCurCardNum(); +int curCardNum = curCardIndex + 1; +int historySize = qobject_cast<WordDrillModel*>(m_model)->historySize(); +int packSize = m_model->getCardPack()->cardsNum(); + +int curCardNumInPack = curCardIndex % packSize + 1; +int passNum; +if( packSize > 0 ) + passNum = curCardIndex / packSize + 1; +else + passNum = 1; +QString cardNumStr = QString("%1/%2").arg( curCardNumInPack ).arg( packSize ); +QString passIconStr = "<img src=\":/images/passes.png\"/>"; +if( passNum > 1 ) + cardNumStr += " " + passIconStr + QString::number( passNum ); +if( curCardNum < historySize && packSize > 0 ) + { + int lastCardIndex = historySize - 1; + int lastCardNumInPack = lastCardIndex % packSize + 1; + cardNumStr += " (" + QString::number( lastCardNumInPack ); + int sessionPassNum = lastCardIndex / packSize + 1; + if( sessionPassNum > 1 ) + cardNumStr += " " + passIconStr + QString::number( sessionPassNum ); + cardNumStr += ")"; + } + +iCardNumLabel->setText( cardNumStr ); +iProgressBar->setMaximum( packSize ); +iProgressBar->setValue( curCardNumInPack ); +} + +void WordDrillWindow::UpdateButtons() +{ +iBackBtn->setEnabled( qobject_cast<WordDrillModel*>(m_model)->canGoBack() ); +iForwardBtn->setEnabled( qobject_cast<WordDrillModel*>(m_model)->canGoForward() ); +} + +void WordDrillWindow::ToggleAnswer() +{ +if( !m_model->getCurCard() ) + return; +answerStackedLt->setCurrentIndex( iShowAnswersCB->isChecked()? AnsLabelPage: AnsButtonPage ); +switch( state ) + { + case StateAnswerHidden: + state = StateAnswerVisible; + break; + case StateAnswerVisible: + state = iShowAnswersCB->isChecked()? StateAnswerVisible: StateAnswerHidden; + break; + default: + return; + } +processState(); +} + +void WordDrillWindow::ReadSettings() +{ +QSettings settings; +move( settings.value("worddrill-pos", QPoint(PosX, PosY)).toPoint() ); +resize( settings.value("worddrill-size", QSize(Width, Height)).toSize() ); +} + +void WordDrillWindow::WriteSettings() +{ +QSettings settings; +settings.setValue("worddrill-pos", pos()); +settings.setValue("worddrill-size", size()); +} |