#pragma once #include #include #include #include namespace lumacs { class Window; // Forward declaration /// @brief Represents a chunk of text in the modeline with a specific face. struct ModelineChunk { std::string text; ///< The text content to display. std::string face_name; ///< The face name for styling (e.g., "mode-line", "mode-line-inactive"). }; /// @brief Interface for a modeline segment (e.g., buffer name, line number). class ModelineSegment { public: virtual ~ModelineSegment() = default; /// @brief Generate the text chunks for this segment. /// @param window The window context. /// @param active Whether the window is currently focused. /// @return A vector of styled text chunks. virtual std::vector generate(const std::shared_ptr& window, bool active) = 0; /// @brief Get the unique name of the segment (for debugging/config). virtual std::string name() const = 0; }; /// @brief Manages the composition of the modeline from various segments. class ModelineManager { public: ModelineManager(); /// @brief Initialize the default set of segments. void create_default_segments(); /// @brief Register a new segment to be displayed. void add_segment(std::shared_ptr segment); /// @brief Remove all registered segments. void clear_segments(); /// @brief Generate the complete modeline content for a specific window. /// @param window The window to generate modeline for. /// @param active Whether the window is active (focused). /// @return Full list of styled chunks. std::vector generate_content(const std::shared_ptr& window, bool active); private: std::vector> segments_; }; } // namespace lumacs