[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.
This commit is contained in:
Lukas Brübach 2026-10-20 22:15:15 +02:00
parent 71aaf8f821
commit 9335011e37
2 changed files with 39 additions and 2 deletions

View file

@ -32,6 +32,7 @@
#include "../interface/widgets/utility/line_edit_completer.h"
#include "../main.h"
#include "../menus/tearoff_menu.h"
#include "../replay/replay_event_sidebar.h"
#include "../replay/replay_widget.h"
#include "../utility/visibility_change_listener.h"
#include "card/card_completer_proxy_model.h"
@ -93,7 +94,7 @@ class Message;
} // namespace google
TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
: Tab(_tabSupervisor), sayLabel(nullptr), sayEdit(nullptr)
: Tab(_tabSupervisor), sayLabel(nullptr), sayEdit(nullptr), replayDock(nullptr), historyDock(nullptr)
{
// THIS CTOR IS USED ON REPLAY
game = new Replay(this, _replay, tabSupervisor->getIsLocalGame());
@ -108,6 +109,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
addDockWidget(Qt::LeftDockWidgetArea, historyDock);
addDockWidget(Qt::BottomDockWidgetArea, replayDock);
mainWidget = new QStackedWidget(this);
@ -148,6 +150,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
createPlayAreaWidget();
createDeckViewContainerWidget();
replayDock = nullptr;
historyDock = nullptr;
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
@ -339,6 +342,9 @@ void TabGame::retranslateUi()
}
cardInfoDock->setWindowTitle(tr("Card Info") + (cardInfoDock->isWindow() ? tabText : QString()));
messageLayoutDock->setWindowTitle(tr("Messages") + (messageLayoutDock->isWindow() ? tabText : QString()));
if (historyDock) {
historyDock->setWindowTitle(tr("Game History") + (historyDock->isWindow() ? tabText : QString()));
}
if (replayDock) {
replayDock->setWindowTitle(tr("Replay Timeline") + (replayDock->isWindow() ? tabText : QString()));
}
@ -412,6 +418,9 @@ void TabGame::retranslateUi()
dockToActions[messageLayoutDock].menu->setTitle(tr("Messages"));
dockToActions[playerListDock].menu->setTitle(tr("Player List"));
if (historyDock) {
dockToActions[historyDock].menu->setTitle(tr("Game History"));
}
if (replayDock) {
dockToActions[replayDock].menu->setTitle(tr("Replay Timeline"));
}
@ -1187,6 +1196,10 @@ void TabGame::createViewMenuItems()
registerDockWidget(viewMenu, messageLayoutDock, {250, 200});
registerDockWidget(viewMenu, playerListDock, {250, 50});
if (historyDock) {
registerDockWidget(viewMenu, historyDock, {280, 400});
}
if (replayDock) {
registerDockWidget(viewMenu, replayDock, {900, 100});
}
@ -1256,6 +1269,12 @@ void TabGame::actResetLayout()
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
if (historyDock) {
historyDock->setVisible(true);
historyDock->setFloating(false);
addDockWidget(Qt::LeftDockWidgetArea, historyDock);
}
if (replayDock) {
replayDock->setVisible(true);
replayDock->setFloating(false);
@ -1264,6 +1283,9 @@ void TabGame::actResetLayout()
cardInfoDock->resize(250, 360);
messageLayoutDock->resize(250, 200);
playerListDock->resize(250, 50);
if (historyDock) {
historyDock->resize(280, 400);
}
replayDock->resize(900, 100);
} else {
cardInfoDock->resize(250, 360);
@ -1312,6 +1334,20 @@ void TabGame::createReplayDock(GameReplay *replay)
[this](const auto &event, auto options) {
game->getGameEventHandler()->processGameEventContainer(event, nullptr, options);
});
auto *historySidebar = new ReplayEventSidebar(nullptr, replay, replayWidget->getReplayTimeline());
historyDock = new QDockWidget(this);
historyDock->setObjectName("historyDock");
historyDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable |
QDockWidget::DockWidgetMovable);
historyDock->setWidget(historySidebar);
historyDock->setFloating(false);
connect(historySidebar, &ReplayEventSidebar::eventSelected, replayWidget, &ReplayWidget::seekToEvent);
connect(replayWidget, &ReplayWidget::timeChanged, historySidebar, &ReplayEventSidebar::setCurrentTime);
// The replay manager is already at time 0 before the sidebar is connected, so apply the initial time explicitly.
historySidebar->setCurrentTime(0);
}
void TabGame::createDeckViewContainerWidget(bool bReplay)

View file

@ -50,6 +50,7 @@ class AbstractClient;
class GameView;
class GameScene;
class ReplayWidget;
class ReplayEventSidebar;
class CardInfoFrameWidget;
class QLabel;
class QPushButton;
@ -89,7 +90,7 @@ private:
QMap<int, TabbedDeckViewContainer *> deckViewContainers;
QVBoxLayout *deckViewContainerLayout;
QWidget *gamePlayAreaWidget, *deckViewContainerWidget;
QDockWidget *cardInfoDock, *messageLayoutDock, *playerListDock, *replayDock;
QDockWidget *cardInfoDock, *messageLayoutDock, *playerListDock, *replayDock, *historyDock;
QAction *playersSeparator;
QMenu *gameMenu, *viewMenu;
TearOffMenu *phasesMenu;