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
cmake -B build -G Ninja
make -C build
ninja -C build
```
Pass `-DCMAKE_BUILD_TYPE=Debug` or `-DCMAKE_BUILD_TYPE=Release` to

View File

@@ -18,14 +18,18 @@ FetchContent_Declare(toml11
)
FetchContent_MakeAvailable(toml11)
add_executable(katja-cli main.cpp component.hpp component.cpp)
target_sources(katja-cli PUBLIC FILE_SET all_my_modules TYPE CXX_MODULES FILES page.cpp)
set(FTXUI_BUILD_MODULES ON)
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_link_libraries(katja-cli
LINK_PUBLIC katja
LINK_PRIVATE ftxui::screen
LINK_PRIVATE ftxui::dom
LINK_PRIVATE ftxui::component
LINK_PRIVATE toml11::toml11
PUBLIC katja
PRIVATE ftxui::screen
PRIVATE ftxui::dom
PRIVATE ftxui::component
PRIVATE toml11::toml11
)
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
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "component.hpp"
module;
#include <optional>
#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)
: title(title), packages(packages)
class PackageListBase : public ftxui::ComponentBase
{
}
std::string title;
const std::vector<package_identifier> packages;
std::optional<std::size_t> selected;
ftxui::Element PackageListBase::OnRender()
{
std::vector<ftxui::Element> lines;
for (const auto& package_identifier : this->packages)
public:
PackageListBase(const std::string& title, const std::vector<package_identifier>& packages = {})
: title(title), packages(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() << ')';
return ftxui::window(ftxui::text(summary.str()), ftxui::vbox(lines) | ftxui::yframe);
}
bool PackageListBase::OnEvent(ftxui::Event event)
{
if (event == ftxui::Event::ArrowDown)
bool OnEvent(ftxui::Event event) override
{
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);
}

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 "component.hpp"
#include <ftxui/component/component.hpp>
#include "katja/repository.hpp"
export module page;
import component;
export namespace katja
{
class PageBase : public ftxui::ComponentBase

View File

@@ -13,7 +13,7 @@ foreach(test_source ${KATJA_TEST_SOURCES})
add_executable(${tester} ${test_source})
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})
endforeach()