#pragma once #include #include #include // For std::iota namespace lumacs { /// @brief Manages history for a specific minibuffer type (e.g., commands, file paths). class HistoryManager { public: HistoryManager() : history_index_(0) {} /// @brief Adds an item to the history. /// Only adds if the item is not empty and not a duplicate of the last item. void add_item(const std::string& item) { if (!item.empty() && (history_.empty() || history_.back() != item)) { history_.push_back(item); } history_index_ = history_.size(); // Reset index to end after adding } /// @brief Navigates to the previous item in history. /// @return The previous item, or empty string if no more history. std::string previous() { if (!history_.empty()) { if (history_index_ > 0) { history_index_--; } return history_[history_index_]; } return ""; } /// @brief Navigates to the next item in history. /// @return The next item, or empty string if at the end of history. std::string next() { if (!history_.empty()) { if (history_index_ < history_.size() - 1) { history_index_++; return history_[history_index_]; } else if (history_index_ == history_.size() - 1) { // If at the end, and pressing next, clear input (or original input before history nav) history_index_++; // Move past the last valid index return ""; } } return ""; } /// @brief Clears the history. void clear() { history_.clear(); history_index_ = 0; } /// @brief Returns true if history is empty, false otherwise. bool empty() const { return history_.empty(); } private: std::vector history_; size_t history_index_; // Current position in history }; } // namespace lumacs