mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-05 09:33:25 -08:00
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.
96 lines
2.7 KiB
C++
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
|