#pragma once #include #include #include #include #include #include #include #include "GameConfig.h" #include "Rotation.h" #include "ShipLayout.h" #include "ShipLayoutBlueprint.h" class QPushButton; class ShipStatsPanel; class ShipLayoutDialog : public QDialog { Q_OBJECT public: ShipLayoutDialog(const GameConfig* config, const std::string& shipId, const ShipLayoutConfig& currentLayout, std::vector& allBlueprints, std::set unlockedModuleIds, std::map moduleLevels, bool debugDraw, QWidget* parent = nullptr); std::optional result() const; protected: void keyPressEvent(QKeyEvent* event) override; signals: void gridCellClicked(QPoint cell); private slots: void onModuleButtonClicked(int index); void onConfirm(); void onCancel(); public: struct CellInfo { bool buildable; int moduleIndex; // -1 if empty }; private: void rebuildOccupancy(); void updateGridWidget(); void updateStats(); bool canPlaceModule(const ModuleDef& def, QPoint position, Rotation rotation) const; std::vector rotatedMask(const ModuleDef& def, Rotation rotation) const; void loadLayoutBlueprint(const std::vector& modules); const GameConfig* m_config; std::string m_shipId; std::set m_unlockedModuleIds; std::map m_moduleLevels; std::vector m_shipLayout; int m_rows; int m_cols; std::vector m_placedModules; std::vector> m_grid; int m_activeModuleIndex; // -1 = remove mode, -2 = no selection Rotation m_currentRotation; std::vector m_moduleButtons; QPushButton* m_removeButton; QWidget* m_gridWidget; ShipStatsPanel* m_statsPanel; bool m_debugDraw; std::optional m_result; };