diff options
Diffstat (limited to 'cli/page.cpp')
| -rw-r--r-- | cli/page.cpp | 264 |
1 files changed, 156 insertions, 108 deletions
diff --git a/cli/page.cpp b/cli/page.cpp index 3f83682..fe0bd5a 100644 --- a/cli/page.cpp +++ b/cli/page.cpp @@ -3,150 +3,198 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "page.hpp" +module; #include <algorithm> -namespace katja +#include "component.hpp" + +export module page; + +export namespace katja { - ScreenContainer::ScreenContainer(std::vector<std::pair<std::string, Page>> pages, std::function<void()> on_enter) - : on_enter(on_enter) + class PageBase : public ftxui::ComponentBase { - ftxui::Components menu_pages; + public: + virtual void Load() = 0; + }; - std::transform(std::cbegin(pages), std::cend(pages), std::back_inserter(menu_entries), - [](const std::pair<std::string, Page>& pair) { return pair.first; }); - std::transform(std::cbegin(pages), std::cend(pages), std::back_inserter(this->menu_pages), - [](const std::pair<std::string, Page>& pair) { return pair.second; }); - std::copy(std::cbegin(this->menu_pages), std::cend(this->menu_pages), std::back_inserter(menu_pages)); + using Page = std::shared_ptr<PageBase>; + using Pages = std::vector<Page>; - ftxui::MenuOption menu_option = ftxui::MenuOption::Horizontal(); - this->menu = ftxui::Toggle(&this->menu_entries, &this->menu_selected); + 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; + + public: + ScreenContainer(std::vector<std::pair<std::string, Page>> pages, std::function<void()> on_enter) + : on_enter(on_enter) + { + ftxui::Components menu_pages; - this->content = ftxui::Container::Tab(std::move(menu_pages), &this->menu_selected); - } + std::transform(std::cbegin(pages), std::cend(pages), std::back_inserter(menu_entries), + [](const std::pair<std::string, Page>& pair) { return pair.first; }); + std::transform(std::cbegin(pages), std::cend(pages), std::back_inserter(this->menu_pages), + [](const std::pair<std::string, Page>& pair) { return pair.second; }); + std::copy(std::cbegin(this->menu_pages), std::cend(this->menu_pages), std::back_inserter(menu_pages)); - ftxui::Element ScreenContainer::OnRender() - { - return ftxui::vbox({ - this->menu->Render(), - ftxui::separator(), - this->content->Render() - }); - } + ftxui::MenuOption menu_option = ftxui::MenuOption::Horizontal(); + this->menu = ftxui::Toggle(&this->menu_entries, &this->menu_selected); - bool ScreenContainer::OnEvent(ftxui::Event event) - { - if (event == ftxui::Event::CtrlQ && this->on_enter) - { - on_enter(); - return true; + this->content = ftxui::Container::Tab(std::move(menu_pages), &this->menu_selected); } - int previously = this->menu_selected; - bool result{ false }; - if (event == ftxui::Event::CtrlP) - { - result = menu->OnEvent(ftxui::Event::ArrowLeft); - } - else if (event == ftxui::Event::CtrlN) - { - result = menu->OnEvent(ftxui::Event::ArrowRight); - } - if (previously != this->menu_selected) + ftxui::Element OnRender() override { - this->menu_pages.at(this->menu_selected)->Load(); + return ftxui::vbox({ + this->menu->Render(), + ftxui::separator(), + this->content->Render() + }); } - if (!result) + + bool OnEvent(ftxui::Event event) override { - result = this->menu_pages.at(this->menu_selected)->OnEvent(event); + if (event == ftxui::Event::CtrlQ && this->on_enter) + { + on_enter(); + return true; + } + int previously = this->menu_selected; + bool result{ false }; + + if (event == ftxui::Event::CtrlP) + { + result = menu->OnEvent(ftxui::Event::ArrowLeft); + } + else if (event == ftxui::Event::CtrlN) + { + result = menu->OnEvent(ftxui::Event::ArrowRight); + } + if (previously != this->menu_selected) + { + this->menu_pages.at(this->menu_selected)->Load(); + } + if (!result) + { + result = this->menu_pages.at(this->menu_selected)->OnEvent(event); + } + return result; } - return result; - } + }; ftxui::Component Screen(std::vector<std::pair<std::string, Page>> pages, std::function<void()> on_enter) { return std::make_shared<ScreenContainer>(std::move(pages), on_enter); } - ftxui::Element WelcomePage::OnRender() - { - return ftxui::paragraph("Select an action in the menu."); - } - - void WelcomePage::Load() + class WelcomePage final : public PageBase { - } + public: + void Load() override + { + } - UpdatesPage::UpdatesPage(std::shared_ptr<struct repository> repository, package_database database) - : repository(repository), database(database) - { - } + ftxui::Element OnRender() override + { + return ftxui::paragraph("Select an action in the menu."); + } + }; - void UpdatesPage::Load() + class UpdatesPage final : public PageBase { - this->updatable = PackageList("Updates", repository->get_updates(this->database)); - } + ftxui::Component updatable = PackageList("Updates"); + std::shared_ptr<struct repository> repository; + package_database database; - ftxui::Element UpdatesPage::OnRender() - { - return this->updatable->Render(); - } + public: + UpdatesPage(std::shared_ptr<struct repository> repository, package_database database) + : repository(repository), database(database) + { + } - SearchPage::SearchPage(std::shared_ptr<struct repository> repository, const std::string& architecture) - : repository(repository), architecture(architecture) - { - ftxui::InputOption search_input_option = { .multiline = false }; - this->search_input = ftxui::Input(&this->needle, "Search", search_input_option); - this->type_input = ftxui::Radiobox(std::vector<std::string>{ "Names", "Description" }, &this->search_type); - } + void Load() override + { + this->updatable = PackageList("Updates", repository->get_updates(this->database)); + } - void SearchPage::Load() - { - this->needle.erase(); - } + ftxui::Element OnRender() override + { + return this->updatable->Render(); + } + }; - ftxui::Element SearchPage::OnRender() + class SearchPage final : public PageBase { - std::vector<ftxui::Element> lines; - - ftxui::FlexboxConfig config; - config.justify_content = ftxui::FlexboxConfig::JustifyContent::SpaceAround; - config.align_items = ftxui::FlexboxConfig::AlignItems::FlexStart; - config.direction = ftxui::FlexboxConfig::Direction::Row; - config.wrap = ftxui::FlexboxConfig::Wrap::NoWrap; - config.SetGap(3, 0); - - return ftxui::vbox({ - ftxui::flexbox({ - this->search_input->Render(), - ftxui::window(ftxui::text("Search in"), type_input->Render()) - }, config), - this->search_results->Render() | ftxui::flex - }); - } + std::string needle; + ftxui::Component search_input; + ftxui::Component type_input; + std::shared_ptr<struct repository> repository; + std::string architecture; + ftxui::Component search_results = PackageList("Results"); + int search_type{ 0 }; + + public: + SearchPage(std::shared_ptr<struct repository> repository, const std::string& architecture) + : repository(repository), architecture(architecture) + { + ftxui::InputOption search_input_option = { .multiline = false }; + this->search_input = ftxui::Input(&this->needle, "Search", search_input_option); + this->type_input = ftxui::Radiobox(std::vector<std::string>{ "Names", "Description" }, &this->search_type); + } - bool SearchPage::OnEvent(ftxui::Event event) - { - if (event == ftxui::Event::Return) + void Load() override { - if (!this->needle.empty()) - { - std::vector<package_identifier> result = - this->repository->search_names(this->architecture, this->needle); - this->search_results = PackageList("Search", std::move(result)); - } - return true; + this->needle.erase(); } - else if (event == ftxui::Event::ArrowUp || event == ftxui::Event::ArrowDown) + + ftxui::Element OnRender() override { - this->search_results->OnEvent(event); - return true; + std::vector<ftxui::Element> lines; + + ftxui::FlexboxConfig config; + config.justify_content = ftxui::FlexboxConfig::JustifyContent::SpaceAround; + config.align_items = ftxui::FlexboxConfig::AlignItems::FlexStart; + config.direction = ftxui::FlexboxConfig::Direction::Row; + config.wrap = ftxui::FlexboxConfig::Wrap::NoWrap; + config.SetGap(3, 0); + + return ftxui::vbox({ + ftxui::flexbox({ + this->search_input->Render(), + ftxui::window(ftxui::text("Search in"), type_input->Render()) + }, config), + this->search_results->Render() | ftxui::flex + }); } - else + + bool OnEvent(ftxui::Event event) override { - return this->search_input->OnEvent(event); + if (event == ftxui::Event::Return) + { + if (!this->needle.empty()) + { + std::vector<package_identifier> result = + this->repository->search_names(this->architecture, this->needle); + this->search_results = PackageList("Search", std::move(result)); + } + return true; + } + else if (event == ftxui::Event::ArrowUp || event == ftxui::Event::ArrowDown) + { + this->search_results->OnEvent(event); + return true; + } + else + { + return this->search_input->OnEvent(event); + } + return false; } - return false; - } + }; } |
