#include "component.hpp" #include namespace katja { PackageListBase::PackageListBase(const std::string& title, const std::vector& packages) : title(title), packages(packages) { } ftxui::Element PackageListBase::OnRender() { std::vector lines; for (const auto& package_identifier : this->packages) { auto line = ftxui::text(package_identifier.to_string()) | color(ftxui::Color::SkyBlue2); lines.push_back(line); } if (this->selected.has_value() && this->selected.value() < lines.size()) { lines[this->selected.value()] |= ftxui::focus; } std::stringstream summary; summary << title << '(' << packages.size() << ')'; return ftxui::window(ftxui::text(summary.str()), ftxui::vbox(lines) | ftxui::yframe); } bool PackageListBase::OnEvent(ftxui::Event event) { if (event == ftxui::Event::ArrowDown) { if (!this->selected.has_value() && !this->packages.empty()) { this->selected = std::make_optional(0); } else if (this->selected.has_value() && this->selected.value() + 1 < this->packages.size()) { this->selected = std::make_optional(this->selected.value() + 1); } return true; } else if (event == ftxui::Event::ArrowUp) { if (!this->selected.has_value() && !this->packages.empty()) { this->selected = std::make_optional(0); } else if (this->selected.has_value() && this->selected.value() < this->packages.size() && this->selected.value() > 0) { this->selected = std::make_optional(this->selected.value() - 1); } return true; } return false; } ftxui::Component PackageList(const std::string& title, const std::vector& packages) { return ftxui::Make(title, packages); } }