#pragma once #include #include #include "BuildingId.h" #include "SelectionContent.h" struct BuildingTarget; class BufferSection; class ProductionSection; class RecipeSummaryRow; // Shared body of the four cards that show one building with buffers -- the Miner and // Assembler, the Smelter and Reprocessing Plant, the Shipyard, and the Salvage Bay // (REQ-UI-SELECTION-CONTENT). All four show the same header identity and status, recipe // summary, buffer contents and production progress; they differ only in what one // production cycle costs and how long it takes, which is what the subclass supplies. // // This is implementation sharing, not a catalog entry: every concrete subclass is one // row of the content catalog. class BufferedBuildingContent : public SelectionContent { Q_OBJECT protected: // What one production cycle of this building consumes, produces, and takes. struct CycleInfo { std::map perCycleInputs; std::map perCycleOutputs; // False when the building produces nothing at all (the Salvage Bay, // REQ-BLD-SALVAGE-BAY) or has no recipe or schematic selected yet: the // production section is then not shown (REQ-UI-PRODUCTION-PROGRESS). bool runsProduction = false; // 0 while an auto-recipe building sits between cycles, when no single recipe // names a cycle time; the progress line then reads "idle". double durationSeconds = 0.0; }; BufferedBuildingContent(const SelectionContext& context, BuildingId id, QWidget* parent); // Called with a construction site's stored configuration too, so the summary of what // the building will produce is shown before it is built (REQ-BLD-SITE-CONFIG). virtual CycleInfo getCycleInfo(const BuildingTarget& target) const = 0; // The subclass's own configuration controls. The identity, the recipe summary, the // buffers and the production progress are handled here. virtual void refreshControls(const BuildingTarget& /*target*/) {} BuildingId getBuildingId() const { return m_id; } private: void refreshConfiguration() override; void refreshRuntime() override; BuildingId m_id; RecipeSummaryRow* m_recipeSummary; BufferSection* m_buffers; ProductionSection* m_production; };