Add package list component

This commit is contained in:
2025-04-27 11:59:07 +02:00
parent c8628af601
commit 933f4bb481
6 changed files with 273 additions and 183 deletions

View File

@@ -1,76 +1,28 @@
#pragma once
#include <optional>
#include <ftxui/component/event.hpp>
#include <ftxui/component/component_base.hpp>
#include <ftxui/component/component.hpp>
#include <ftxui/dom/elements.hpp>
#include "katja/repository.hpp"
#include "katja/database.hpp"
namespace katja
{
class PageBase : public ftxui::ComponentBase
class PackageListBase : public ftxui::ComponentBase
{
public:
virtual void Load() = 0;
};
using Page = std::shared_ptr<PageBase>;
using Pages = std::vector<Page>;
class ScreenContainer final : public ftxui::ComponentBase
{
int menu_selected{ 0 };
ftxui::Component menu;
ftxui::Component content;
std::vector<std::string> menu_entries;
Pages menu_pages;
std::function<void()> on_enter;
std::string title;
const std::vector<package_identifier> packages;
std::optional<std::size_t> selected;
public:
ScreenContainer(std::vector<std::pair<std::string, Page>> pages, std::function<void()> on_enter);
PackageListBase(const std::string& title, const std::vector<package_identifier>& packages = {});
ftxui::Element OnRender() override;
bool OnEvent(ftxui::Event event) override;
};
ftxui::Component Screen(std::vector<std::pair<std::string, Page>> pages, std::function<void()> on_enter);
class WelcomePage final : public PageBase
{
public:
void Load() override;
ftxui::Element OnRender() override;
};
class UpdatesPage final : public PageBase
{
std::vector<package_identifier> updatable;
std::shared_ptr<struct repository> repository;
package_database database;
public:
UpdatesPage(std::shared_ptr<struct repository> repository, package_database database);
void Load() override;
ftxui::Element OnRender() override;
};
class SearchPage final : public PageBase
{
std::string needle;
ftxui::Component search_input;
ftxui::Component type_input;
std::shared_ptr<struct repository> repository;
std::string architecture;
std::vector<package_identifier> search_results;
int search_type{ 0 };
public:
SearchPage(std::shared_ptr<struct repository> repository, const std::string& architecture);
void Load() override;
ftxui::Element OnRender() override;
bool OnEvent(ftxui::Event event) override;
};
ftxui::Component PackageList(const std::string& title, const std::vector<package_identifier>& packages = {});
}