implement demolish button

This commit is contained in:
2026-04-21 21:12:17 +02:00
parent f2c9685ce0
commit 4c7b2fdcee
5 changed files with 42 additions and 10 deletions

View File

@@ -82,6 +82,12 @@ BuildButtonGrid::BuildButtonGrid(const GameConfig* config, QWidget* parent)
}
}
connect(mapper, SIGNAL(mapped(int)), this, SLOT(onBuildButton(int)));
m_demolishButton = new QPushButton("Demolish", this);
m_demolishButton->setCheckable(true);
m_demolishButton->setFixedHeight(48);
layout->addWidget(m_demolishButton, row, col);
connect(m_demolishButton, SIGNAL(clicked()), this, SIGNAL(demolishModeToggleRequested()));
}
void BuildButtonGrid::updateAffordability(int buildingBlocks)
@@ -95,6 +101,11 @@ void BuildButtonGrid::updateAffordability(int buildingBlocks)
}
}
void BuildButtonGrid::setDemolishModeActive(bool active)
{
m_demolishButton->setChecked(active);
}
void BuildButtonGrid::clearActiveButton()
{
if (m_activeIndex >= 0 && m_activeIndex < static_cast<int>(m_buttons.size()))

View File

@@ -23,6 +23,10 @@ public:
signals:
void buildingTypeSelected(BuildingType type);
void builderModeExited();
void demolishModeToggleRequested();
public slots:
void setDemolishModeActive(bool active);
private slots:
void onBuildButton(int index);
@@ -33,4 +37,5 @@ private:
std::vector<QPushButton*> m_buttons;
std::map<BuildingType, int> m_costs;
int m_activeIndex;
QPushButton* m_demolishButton;
};

View File

@@ -901,16 +901,7 @@ void GameWorldView::keyPressEvent(QKeyEvent* event)
emit escapeMenuRequested();
break;
case Qt::Key_Backspace:
if (m_demolishMode)
{
m_demolishMode = false;
m_demolishHoverId = kInvalidEntityId;
}
else
{
if (m_builderType.has_value()) { exitBuilderMode(); }
m_demolishMode = true;
}
toggleDemolishMode();
break;
default:
QOpenGLWidget::keyPressEvent(event);
@@ -1090,12 +1081,28 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
// Slots
// ---------------------------------------------------------------------------
void GameWorldView::toggleDemolishMode()
{
if (m_demolishMode)
{
m_demolishMode = false;
m_demolishHoverId = kInvalidEntityId;
}
else
{
if (m_builderType.has_value()) { exitBuilderMode(); }
m_demolishMode = true;
}
emit demolishModeChanged(m_demolishMode);
}
void GameWorldView::enterBuilderMode(BuildingType type)
{
m_builderType = type;
m_ghostRotation = Rotation::East;
m_ghostValid = false;
m_demolishMode = false;
emit demolishModeChanged(false);
}
void GameWorldView::exitBuilderMode()
@@ -1128,6 +1135,7 @@ void GameWorldView::resetForNewGame()
m_ghostValid = false;
m_demolishMode = false;
m_demolishHoverId = kInvalidEntityId;
emit demolishModeChanged(false);
m_selectedIds.clear();
m_boxSelecting = false;
m_scrollXTiles = 0.0f;

View File

@@ -47,6 +47,7 @@ signals:
void gameOver();
void builderModeExited();
void escapeMenuRequested();
void demolishModeChanged(bool active);
public:
double gameSpeed() const;
@@ -54,6 +55,7 @@ public:
public slots:
void enterBuilderMode(BuildingType type);
void exitBuilderMode();
void toggleDemolishMode();
void setGameSpeed(double multiplier);
void resetForNewGame();

View File

@@ -65,6 +65,12 @@ MainWindow::MainWindow(Simulation* sim, const GameConfig* config,
connect(m_gameWorldView, SIGNAL(builderModeExited()),
m_buildButtonGrid, SLOT(clearActiveButton()));
connect(m_buildButtonGrid, SIGNAL(demolishModeToggleRequested()),
m_gameWorldView, SLOT(toggleDemolishMode()));
connect(m_gameWorldView, SIGNAL(demolishModeChanged(bool)),
m_buildButtonGrid, SLOT(setDemolishModeActive(bool)));
// Signals: header bar → game world
connect(m_headerBar, SIGNAL(speedChanged(double)),
m_gameWorldView, SLOT(setGameSpeed(double)));