Cockatrice/cockatrice/src/interface/widgets/replay/replay_manager.h
Lukas Brübach fecf10e2b1 [Replay] Seek to the exact time of an event
Timeline seeks only expose whole timer intervals, so jumping to an event could leave that event unprocessed until the next tick. Add an event-time seek that also applies events at the target timestamp.
2026-11-02 15:40:58 +01:00

86 lines
2.4 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, bool includeEventsAtTime = false);
void handleBackwardsSkip(bool doRewindBuffering, bool includeEventsAtTime = false);
void processRewind(bool includeEventsAtTime = false);
void processNewEvents(PlaybackMode playbackMode, bool includeEventsAtTime = false);
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 setTimeToEvent(int eventIndex);
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