Use std::optional instead of sentinel values for absent data
This commit is contained in:
@@ -142,7 +142,6 @@ GameWorldView::GameWorldView(Simulation* sim, const GameConfig* config,
|
||||
, m_ghostValid(false)
|
||||
, m_dragging(false)
|
||||
, m_demolishMode(false)
|
||||
, m_demolishHoverBuildingId(kInvalidBuildingId)
|
||||
, m_debugDraw(false)
|
||||
, m_rng(std::random_device{}())
|
||||
, m_boxSelecting(false)
|
||||
@@ -621,34 +620,34 @@ bool GameWorldView::isValidPlacement(BuildingType type, QPoint anchor,
|
||||
return true;
|
||||
}
|
||||
|
||||
BuildingId GameWorldView::buildingAtTile(QPoint tile) const
|
||||
std::optional<BuildingId> GameWorldView::buildingAtTile(QPoint tile) const
|
||||
{
|
||||
for (const Building& b : m_sim->getBuildings().getAllBuildings())
|
||||
{
|
||||
for (const QPoint& cell : b.bodyCells)
|
||||
{
|
||||
if (cell == tile)
|
||||
{
|
||||
return b.id;
|
||||
if (cell == tile)
|
||||
{
|
||||
return b.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
return kInvalidBuildingId;
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
BuildingId GameWorldView::siteAtTile(QPoint tile) const
|
||||
std::optional<BuildingId> GameWorldView::siteAtTile(QPoint tile) const
|
||||
{
|
||||
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
|
||||
{
|
||||
for (const QPoint& cell : s.bodyCells)
|
||||
{
|
||||
if (cell == tile)
|
||||
if (cell == tile)
|
||||
{
|
||||
return s.id;
|
||||
return s.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
return kInvalidBuildingId;
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
@@ -1617,9 +1616,9 @@ void GameWorldView::drawOverlays(QPainter& painter)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (m_demolishMode && m_demolishHoverBuildingId != kInvalidBuildingId)
|
||||
else if (m_demolishMode && m_demolishHoverBuildingId.has_value())
|
||||
{
|
||||
const Building* b = m_sim->getBuildings().findBuilding(m_demolishHoverBuildingId);
|
||||
const Building* b = m_sim->getBuildings().findBuilding(*m_demolishHoverBuildingId);
|
||||
if (b)
|
||||
{
|
||||
for (const QPoint& cell : b->bodyCells)
|
||||
@@ -1989,9 +1988,9 @@ void GameWorldView::mousePressEvent(QMouseEvent* event)
|
||||
// Shift + right-click copies a building's settings, but only in the
|
||||
// default selection mode (REQ-BLD-COPY-CONFIG).
|
||||
const QPoint tile = widgetToTile(event->pos());
|
||||
BuildingId id = buildingAtTile(tile);
|
||||
if (id == kInvalidBuildingId) { id = siteAtTile(tile); }
|
||||
if (id != kInvalidBuildingId) { copyConfigFrom(id); }
|
||||
std::optional<BuildingId> id = buildingAtTile(tile);
|
||||
if (!id.has_value()) { id = siteAtTile(tile); }
|
||||
if (id.has_value()) { copyConfigFrom(*id); }
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -2032,11 +2031,11 @@ void GameWorldView::mousePressEvent(QMouseEvent* event)
|
||||
// selection. Only active in the default selection mode.
|
||||
if ((event->modifiers() & Qt::ShiftModifier) && m_copiedConfig.has_value())
|
||||
{
|
||||
BuildingId id = buildingAtTile(tile);
|
||||
if (id == kInvalidBuildingId) { id = siteAtTile(tile); }
|
||||
if (id != kInvalidBuildingId)
|
||||
std::optional<BuildingId> id = buildingAtTile(tile);
|
||||
if (!id.has_value()) { id = siteAtTile(tile); }
|
||||
if (id.has_value())
|
||||
{
|
||||
pasteConfigTo(id);
|
||||
pasteConfigTo(*id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2064,13 +2063,14 @@ void GameWorldView::mousePressEvent(QMouseEvent* event)
|
||||
std::make_shared<EntitySelectedEvent>(std::nullopt));
|
||||
}
|
||||
|
||||
BuildingId id = buildingAtTile(tile);
|
||||
if (id == kInvalidBuildingId)
|
||||
std::optional<BuildingId> hit = buildingAtTile(tile);
|
||||
if (!hit.has_value())
|
||||
{
|
||||
id = siteAtTile(tile);
|
||||
hit = siteAtTile(tile);
|
||||
}
|
||||
if (id != kInvalidBuildingId)
|
||||
if (hit.has_value())
|
||||
{
|
||||
const BuildingId id = *hit;
|
||||
// A building/construction site outranks scrap (REQ-UI-SCRAP-CLICK-SELECT).
|
||||
clearScrapSelection();
|
||||
if (event->modifiers() & Qt::ControlModifier)
|
||||
@@ -2198,7 +2198,7 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
|
||||
command->id = id;
|
||||
enqueueCommand(command);
|
||||
}
|
||||
m_demolishHoverBuildingId = kInvalidBuildingId;
|
||||
m_demolishHoverBuildingId = std::nullopt;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2283,7 +2283,7 @@ void GameWorldView::toggleDemolishMode()
|
||||
if (m_demolishMode)
|
||||
{
|
||||
m_demolishMode = false;
|
||||
m_demolishHoverBuildingId = kInvalidBuildingId;
|
||||
m_demolishHoverBuildingId = std::nullopt;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2479,7 +2479,7 @@ void GameWorldView::resetForNewGame()
|
||||
m_ghostRotation = Rotation::East;
|
||||
m_ghostValid = false;
|
||||
m_demolishMode = false;
|
||||
m_demolishHoverBuildingId = kInvalidBuildingId;
|
||||
m_demolishHoverBuildingId = std::nullopt;
|
||||
EventManager::getInstance()->sendEventImmediately(
|
||||
std::make_shared<DemolishModeChangedEvent>(false));
|
||||
m_selectedBuildingIds.clear();
|
||||
|
||||
Reference in New Issue
Block a user