#ifndef SPACEDREPETITIONMODEL_H #define SPACEDREPETITIONMODEL_H #include "IStudyModel.h" #include "StudyRecord.h" #include "StudySettings.h" #include #include class CardPack; class IRandomGenerator; class SpacedRepetitionModel: public IStudyModel { Q_OBJECT public: static const int NewCardsDayLimit = 10; public: SpacedRepetitionModel(CardPack* aCardPack, IRandomGenerator* random); ~SpacedRepetitionModel(); public: Card* getCurCard() const { return curCard; } QList getAvailableGrades() const; bool isNew() const; void setRecallTime( int aTime ) { curRecallTime = aTime; } int estimatedNewReviewedCardsToday() const; int countTodayRemainingCards() const; public slots: void scheduleCard(int newGrade); protected: void pickNextCardAndNotify(); private: StudyRecord createNewStudyRecord(int newGrade); int getNewLevel(const StudyRecord& prevStudy, int newGrade); double getNewEasiness(const StudyRecord& prevStudy, int newGrade); double getChangeableEasiness(const StudyRecord& prevStudy, int newGrade) const; double limitEasiness(double eas) const; double getNextInterval(const StudyRecord& prevStudy, const StudyRecord& newStudy); double getNextRepeatingInterval(const StudyRecord& prevStudy, const StudyRecord& newStudy); double getIncreasedInterval(double prevInterval, double newEasiness); double getNextRepeatingIntervalForShortLearning( const StudyRecord& prevStudy, const StudyRecord& newStudy); double getNextRepeatingIntervalForLongLearning( const StudyRecord& prevStudy, const StudyRecord& newStudy); void saveStudyRecord(const StudyRecord& newStudy); void pickNextCard(); bool pickNewCard(); QString getRandomStr(const QStringList& list) const; bool reachedNewCardsDayLimit() const; bool mustPickScheduledCard(); bool tooManyScheduledCards() const; bool mustRandomPickScheduledCard() const; bool pickActiveCard(); bool pickPriorityActiveCard(); bool pickLearningCard(); void saveStudy(); private slots: void updateStudyState(); private: Card* curCard; ///< The card selected for repetition Card* prevCard; ///< Previous reviewed card. Found in the study history. int curRecallTime; ///< Recall time of the current card, ms QTime answerTime; ///< Full answer time of the current card: recall + evaluation, ms StudySettings* settings; IRandomGenerator* random; }; #endif