#pragma once #include #include #include namespace warfactory { using json = nlohmann::json; /** * @brief Pure Generic UI Interface - Zero assumptions about content * * Completely data-agnostic. Implementation decides how to handle each data type. */ class IUI { public: virtual ~IUI() = default; // ======================================== // LIFECYCLE // ======================================== /** * @brief Initialize UI system * @param config Generic config, implementation interprets */ virtual void initialize(const json& config) = 0; /** * @brief Update/render one frame * @return true to continue, false to quit */ virtual bool update() = 0; /** * @brief Clean shutdown */ virtual void shutdown() = 0; // ======================================== // GENERIC DATA FLOW // ======================================== /** * @brief Display any data of any type with layout/windowing info * @param dataType "economy", "map", "inventory", "status", whatever * @param data JSON with content + layout: * { * "content": {...}, // Actual data to display * "window": { // Window/layout configuration * "id": "economy_main", // Unique window ID * "title": "Economy Dashboard", * "parent": "main_dock", // Parent window/dock ID (optional) * "dock": "left", // Dock position: "left", "right", "top", "bottom", "center", "tab" * "size": {"width": 400, "height": 300}, * "position": {"x": 100, "y": 50}, * "floating": false, // true = floating window, false = docked * "resizable": true, * "closeable": true * } * } */ virtual void showData(const std::string& dataType, const json& data) = 0; /** * @brief Handle any user request of any type * @param requestType "get_prices", "move_unit", "save_game", whatever * @param callback Function to call when request happens */ virtual void onRequest(const std::string& requestType, std::function callback) = 0; /** * @brief Show any event/message * @param level "info", "error", "debug", whatever * @param message Human readable text */ virtual void showEvent(const std::string& level, const std::string& message) = 0; // ======================================== // WINDOW MANAGEMENT // ======================================== /** * @brief Create or configure a dock/container window * @param dockId Unique dock identifier * @param config Dock configuration: * { * "type": "dock", // "dock", "tabbed", "split" * "orientation": "horizontal", // "horizontal", "vertical" (for splits) * "parent": "main_window", // Parent dock (for nested docks) * "position": "left", // Initial position * "size": {"width": 300}, // Initial size * "collapsible": true, // Can be collapsed * "tabs": true // Enable tabbed interface * } */ virtual void createDock(const std::string& dockId, const json& config) = 0; /** * @brief Close/remove window or dock * @param windowId Window or dock ID to close */ virtual void closeWindow(const std::string& windowId) = 0; /** * @brief Focus/bring to front a specific window * @param windowId Window ID to focus */ virtual void focusWindow(const std::string& windowId) = 0; // ======================================== // GENERIC STATE // ======================================== /** * @brief Get current UI state * @return JSON state, implementation defines structure */ virtual json getState() const = 0; /** * @brief Restore UI state * @param state JSON state from previous getState() */ virtual void setState(const json& state) = 0; }; } // namespace warfactory