create and wire up TallyWidget

This commit is contained in:
RickyRister 2026-04-05 02:54:34 -07:00
parent f63279e12f
commit 1bead478b6
5 changed files with 157 additions and 13 deletions

View file

@ -109,6 +109,8 @@ set(cockatrice_SOURCES
src/game/replay.cpp
src/game/tally/tally_manager.cpp
src/game/tally/tally_manager.h
src/game/tally/tally_widget.cpp
src/game/tally/tally_widget.h
src/game/zones/card_zone_logic.cpp
src/game/zones/hand_zone_logic.cpp
src/game/zones/pile_zone_logic.cpp

View file

@ -0,0 +1,76 @@
#include "tally_widget.h"
#include <QBoxLayout>
#include <QLabel>
#include <QScrollArea>
TallyWidget::TallyWidget(QWidget *parent, TallyManager *tallyManager) : QWidget(parent), tallyManager(tallyManager)
{
auto layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setAlignment(Qt::AlignCenter);
setLayout(layout);
auto scrollArea = new QScrollArea(this);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
layout->addWidget(scrollArea);
auto gridLayoutWidget = new QWidget(scrollArea);
gridLayout = new QGridLayout(gridLayoutWidget);
gridLayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
resetGridLayout({TallyManager::TOTAL_POWER, TallyManager::TOTAL_MANA_VALUE});
}
void TallyWidget::resetGridLayout(QList<TallyManager::EntryType> entryTypes)
{
// clear all existing
while (auto item = gridLayout->takeAt(0)) {
item->widget()->deleteLater();
delete item;
}
// create all labels
for (auto entryType : entryTypes) {
auto textLabel = createTextLabel(entryType);
auto valueLabel = createValueLabel(entryType);
int row = gridLayout->rowCount();
gridLayout->addWidget(textLabel, row, 0);
gridLayout->addWidget(valueLabel, row, 1);
}
}
QLabel *TallyWidget::createTextLabel(TallyManager::EntryType entryType)
{
auto label = new QLabel;
auto updateLabel = [label, entryType](const QMap<TallyManager::EntryType, TallyResult> &results) {
QString text = results.value(entryType).text;
label->setText(text);
};
updateLabel(tallyManager->getAllResults());
connect(tallyManager, &TallyManager::tallyChanged, label, updateLabel);
return label;
}
QLabel *TallyWidget::createValueLabel(TallyManager::EntryType entryType)
{
auto label = new QLabel;
auto updateLabel = [label, entryType](const QMap<TallyManager::EntryType, TallyResult> &results) {
int value = results.value(entryType).value;
label->setText(QString::number(value));
};
updateLabel(tallyManager->getAllResults());
connect(tallyManager, &TallyManager::tallyChanged, label, updateLabel);
return label;
}

View file

@ -0,0 +1,38 @@
#ifndef COCKATRICE_TALLY_WIDGET_H
#define COCKATRICE_TALLY_WIDGET_H
#include "tally_manager.h"
#include <QGridLayout>
#include <QScrollArea>
#include <QWidget>
class QLabel;
class CardItem;
class TallyWidget : public QWidget
{
Q_OBJECT
public:
explicit TallyWidget(QWidget *parent, TallyManager *tallyManager);
private:
TallyManager *tallyManager;
struct TallyEntryInternal
{
TallyManager::EntryType type;
QLabel *textLabel;
QLabel *valueLabel;
};
QList<TallyEntryInternal> tallyEntriesInternal;
QGridLayout *gridLayout;
void resetGridLayout(QList<TallyManager::EntryType> entryTypes);
QLabel *createTextLabel(TallyManager::EntryType entryType);
QLabel *createValueLabel(TallyManager::EntryType entryType);
};
#endif // COCKATRICE_TALLY_WIDGET_H

View file

@ -13,6 +13,7 @@
#include "../game/player/player_list_widget.h"
#include "../game/player/player_logic.h"
#include "../game/replay.h"
#include "../game/tally/tally_widget.h"
#include "../interface/card_picture_loader/card_picture_loader.h"
#include "../interface/widgets/cards/card_info_frame_widget.h"
#include "../interface/widgets/dialogs/dlg_create_game.h"
@ -49,8 +50,11 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
// THIS CTOR IS USED ON REPLAY
game = new Replay(this, _replay);
tallyManager = new TallyManager(this);
createCardInfoDock(true);
createPlayerListDock(true);
createTallyDock(true);
createMessageDock(true);
createPlayAreaWidget(true);
createDeckViewContainerWidget(true);
@ -58,6 +62,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
addDockWidget(Qt::RightDockWidgetArea, tallyDock);
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
addDockWidget(Qt::BottomDockWidgetArea, replayDock);
@ -93,8 +98,11 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
// THIS CTOR IS USED ON GAMES
game = new Game(this, _clients, event, _roomGameTypes);
tallyManager = new TallyManager(this);
createCardInfoDock();
createPlayerListDock();
createTallyDock();
createMessageDock();
createPlayAreaWidget();
createDeckViewContainerWidget();
@ -102,6 +110,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
addDockWidget(Qt::RightDockWidgetArea, tallyDock);
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
mainWidget = new QStackedWidget(this);
@ -282,6 +291,7 @@ void TabGame::retranslateUi()
updatePlayerListDockTitle();
cardInfoDock->setWindowTitle(tr("Card Info") + (cardInfoDock->isWindow() ? tabText : QString()));
tallyDock->setWindowTitle(tr("Tally") + (tallyDock->isWindow() ? tabText : QString()));
messageLayoutDock->setWindowTitle(tr("Messages") + (messageLayoutDock->isWindow() ? tabText : QString()));
if (replayDock) {
replayDock->setWindowTitle(tr("Replay Timeline") + (replayDock->isWindow() ? tabText : QString()));
@ -348,6 +358,7 @@ void TabGame::retranslateUi()
dockToActions[cardInfoDock].menu->setTitle(tr("Card Info"));
dockToActions[messageLayoutDock].menu->setTitle(tr("Messages"));
dockToActions[tallyDock].menu->setTitle(tr("Tally"));
dockToActions[playerListDock].menu->setTitle(tr("Player List"));
if (replayDock) {
@ -1053,6 +1064,7 @@ void TabGame::createViewMenuItems()
registerDockWidget(viewMenu, cardInfoDock, {250, 360});
registerDockWidget(viewMenu, messageLayoutDock, {250, 200});
registerDockWidget(viewMenu, tallyDock, {250, 50});
registerDockWidget(viewMenu, playerListDock, {250, 50});
if (replayDock) {
@ -1114,29 +1126,24 @@ void TabGame::actResetLayout()
{
cardInfoDock->setVisible(true);
playerListDock->setVisible(true);
tallyDock->setVisible(true);
messageLayoutDock->setVisible(true);
cardInfoDock->setFloating(false);
playerListDock->setFloating(false);
tallyDock->setVisible(false);
messageLayoutDock->setFloating(false);
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
addDockWidget(Qt::RightDockWidgetArea, tallyDock);
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
if (replayDock) {
replayDock->setVisible(true);
replayDock->setFloating(false);
addDockWidget(Qt::BottomDockWidgetArea, replayDock);
for (auto i = dockToActions.cbegin(); i != dockToActions.cend(); ++i) {
QDockWidget *dock = i.key();
QSize defaultSize = i.value().defaultSize;
cardInfoDock->resize(250, 360);
messageLayoutDock->resize(250, 200);
playerListDock->resize(250, 50);
replayDock->resize(900, 100);
} else {
cardInfoDock->resize(250, 360);
messageLayoutDock->resize(250, 250);
playerListDock->resize(250, 50);
dock->resize(defaultSize);
}
}
@ -1155,6 +1162,9 @@ void TabGame::createPlayAreaWidget(bool bReplay)
connect(game->getGameEventHandler(), &GameEventHandler::arrowDeleted, scene, &GameScene::deleteArrow);
gameView = new GameView(scene);
connect(scene, &GameScene::selectionChanged, tallyManager,
[this] { tallyManager->updateSelection(scene->selectedCards()); });
auto gamePlayAreaVBox = new QVBoxLayout;
gamePlayAreaVBox->setContentsMargins(0, 0, 0, 0);
gamePlayAreaVBox->addWidget(gameView);
@ -1233,6 +1243,19 @@ void TabGame::createPlayerListDock(bool bReplay)
playerListDock->setFloating(false);
}
void TabGame::createTallyDock(bool bReplay)
{
Q_UNUSED(bReplay);
tallyWidget = new TallyWidget(this, tallyManager);
tallyDock = new QDockWidget(this);
tallyDock->setObjectName("tallyDock");
tallyDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable |
QDockWidget::DockWidgetMovable);
tallyDock->setWidget(tallyWidget);
}
void TabGame::createMessageDock(bool bReplay)
{
auto messageLogLayout = new QVBoxLayout;

View file

@ -20,6 +20,8 @@
#include <QLoggingCategory>
#include <QMap>
class TallyManager;
class TallyWidget;
class ServerInfo_PlayerProperties;
class TabbedDeckViewContainer;
inline Q_LOGGING_CATEGORY(TabGameLog, "tab_game");
@ -66,6 +68,7 @@ private:
CardInfoFrameWidget *cardInfoFrameWidget;
PlayerListWidget *playerListWidget;
TallyWidget *tallyWidget;
QLabel *timeElapsedLabel;
MessageLogWidget *messageLog;
QLabel *sayLabel;
@ -73,10 +76,11 @@ private:
PhasesToolbar *phasesToolbar;
GameScene *scene;
GameView *gameView;
TallyManager *tallyManager;
QMap<int, TabbedDeckViewContainer *> deckViewContainers;
QVBoxLayout *deckViewContainerLayout;
QWidget *gamePlayAreaWidget, *deckViewContainerWidget;
QDockWidget *cardInfoDock, *messageLayoutDock, *playerListDock, *replayDock;
QDockWidget *cardInfoDock, *messageLayoutDock, *playerListDock, *tallyDock, *replayDock;
QAction *playersSeparator;
QMenu *gameMenu, *viewMenu;
TearOffMenu *phasesMenu;
@ -121,6 +125,7 @@ private:
void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize);
void createCardInfoDock(bool bReplay = false);
void createPlayerListDock(bool bReplay = false);
void createTallyDock(bool bReplay = false);
void createMessageDock(bool bReplay = false);
void createPlayAreaWidget(bool bReplay = false);
void createDeckViewContainerWidget(bool bReplay = false);