#pragma once #include #include #include #include "ShipLayout.h" #include "ShipStatsCalculator.h" #include "BehaviorKind.h" struct GameConfig; class BarRow; class SectionBox; class StatRow; // The hull stats and capability module summaries of one ship, as a bar for HP and a // label/value row for everything else. Shared by the live selection card // (REQ-UI-SHIP-STATS-PANEL), the layout configuration dialog's design preview // (REQ-MOD-UI-STATS-PANEL) and the balancing tool, so all three read alike. // // The behavior row is for consumers with no header to put it in. The selection card // shows the behavior in its header instead (REQ-UI-SHIP-BEHAVIOR) and leaves the row // unset; the design preview has no live ship to have a behavior at all. class ShipStatsPanel : public QWidget { Q_OBJECT public: explicit ShipStatsPanel(const GameConfig* config, QWidget* parent = nullptr); // Stats of a design rather than of a live ship: the HP bar reads full, because the // number shown is the maximum the design would have. void refresh(const std::string& shipId, const std::vector& modules); void refreshFromLive(const ShipStats& stats, float currentHp); // Shows the ship's top-priority behavior as a row of its own. Never called by the // selection card, which has a header slot for it. void setBehavior(BehaviorKind kind); void setThreatCost(double cost); void setDebugDrawEnabled(bool enabled); private: void applyStats(const ShipStats& stats, double hpFraction, const QString& hpText); const GameConfig* m_config; bool m_debugDraw = false; BarRow* m_hpBar; StatRow* m_speedRow; StatRow* m_sensorRangeRow; StatRow* m_mainAccelRow; StatRow* m_maneuveringAccelRow; StatRow* m_angularAccelRow; StatRow* m_maxRotSpeedRow; StatRow* m_cargoCapacityRow; SectionBox* m_weaponSection; StatRow* m_weaponDpsRow; StatRow* m_weaponRangeRow; SectionBox* m_salvageSection; StatRow* m_salvageRateRow; StatRow* m_salvageRangeRow; SectionBox* m_repairSection; StatRow* m_repairRateRow; StatRow* m_repairRangeRow; StatRow* m_behaviorRow; StatRow* m_threatCostRow; };