Cockatrice/cockatrice/src/interface/widgets/replay/replay_manager.h
Lukas Brübach b5a122f7ac [Replay] Show the history sidebar in replay tabs
Add the Game History dock to the left of replay tabs, wire it to the replay timeline, and register it with the View menu and layout reset.
2026-11-02 15:44:52 +01:00

96 lines
2.7 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;
}
/**
* @brief Index of the last event the game state has processed.
*
* @return The event index, or -1 while no event has been replayed yet
*/
[[nodiscard]] int getLastProcessedEventIndex() const
{
return currentEvent - 1;
}
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