Files
roro9stack/lib/ui/src/input_history.h
T
twislaandClaude Opus 5.5 5ac6afa557 IRC App: Alt scrolls, Up/Down recall sent lines; /j for /join
- Alt + ; / Alt + . scroll the Buffer back and forward
- Up / Down (Fn + ; / Fn + .) browse the last 30 sent lines, shell-style,
  returning to the draft past the newest (InputHistory, host-tested)
- /j is short for /join

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
2026-10-03 20:12:33 +02:00

51 lines
1.4 KiB
C++

#pragma once
#include <deque>
#include <string>
namespace roro {
// Lines already entered, browsed shell-style: up() goes back in time, down() forward, and past the
// newest line the draft being typed comes back.
class InputHistory {
public:
explicit InputHistory(size_t capacity) : capacity_(capacity) {}
void add(const std::string& line) {
browsing_ = -1;
if (line.empty() || (!lines_.empty() && lines_.back() == line)) return;
lines_.push_back(line);
if (lines_.size() > capacity_) lines_.pop_front();
}
// `current` is what the editor holds now (kept as the draft when browsing starts).
bool up(const std::string& current, std::string& out) {
if (lines_.empty() || browsing_ == 0) return false;
if (browsing_ < 0) {
draft_ = current;
browsing_ = static_cast<int>(lines_.size());
}
out = lines_[--browsing_];
return true;
}
bool down(std::string& out) {
if (browsing_ < 0) return false;
if (++browsing_ >= static_cast<int>(lines_.size())) {
browsing_ = -1;
out = draft_;
} else {
out = lines_[browsing_];
}
return true;
}
private:
size_t capacity_;
std::deque<std::string> lines_;
int browsing_ = -1; // index being shown, -1 when editing the draft
std::string draft_;
};
} // namespace roro