deselect build tool when it becomes unaffordable and fix stale enabled button
This commit is contained in:
@@ -12,12 +12,13 @@
|
||||
#include "DisplayName.h"
|
||||
#include "EventManager.h"
|
||||
#include "ExitBuilderModeRequestedEvent.h"
|
||||
#include "Simulation.h"
|
||||
|
||||
|
||||
BuildButtonGrid::BuildButtonGrid(const GameConfig* config, QWidget* parent)
|
||||
BuildButtonGrid::BuildButtonGrid(Simulation* sim, const GameConfig* config, QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, m_sim(sim)
|
||||
, m_config(config)
|
||||
, m_activeIndex(-1)
|
||||
{
|
||||
QGridLayout* layout = new QGridLayout(this);
|
||||
layout->setSpacing(4);
|
||||
@@ -79,24 +80,42 @@ BuildButtonGrid::~BuildButtonGrid()
|
||||
unregisterForEvents();
|
||||
}
|
||||
|
||||
void BuildButtonGrid::updateAffordability(int buildingBlocks)
|
||||
void BuildButtonGrid::updateAffordability()
|
||||
{
|
||||
const int buildingBlocks = m_sim->getBuildingBlocksStock();
|
||||
|
||||
// If the currently selected tool can no longer be afforded, exit builder mode
|
||||
// before recomputing button states so it does not stay selected. Clearing the
|
||||
// active index first lets the loop below disable the now-unaffordable button.
|
||||
if (m_activeIndex)
|
||||
{
|
||||
const BuildingType activeType = m_types[*m_activeIndex];
|
||||
const std::map<BuildingType, int>::const_iterator it = m_costs.find(activeType);
|
||||
const int cost = (it != m_costs.end()) ? it->second : 0;
|
||||
if (buildingBlocks < cost)
|
||||
{
|
||||
clearActiveButton();
|
||||
EventManager::getInstance()->sendEventImmediately(
|
||||
std::make_shared<ExitBuilderModeRequestedEvent>());
|
||||
}
|
||||
}
|
||||
|
||||
for (std::size_t i = 0; i < m_buttons.size(); ++i)
|
||||
{
|
||||
const BuildingType type = m_types[i];
|
||||
const std::map<BuildingType, int>::const_iterator it = m_costs.find(type);
|
||||
const int cost = (it != m_costs.end()) ? it->second : 0;
|
||||
m_buttons[i]->setEnabled(buildingBlocks >= cost || m_activeIndex == static_cast<int>(i));
|
||||
m_buttons[i]->setEnabled(buildingBlocks >= cost || m_activeIndex == i);
|
||||
}
|
||||
}
|
||||
|
||||
void BuildButtonGrid::clearActiveButton()
|
||||
{
|
||||
if (m_activeIndex >= 0 && m_activeIndex < static_cast<int>(m_buttons.size()))
|
||||
if (m_activeIndex)
|
||||
{
|
||||
m_buttons[static_cast<std::size_t>(m_activeIndex)]->setChecked(false);
|
||||
m_buttons[*m_activeIndex]->setChecked(false);
|
||||
}
|
||||
m_activeIndex = -1;
|
||||
m_activeIndex.reset();
|
||||
}
|
||||
|
||||
void BuildButtonGrid::onBuildButton(int index)
|
||||
@@ -105,8 +124,9 @@ void BuildButtonGrid::onBuildButton(int index)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const std::size_t idx = static_cast<std::size_t>(index);
|
||||
|
||||
if (m_activeIndex == index)
|
||||
if (m_activeIndex == idx)
|
||||
{
|
||||
clearActiveButton();
|
||||
EventManager::getInstance()->sendEventImmediately(
|
||||
@@ -114,15 +134,15 @@ void BuildButtonGrid::onBuildButton(int index)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_activeIndex >= 0 && m_activeIndex < static_cast<int>(m_buttons.size()))
|
||||
if (m_activeIndex)
|
||||
{
|
||||
m_buttons[static_cast<std::size_t>(m_activeIndex)]->setChecked(false);
|
||||
m_buttons[*m_activeIndex]->setChecked(false);
|
||||
}
|
||||
|
||||
m_activeIndex = index;
|
||||
m_buttons[static_cast<std::size_t>(index)]->setChecked(true);
|
||||
m_activeIndex = idx;
|
||||
m_buttons[idx]->setChecked(true);
|
||||
EventManager::getInstance()->sendEventImmediately(
|
||||
std::make_shared<BuildingTypeSelectedEvent>(m_types[static_cast<std::size_t>(index)]));
|
||||
std::make_shared<BuildingTypeSelectedEvent>(m_types[idx]));
|
||||
}
|
||||
|
||||
void BuildButtonGrid::handleEvent(std::shared_ptr<const BuilderModeExitedEvent> /*event*/)
|
||||
@@ -130,6 +150,11 @@ void BuildButtonGrid::handleEvent(std::shared_ptr<const BuilderModeExitedEvent>
|
||||
clearActiveButton();
|
||||
}
|
||||
|
||||
void BuildButtonGrid::handleEvent(std::shared_ptr<const BuildingBlocksChangedEvent> /*event*/)
|
||||
{
|
||||
updateAffordability();
|
||||
}
|
||||
|
||||
void BuildButtonGrid::handleEvent(std::shared_ptr<const DemolishModeChangedEvent> event)
|
||||
{
|
||||
m_demolishButton->setChecked(event->active);
|
||||
|
||||
Reference in New Issue
Block a user