Cockatrice/cockatrice/src/interface/widgets/replay/replay_manager.h
2026-10-16 22:41:17 +02:00

85 lines
2.2 KiB
C++

#ifndef COCKATRICE_REPLAY_MANAGER_H
#define COCKATRICE_REPLAY_MANAGER_H
#include <QList>
#include <QObject>
#include <QtGlobal>
#include <libcockatrice/game/player/event_processing_options.h>
#include <qtmetamacros.h>
class GameReplay;
class QTimer;
class GameEventContainer;
/**
* @brief This class handles all logic to do with playing back replays
*/
class ReplayManager : public QObject
{
Q_OBJECT
enum PlaybackMode
{
NORMAL_PLAYBACK,
FORWARD_SKIP,
BACKWARD_SKIP
};
GameReplay *replay;
QList<int> replayTimeline; ///< timestamp of each event, with the indexes corresponding
int maxTime;
QTimer *replayTimer;
QTimer *rewindBufferingTimer;
qreal timeScaleFactor = 1.0;
bool skipEmptySections = false;
int currentVisualTime = 0; ///< time currently displayed by the timeline
int currentProcessedTime = 0; ///< time that events are currently processed up to. Could differ from visual time due
///< to rewind buffering
int currentEvent = 0; ///< current event's index
void skipToTime(int newTime, bool doRewindBuffering);
void handleBackwardsSkip(bool doRewindBuffering);
void processRewind();
void processNewEvents(PlaybackMode playbackMode);
void handleSkipEmptySection();
private slots:
void replayTimerTimeout();
public:
static constexpr int SMALL_SKIP_MS = 1000;
static constexpr int BIG_SKIP_MS = 10000;
/**
* @param parent The parent QObject
* @param replay Cannot be null. Takes ownership of the object.
*/
explicit ReplayManager(QObject *parent, GameReplay *replay);
~ReplayManager() override;
const QList<int> &getReplayTimeline() const
{
return replayTimeline;
}
void setTimeScaleFactor(qreal _timeScaleFactor);
void setSkipEmptySections(bool value);
public slots:
void startReplay();
void stopReplay();
void setTime(int time);
void skipByAmount(int amount); // use a negative amount to skip backwards
signals:
void timeChanged(int time);
void eventReplayed(const GameEventContainer &cont, EventProcessingOptions options);
void replayFinished();
void rewound();
};
#endif // COCKATRICE_REPLAY_MANAGER_H