#pragma once #include #include #include #include #include #include "BlueprintSaveRequestedEvent.h" #include "BlueprintSelectionRequestedEvent.h" #include "BuildingId.h" #include "EscapeMenuRequestedEvent.h" #include "EventHandler.h" #include "GameConfig.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 SelectionPanel; class BuildButtonBar; class BlueprintLibrary; class BuildingIconCache; class ItemIconCache; 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; void handleEvent(std::shared_ptr event) override; // Reloads the game config and visuals.toml from disk (REQ-CFG-RELOAD), shared // by every restart path. On success the reloaded visuals are applied to this // window and the fresh GameConfig is returned; on failure a modal error dialog // is shown and std::nullopt is returned, leaving the window state untouched. std::optional reloadConfig(); // 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); // Runs the blueprint selection dialog and enters placement mode for whatever the // player picked (REQ-UI-BLUEPRINT-DIALOG). Holds no pause or dim scope of its own: // both callers already hold theirs, which is what keeps the dim continuous when a // confirmed save hands straight over to this dialog (REQ-UI-MODAL-DIM). void showBlueprintSelectionDialog(); void layoutPanels(); private: std::string m_configDir; VisualsConfig m_visuals; Simulation* m_sim; // One per-item icon cache for the whole window (REQ-UI-ITEM-ICON): the header, // build bar, world view, and recipe dialog all rasterize the same SVGs. std::unique_ptr m_itemIcons; // Likewise one per-building chip cache (REQ-UI-BUILD-ICON), shared by the build bar // and the selection panel's card headers (REQ-UI-SELECTION-CARD). std::unique_ptr m_buildingIcons; GameWorldView* m_gameWorldView; HeaderBar* m_headerBar; SelectionPanel* m_selectionPanel; BuildButtonBar* m_buildButtonBar; // The saved blueprints themselves; they have no widget of their own any more and // are reached through the two modal dialogs (REQ-UI-BLUEPRINT-DIALOG). std::unique_ptr m_blueprintLibrary; ModalDimOverlay* m_dimOverlay = nullptr; std::vector m_layoutBlueprints; std::shared_ptr m_replay; // non-null => view-only playback };