#pragma once #include #include #include #include #include "BuildingBlocksChangedEvent.h" #include "BuildingId.h" #include "EscapeMenuRequestedEvent.h" #include "EventHandler.h" #include "GameOverEvent.h" #include "LayoutDialogRequestedEvent.h" #include "ModalDimOverlay.h" #include "WinEvent.h" #include "RecipeSelectionRequestedEvent.h" #include "SchematicChoicesAvailableEvent.h" #include "ShipLayout.h" #include "ShipLayoutBlueprint.h" #include "Tick.h" #include "VisualsConfig.h" struct ParsedReplay; class Simulation; class GameWorldView; class HeaderBar; class SelectedBuildingPanel; class BuildButtonGrid; class BlueprintPanel; class QCloseEvent; class QResizeEvent; class MainWindow : public QWidget, public CombinedEventHandler { Q_OBJECT public: MainWindow(Simulation* sim, const std::string& configDir, std::shared_ptr replay = nullptr, QWidget* parent = nullptr); ~MainWindow() override; protected: void resizeEvent(QResizeEvent* event) override; void closeEvent(QCloseEvent* event) override; private: 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; void handleEvent(std::shared_ptr event) override; void handleEvent(std::shared_ptr event) override; // Opens the shipyard layout configuration dialog for the given schematic and // current layout, applying the result via SetShipLayoutCommand (REQ-MOD-UI-DIALOG). void openShipLayoutDialog(BuildingId shipyardId, const std::string& schematicId, const ShipLayoutConfig& currentLayout); void layoutPanels(); private: std::string m_configDir; VisualsConfig m_visuals; Simulation* m_sim; GameWorldView* m_gameWorldView; HeaderBar* m_headerBar; SelectedBuildingPanel* m_selectedBuildingPanel; BuildButtonGrid* m_buildButtonGrid; BlueprintPanel* m_blueprintPanel; QWidget* m_sidePanel; ModalDimOverlay* m_dimOverlay = nullptr; std::vector m_layoutBlueprints; std::shared_ptr m_replay; // non-null => view-only playback };