#pragma once #include #include #include #include #include #include #include "BuilderModeExitedEvent.h" #include "BuildHotkeyPressedEvent.h" #include "BuildingBlocksChangedEvent.h" #include "BuildingType.h" #include "DeconstructModeChangedEvent.h" #include "EventHandler.h" #include "GameConfig.h" #include "UnlockedBuildingsChangedEvent.h" class QPushButton; class Simulation; class ItemIconCache; class BuildButtonGrid : public QWidget, public CombinedEventHandler { Q_OBJECT public: // iconDir is the directory holding the per-building ".svg" chip icons // (REQ-UI-BUILD-GRID); itemsIconDir holds the per-item icons and supplies the // building_block icon shown in each button's cost (REQ-UI-BUILD-COST). Both are // read from disk at runtime, like the config files. BuildButtonGrid(Simulation* sim, const GameConfig* config, const std::string& iconDir, const std::string& itemsIconDir, QWidget* parent = nullptr); ~BuildButtonGrid() override; void clearActiveButton(); private: // Re-evaluates which build buttons are enabled from the current building block // stock (read from the simulation). If the currently selected tool can no longer // be afforded, it exits builder mode so the button does not stay selected. void updateAffordability(); // Re-evaluates which build buttons are visible from the current per-building // unlock state (REQ-LOCK-BUILDING); a locked building type's button is hidden. void updateVisibility(); void handleEvent(std::shared_ptr event) override; void handleEvent(std::shared_ptr event) override; void handleEvent(std::shared_ptr event) override; void handleEvent(std::shared_ptr event) override; void handleEvent(std::shared_ptr event) override; private slots: void onBuildButton(int index); private: Simulation* m_sim; const GameConfig* m_config; std::string m_iconDir; std::unique_ptr m_itemIcons; std::vector m_types; std::vector m_buttons; std::map m_costs; std::optional m_activeIndex; QPushButton* m_deconstructButton; };