add balancing tool target
This commit is contained in:
80
src/balancing/BalancingWindow.cpp
Normal file
80
src/balancing/BalancingWindow.cpp
Normal file
@@ -0,0 +1,80 @@
|
||||
#include "BalancingWindow.h"
|
||||
|
||||
#include <QScrollArea>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
BalancingWindow::BalancingWindow(const BalancingConfig& balancingConfig,
|
||||
const GameConfig& gameConfig,
|
||||
QWidget* parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
setWindowTitle("DotaFactory — Balancing Tool");
|
||||
resize(800, 600);
|
||||
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||||
mainLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
QScrollArea* scrollArea = new QScrollArea(this);
|
||||
scrollArea->setWidgetResizable(true);
|
||||
|
||||
QWidget* scrollContent = new QWidget(scrollArea);
|
||||
QVBoxLayout* contentLayout = new QVBoxLayout(scrollContent);
|
||||
contentLayout->setSpacing(8);
|
||||
contentLayout->setContentsMargins(8, 8, 8, 8);
|
||||
|
||||
unsigned int seed = 0;
|
||||
for (const ArenaConfig& arenaConfig : balancingConfig.arenas)
|
||||
{
|
||||
ArenaEntry entry;
|
||||
entry.simulation = std::make_unique<ArenaSimulation>(
|
||||
gameConfig, arenaConfig, seed++);
|
||||
entry.button = new ArenaButton(arenaConfig.name, scrollContent);
|
||||
contentLayout->addWidget(entry.button);
|
||||
|
||||
entry.button->updateStatus(entry.simulation->status());
|
||||
|
||||
m_arenas.push_back(std::move(entry));
|
||||
}
|
||||
|
||||
contentLayout->addStretch();
|
||||
scrollArea->setWidget(scrollContent);
|
||||
mainLayout->addWidget(scrollArea);
|
||||
|
||||
// Start worker threads.
|
||||
for (ArenaEntry& entry : m_arenas)
|
||||
{
|
||||
ArenaSimulation* sim = entry.simulation.get();
|
||||
entry.worker = std::thread([sim]() { sim->run(); });
|
||||
}
|
||||
|
||||
// Poll timer at ~10 Hz to update button statuses.
|
||||
m_pollTimer = new QTimer(this);
|
||||
connect(m_pollTimer, &QTimer::timeout, this, &BalancingWindow::pollStatuses);
|
||||
m_pollTimer->start(100);
|
||||
}
|
||||
|
||||
BalancingWindow::~BalancingWindow()
|
||||
{
|
||||
m_pollTimer->stop();
|
||||
|
||||
for (ArenaEntry& entry : m_arenas)
|
||||
{
|
||||
entry.simulation->requestStop();
|
||||
}
|
||||
for (ArenaEntry& entry : m_arenas)
|
||||
{
|
||||
if (entry.worker.joinable())
|
||||
{
|
||||
entry.worker.join();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BalancingWindow::pollStatuses()
|
||||
{
|
||||
for (ArenaEntry& entry : m_arenas)
|
||||
{
|
||||
const ArenaStatus status = entry.simulation->status();
|
||||
entry.button->updateStatus(status);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user