You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/ktouch/src/ktouchtrainer.h

165 lines
8.3 KiB

/***************************************************************************
* ktouchtrainer.h *
* --------------- *
* Copyright (C) 2000 by Håvard Frøiland, 2003 by Andreas Nicolai *
* ghorwin@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#ifndef KTOUCHTRAINER_H
#define KTOUCHTRAINER_H
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <tqobject.h>
#include "ktouchstatisticsdata.h"
class TQTimer;
class KTouchStatus;
class KTouchSlideLine;
class KTouchKeyboardWidget;
class KTouchLecture;
/// This is the master trainer object and does all the heavy work.
///
/// The training object gets the already filtered "new key pressed" events from the main window
/// and processes them. It manages the level and line adjustments, starts, pauses and restarts
/// a training, updates the widgets and and and...
/// <p>
/// Whether in training or not the user may switch levels using the level change buttons (if enabled)
/// or change the lecture. The slot levelUp() or levelDown() is called and the trainer is switching
/// levels accordingly.
/// <p>
/// There is always a current training session. On a typical program start the training session is paused.
/// When a training session is paused the timer is stopped and the program waits for the next keypress
/// of the user and then the timer is restarted. Note that the Pause button (Pause action) is enabled/disabled from
/// the main KTouch class.
/// <p>
/// When the user starts a new training session or quits the program the current level/session
/// statistics data will be added to the user statistics and the stats will be cleared. If a new
/// level is started (during a session), only the level stats are stored and cleared, the session
/// statistics is kept. The only member functions, that add statistics data to the users statistics are
/// therefore storeTrainingStatistics() (for level and session stats) and statsChangeLevel() (stores only
/// level stats).
/// <p>
/// The trainer keeps record of the current level and session stats seperately and
/// stores them in the m_levelStats and m_sessionStats member variables. However, the word count is only
/// updated in these variables, once a slide line is completed (or a level/session/lecture is changed).
/// <p>
/// The member function updateWidgets() updates all training related widgets (status widget, slide line,
/// and the statusbar of the main window). In this member function also the word count of the current line
/// is updated.
class KTouchTrainer : public TQObject {
Q_OBJECT
public:
/// Constructor.
KTouchTrainer(KTouchStatus *status, KTouchSlideLine *slideLine, KTouchKeyboardWidget *keyboard, KTouchLecture *lecture);
/// Destructor
virtual ~KTouchTrainer();
/// Jumps to the first line in the current level (m_level) (Note: has no effect on the training statistics).
/// The function resets the word count.
void gotoFirstLine();
/// Jumps to the first level, line 1 (Note: has no effect on the training statistics!).
/// The function resets the word count.
void gotoFirstLevel() { m_level=0; gotoFirstLine(); }
/// Processes the character 'key' and updates the widgets and statistics.
/// If the training session was started and in waiting state the timer is started and the actuall training begins.
void keyPressed(TQChar key);
/// Will be called when a character has been removed (recalculates the variables and updates the widgets).
void backspacePressed();
/// Will be called when "enter" has been pressed (displays next line).
void enterPressed();
/// Will be called whenever the student text has changed and updates the slide line widget,
/// the status widget and shows the next to be pressed key on the keyboard
void updateWidgets();
/// Starts a new training session for the current lecture.
/// This function is called from class KTouch (when the "New" session action is executed).
/// The function resets the statistics so the caller must ensure that the previous level
/// and session statistics are properly stored.
void startTraining(bool keepLevel);
/// Pauses the current training session.
/// This function is called from class KTouch (when the "Pause" action is executed).
void pauseTraining();
/// Continues the current training session.
/// This function is called from class KTouch when a user presses a normal key while the training is in
/// "Pause" mode.
void continueTraining();
/// Stores the currently accumulated statistics in the statistics for the current user (but only, if
/// some time has elapsed in the current training session). This function is called whenever a new
/// training session is started or when the program is closed.
void storeTrainingStatistics();
/// Returns true, if the students line is correct so far.
bool studentLineCorrect() const;
/// Returns number of words that have been typed so far in the current line.
unsigned int wordsInCurrentLine() const { return m_wordsInCurrentLine; }
unsigned int m_level; ///< Current level number (zero based).
unsigned int m_line; ///< Current line number (zero based).
TQString m_teacherText; ///< The currently displayed teacher text.
TQString m_studentText; ///< The currently typed student text.
bool m_trainingPaused; ///< Indicates whether we have paused the training session or not.
TQTimer *m_trainingTimer; ///< The timer responsable for updating the speed LCD widget.
KTouchLevelStats m_levelStats; ///< Contains the statistics for the current level alone.
KTouchSessionStats m_sessionStats; ///< Contains the statistics for the current session (multiple levels).
public slots:
/// Will be called when the level is increased.
void levelUp();
/// Will be called when the level is decreased.
void levelDown();
private slots:
/// Will be called regularly by the training timer, increases the elapsed time and updates the speed LCD widget.
void timerTick();
private:
/// Sets up a new teacher line (depending on m_level and m_line).
/// The function resets the word count.
void newLine();
void levelAllComplete();
void updateLevelChangeButtons();
/// Updates the statusbar of the main window.
void updateStatusBar() const;
/// Updates the message in the statusbar of the main window.
void updateStatusBarMessage(const TQString& message) const;
/// Updates the word count in the current student text line.
void updateWordCount();
/// Adds a correct character count to the current statistics.
void statsAddCorrectChar(TQChar key);
/// Adds a wrong character count to the current statistics.
void statsAddWrongChar(TQChar key);
/// Removes a correctly typed character count.
void statsRemoveCorrectChar(TQChar);
/// Adds some elapsed time (in seconds) to the statistics.
void statsAddTime(double dt);
/// Stores level stats and resets level stats (this function is called from levelUp() and levelDown()
/// right before a new level and new line is started).
void statsChangeLevel();
KTouchStatus *m_statusWidget; ///< Pointer to the status widget on top of the main window.
KTouchSlideLine *m_slideLineWidget; ///< Pointer to the sliding line widget.
KTouchKeyboardWidget *m_keyboardWidget; ///< Pointer to the keyboard widget.
KTouchLecture *m_lecture; ///< Pointer to the lecture data.
KURL m_levelUpSound; ///< URL of the level up sound.
KURL m_levelDownSound; ///< URL of the level down sound.
KURL m_typeWriterSound; ///< URL of the typing sound.
unsigned int m_wordsInCurrentLine; ///< Number of words in the current typing line.
};
#endif // KTOUCHTRAINER_H