From 4c7b2fdcee4308728eca7522f673b9e81916b65f Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Tue, 21 Apr 2026 21:12:17 +0200 Subject: [PATCH] implement demolish button --- src/ui/BuildButtonGrid.cpp | 11 +++++++++++ src/ui/BuildButtonGrid.h | 5 +++++ src/ui/GameWorldView.cpp | 28 ++++++++++++++++++---------- src/ui/GameWorldView.h | 2 ++ src/ui/MainWindow.cpp | 6 ++++++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/ui/BuildButtonGrid.cpp b/src/ui/BuildButtonGrid.cpp index 3d7f4d8..038fd98 100644 --- a/src/ui/BuildButtonGrid.cpp +++ b/src/ui/BuildButtonGrid.cpp @@ -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(m_buttons.size())) diff --git a/src/ui/BuildButtonGrid.h b/src/ui/BuildButtonGrid.h index eaa215a..3caca2a 100644 --- a/src/ui/BuildButtonGrid.h +++ b/src/ui/BuildButtonGrid.h @@ -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 m_buttons; std::map m_costs; int m_activeIndex; + QPushButton* m_demolishButton; }; diff --git a/src/ui/GameWorldView.cpp b/src/ui/GameWorldView.cpp index b582733..1256a2e 100644 --- a/src/ui/GameWorldView.cpp +++ b/src/ui/GameWorldView.cpp @@ -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; diff --git a/src/ui/GameWorldView.h b/src/ui/GameWorldView.h index d4a8710..746dcd3 100644 --- a/src/ui/GameWorldView.h +++ b/src/ui/GameWorldView.h @@ -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(); diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index ca8ba08..54fcb0a 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -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)));