Use private and public instead of legacy LINK_

This commit is contained in:
2025-08-01 20:05:12 +02:00
parent c1367e494e
commit 96817ee672
6 changed files with 80 additions and 88 deletions

View File

@@ -12,7 +12,7 @@ implementation, that exposes the library to a user.
```sh ```sh
cmake -B build -G Ninja cmake -B build -G Ninja
make -C build ninja -C build
``` ```
Pass `-DCMAKE_BUILD_TYPE=Debug` or `-DCMAKE_BUILD_TYPE=Release` to Pass `-DCMAKE_BUILD_TYPE=Debug` or `-DCMAKE_BUILD_TYPE=Release` to

View File

@@ -18,14 +18,18 @@ FetchContent_Declare(toml11
) )
FetchContent_MakeAvailable(toml11) FetchContent_MakeAvailable(toml11)
add_executable(katja-cli main.cpp component.hpp component.cpp) set(FTXUI_BUILD_MODULES ON)
target_sources(katja-cli PUBLIC FILE_SET all_my_modules TYPE CXX_MODULES FILES page.cpp)
add_executable(katja-cli main.cpp)
target_sources(katja-cli PUBLIC FILE_SET all_my_modules TYPE CXX_MODULES FILES
component.cpp page.cpp
)
target_include_directories(katja-cli PRIVATE ${Boost_INCLUDE_DIR}) target_include_directories(katja-cli PRIVATE ${Boost_INCLUDE_DIR})
target_link_libraries(katja-cli target_link_libraries(katja-cli
LINK_PUBLIC katja PUBLIC katja
LINK_PRIVATE ftxui::screen PRIVATE ftxui::screen
LINK_PRIVATE ftxui::dom PRIVATE ftxui::dom
LINK_PRIVATE ftxui::component PRIVATE ftxui::component
LINK_PRIVATE toml11::toml11 PRIVATE toml11::toml11
) )
set_target_properties(katja-cli PROPERTIES RUNTIME_OUTPUT_NAME katja) set_target_properties(katja-cli PROPERTIES RUNTIME_OUTPUT_NAME katja)

View File

@@ -3,69 +3,86 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/ */
#include "component.hpp" module;
#include <optional>
#include <sstream> #include <sstream>
namespace katja #include <ftxui/component/event.hpp>
#include <ftxui/component/component.hpp>
#include <ftxui/dom/elements.hpp>
#include "katja/repository.hpp"
export module component;
export namespace katja
{ {
PackageListBase::PackageListBase(const std::string& title, const std::vector<package_identifier>& packages) class PackageListBase : public ftxui::ComponentBase
: title(title), packages(packages)
{ {
} std::string title;
const std::vector<package_identifier> packages;
std::optional<std::size_t> selected;
ftxui::Element PackageListBase::OnRender() public:
{ PackageListBase(const std::string& title, const std::vector<package_identifier>& packages = {})
std::vector<ftxui::Element> lines; : title(title), packages(packages)
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())
ftxui::Element OnRender() override
{ {
lines[this->selected.value()] |= ftxui::focus; std::vector<ftxui::Element> 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);
} }
std::stringstream summary;
summary << title << '(' << packages.size() << ')'; bool OnEvent(ftxui::Event event) override
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()) if (event == ftxui::Event::ArrowDown)
{ {
this->selected = std::make_optional<std::size_t>(0); if (!this->selected.has_value() && !this->packages.empty())
{
this->selected = std::make_optional<std::size_t>(0);
}
else if (this->selected.has_value() && this->selected.value() + 1 < this->packages.size())
{
this->selected = std::make_optional<std::size_t>(this->selected.value() + 1);
}
return true;
} }
else if (this->selected.has_value() && this->selected.value() + 1 < this->packages.size()) else if (event == ftxui::Event::ArrowUp)
{ {
this->selected = std::make_optional<std::size_t>(this->selected.value() + 1); if (!this->selected.has_value() && !this->packages.empty())
{
this->selected = std::make_optional<std::size_t>(0);
}
else if (this->selected.has_value()
&& this->selected.value() < this->packages.size()
&& this->selected.value() > 0)
{
this->selected = std::make_optional<std::size_t>(this->selected.value() - 1);
}
return true;
} }
return true; return false;
} }
else if (event == ftxui::Event::ArrowUp) };
{
if (!this->selected.has_value() && !this->packages.empty())
{
this->selected = std::make_optional<std::size_t>(0);
}
else if (this->selected.has_value()
&& this->selected.value() < this->packages.size()
&& this->selected.value() > 0)
{
this->selected = std::make_optional<std::size_t>(this->selected.value() - 1);
}
return true;
}
return false;
}
ftxui::Component PackageList(const std::string& title, const std::vector<package_identifier>& packages) ftxui::Component PackageList(const std::string& title, const std::vector<package_identifier>& packages = {})
{ {
return ftxui::Make<PackageListBase>(title, packages); return ftxui::Make<PackageListBase>(title, packages);
} }

View File

@@ -1,33 +0,0 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* 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/.
*/
#pragma once
#include <optional>
#include <ftxui/component/event.hpp>
#include <ftxui/component/component.hpp>
#include <ftxui/dom/elements.hpp>
#include "katja/repository.hpp"
namespace katja
{
class PackageListBase : public ftxui::ComponentBase
{
std::string title;
const std::vector<package_identifier> packages;
std::optional<std::size_t> selected;
public:
PackageListBase(const std::string& title, const std::vector<package_identifier>& packages = {});
ftxui::Element OnRender() override;
bool OnEvent(ftxui::Event event) override;
};
ftxui::Component PackageList(const std::string& title, const std::vector<package_identifier>& packages = {});
}

View File

@@ -7,10 +7,14 @@ module;
#include <algorithm> #include <algorithm>
#include "component.hpp" #include <ftxui/component/component.hpp>
#include "katja/repository.hpp"
export module page; export module page;
import component;
export namespace katja export namespace katja
{ {
class PageBase : public ftxui::ComponentBase class PageBase : public ftxui::ComponentBase

View File

@@ -13,7 +13,7 @@ foreach(test_source ${KATJA_TEST_SOURCES})
add_executable(${tester} ${test_source}) add_executable(${tester} ${test_source})
target_compile_definitions(${tester} PRIVATE "BOOST_TEST_DYN_LINK=1") target_compile_definitions(${tester} PRIVATE "BOOST_TEST_DYN_LINK=1")
target_link_libraries(${tester} LINK_PRIVATE katja Boost::unit_test_framework) target_link_libraries(${tester} PRIVATE katja Boost::unit_test_framework)
add_test(NAME ${test_name} COMMAND ${tester}) add_test(NAME ${test_name} COMMAND ${tester})
endforeach() endforeach()