7 Commits

Author SHA1 Message Date
ArthurSonzogni
e185d6d475 Fix workflow. 2025-04-24 03:36:04 +02:00
ArthurSonzogni
f8d4880517 fix workflow. 2025-04-24 03:20:03 +02:00
ArthurSonzogni
38869c4aaa fix workflow. 2025-04-24 03:16:12 +02:00
ArthurSonzogni
4a75d49478 Fix workflow file. 2025-04-24 03:12:57 +02:00
ArthurSonzogni
c3d03dc716 Fix workflow issue. 2025-04-24 03:11:13 +02:00
ArthurSonzogni
053a1d8290 Setup bazel in workflow 2025-04-24 03:05:01 +02:00
ArthurSonzogni
45bf24f8ea Add workflow + examples + tests 2025-04-24 03:02:10 +02:00
14 changed files with 301 additions and 248 deletions

View File

@@ -1,3 +0,0 @@
build --cxxopt=-std=c++20
build --cxxopt=-Wall
build --cxxopt=-Werror

View File

@@ -55,6 +55,19 @@ jobs:
gcovr: "5.0" gcovr: "5.0"
opencppcoverage: true opencppcoverage: true
- name: "Install Bazel"
uses: bazel-contrib/setup-bazel@0.14.0
with:
bazelisk-cache: true
disk-cache: ${{ github.workflow }}
repository-cache: true
- name: "Build with Bazel"
run: bazel build ...
- name: "Tests with Bazel"
run: bazel run tests
# make sure coverage is only enabled for Debug builds, since it sets -O0 # make sure coverage is only enabled for Debug builds, since it sets -O0
# to make sure coverage has meaningful results # to make sure coverage has meaningful results
- name: "Configure CMake" - name: "Configure CMake"

5
.gitignore vendored
View File

@@ -20,7 +20,7 @@ out/
!flake.nix !flake.nix
!ftxui.pc.in !ftxui.pc.in
!iwyu.imp !iwyu.imp
!WORKSPACE !WORKSPACE.bazel
!BUILD.bazel !BUILD.bazel
!MODULE.bazel !MODULE.bazel
!.bazelrc !.bazelrc
@@ -33,6 +33,9 @@ out/
!cmake/**/*.in !cmake/**/*.in
!cmake/**/*.cmake !cmake/**/*.cmake
# bazel directory:
!bazel/**/*.bzl
# doc directory: # doc directory:
!doc/**/Doxyfile.in !doc/**/Doxyfile.in
!doc/**/*.txt !doc/**/*.txt

View File

@@ -1,13 +1,38 @@
load( # Copyright 2025 Arthur Sonzogni. All rights reserved.
"@rules_cc//cc:defs.bzl", # Use of this source code is governed by the MIT license that can be found in
"cc_library", # the LICENSE file.
"cc_test",
"cc_binary", # TODO:
) # - Windows/MSVC support.
# - Pass /utf-8 to MSVC users depending on FTXUI.
# - Pass "FTXUI_MICROSOFT_TERMINAL_FALLBACK" to windows users.
# - Support building benchmark.
# - Support building examples.
# - Support building fuzzer.
# - Support building documentation.
# - Enable the two tests timing out.
# - Support WebAssembly
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
load(":bazel/ftxui.bzl", "ftxui_cc_library", "generate_examples")
package(default_visibility = ["//visibility:public"]) package(default_visibility = ["//visibility:public"])
cc_library( # A meta target that depends on all the ftxui sub modules.
alias(
name = "ftxui",
# Note that :component depends on :dom, which depends on :screen. Bazel
# doesn't really support "public" and "private" dependencies. They are all
# public. This is equivalent to depending on all the submodules.
actual = ":component",
visibility = ["//visibility:public"],
)
# ftxui:screen is a module that provides a screen buffer and color management
# for terminal applications. A screen is a 2D array of cells, each cell can
# contain a glyph, a color, and other attributes. The library also provides
# functions to manipulate the screen.
ftxui_cc_library(
name = "screen", name = "screen",
srcs = [ srcs = [
"src/ftxui/screen/box.cpp", "src/ftxui/screen/box.cpp",
@@ -33,27 +58,14 @@ cc_library(
"include/ftxui/util/autoreset.hpp", "include/ftxui/util/autoreset.hpp",
"include/ftxui/util/ref.hpp", "include/ftxui/util/ref.hpp",
], ],
includes = ["include", "src"],
strip_include_prefix = "",
copts = ["-std=c++17"],
) )
cc_test( # ftxui:dom is a library that provides a way to create and manipulate a
name = "screen_test", # "document" that can be rendered to a screen. The document is a tree of nodes.
srcs = [ # Nodes can be text, layouts, or various decorators. Users needs to compose
"src/ftxui/screen/string_test.cpp", # nodes to create a document. A document is responsive to the size of the
"src/ftxui/screen/color_test.cpp", # screen.
], ftxui_cc_library(
deps = [
"//:screen",
"@googletest//:gtest_main",
],
includes = ["include", "src"],
copts = ["-std=c++20"],
testonly = True,
)
cc_library(
name = "dom", name = "dom",
srcs = [ srcs = [
"src/ftxui/dom/automerge.cpp", "src/ftxui/dom/automerge.cpp",
@@ -115,13 +127,86 @@ cc_library(
"include/ftxui/dom/table.hpp", "include/ftxui/dom/table.hpp",
"include/ftxui/dom/take_any_args.hpp", "include/ftxui/dom/take_any_args.hpp",
], ],
includes = ["include", "src"],
deps = [":screen"], deps = [":screen"],
) )
cc_test( # ftxui:component is a library to create "dynamic" component renderering and
name = "dom_test", # updating a ftxui::dom document on the screen. It is a higher level API than
# ftxui:dom.
#
# The module is required if your program needs to respond to user input. It
# defines a set of ftxui::Component. These components can be utilized to
# navigate using the arrow keys and/or cursor. There are several builtin widgets
# like checkbox/inputbox/etc to interact with. You can combine them, or even
# define your own custom components.
ftxui_cc_library(
name = "component",
srcs = [ srcs = [
"src/ftxui/component/animation.cpp",
"src/ftxui/component/button.cpp",
"src/ftxui/component/catch_event.cpp",
"src/ftxui/component/checkbox.cpp",
"src/ftxui/component/collapsible.cpp",
"src/ftxui/component/component.cpp",
"src/ftxui/component/component_options.cpp",
"src/ftxui/component/container.cpp",
"src/ftxui/component/dropdown.cpp",
"src/ftxui/component/event.cpp",
"src/ftxui/component/hoverable.cpp",
"src/ftxui/component/input.cpp",
"src/ftxui/component/loop.cpp",
"src/ftxui/component/maybe.cpp",
"src/ftxui/component/menu.cpp",
"src/ftxui/component/modal.cpp",
"src/ftxui/component/radiobox.cpp",
"src/ftxui/component/renderer.cpp",
"src/ftxui/component/resizable_split.cpp",
"src/ftxui/component/screen_interactive.cpp",
"src/ftxui/component/slider.cpp",
"src/ftxui/component/terminal_input_parser.cpp",
"src/ftxui/component/terminal_input_parser.hpp",
"src/ftxui/component/util.cpp",
"src/ftxui/component/window.cpp",
],
hdrs = [
"include/ftxui/component/animation.hpp",
"include/ftxui/component/captured_mouse.hpp",
"include/ftxui/component/component.hpp",
"include/ftxui/component/component_base.hpp",
"include/ftxui/component/component_options.hpp",
"include/ftxui/component/event.hpp",
"include/ftxui/component/loop.hpp",
"include/ftxui/component/mouse.hpp",
"include/ftxui/component/receiver.hpp",
"include/ftxui/component/screen_interactive.hpp",
"include/ftxui/component/task.hpp",
],
linkopts = ["-lpthread"],
deps = [":dom"],
)
# FTXUI's tests
cc_test(
name = "tests",
testonly = True,
srcs = [
"src/ftxui/component/animation_test.cpp",
"src/ftxui/component/button_test.cpp",
"src/ftxui/component/collapsible_test.cpp",
"src/ftxui/component/component_test.cpp",
"src/ftxui/component/container_test.cpp",
"src/ftxui/component/dropdown_test.cpp",
"src/ftxui/component/hoverable_test.cpp",
"src/ftxui/component/input_test.cpp",
"src/ftxui/component/menu_test.cpp",
"src/ftxui/component/modal_test.cpp",
"src/ftxui/component/radiobox_test.cpp",
"src/ftxui/component/receiver_test.cpp",
"src/ftxui/component/resizable_split_test.cpp",
"src/ftxui/component/slider_test.cpp",
"src/ftxui/component/terminal_input_parser_test.cpp",
"src/ftxui/component/terminal_input_parser_test_fuzzer.cpp",
"src/ftxui/component/toggle_test.cpp",
"src/ftxui/dom/blink_test.cpp", "src/ftxui/dom/blink_test.cpp",
"src/ftxui/dom/bold_test.cpp", "src/ftxui/dom/bold_test.cpp",
"src/ftxui/dom/border_test.cpp", "src/ftxui/dom/border_test.cpp",
@@ -144,115 +229,23 @@ cc_test(
"src/ftxui/dom/text_test.cpp", "src/ftxui/dom/text_test.cpp",
"src/ftxui/dom/underlined_test.cpp", "src/ftxui/dom/underlined_test.cpp",
"src/ftxui/dom/vbox_test.cpp", "src/ftxui/dom/vbox_test.cpp",
], "src/ftxui/screen/color_test.cpp",
deps = [ "src/ftxui/screen/string_test.cpp",
"//:dom", "src/ftxui/util/ref_test.cpp",
"@googletest//:gtest_main",
],
includes = ["include", "src"],
copts = ["-std=c++20"],
testonly = True,
)
#"src/ftxui/dom/benchmark_test.cpp", # TODO: Enable the two tests timing out with Bazel:
cc_library( # - "src/ftxui/component/screen_interactive_test.cpp",
name = "component", # - "src/ftxui/dom/selection_test.cpp",
srcs = [
"src/ftxui/component/maybe.cpp",
"src/ftxui/component/hoverable.cpp",
"src/ftxui/component/collapsible.cpp",
"src/ftxui/component/screen_interactive.cpp",
"src/ftxui/component/modal.cpp",
"src/ftxui/component/util.cpp",
"src/ftxui/component/animation.cpp",
"src/ftxui/component/button.cpp",
"src/ftxui/component/dropdown.cpp",
"src/ftxui/component/loop.cpp",
"src/ftxui/component/slider.cpp",
"src/ftxui/component/container.cpp",
"src/ftxui/component/renderer.cpp",
"src/ftxui/component/terminal_input_parser.cpp",
"src/ftxui/component/component_options.cpp",
"src/ftxui/component/resizable_split.cpp",
"src/ftxui/component/component.cpp",
"src/ftxui/component/event.cpp",
"src/ftxui/component/catch_event.cpp",
"src/ftxui/component/input.cpp",
"src/ftxui/component/menu.cpp",
"src/ftxui/component/window.cpp",
"src/ftxui/component/checkbox.cpp",
"src/ftxui/component/radiobox.cpp",
"src/ftxui/component/terminal_input_parser.hpp",
],
hdrs = [
"include/ftxui/component/animation.hpp",
"include/ftxui/component/captured_mouse.hpp",
"include/ftxui/component/component.hpp",
"include/ftxui/component/component_base.hpp",
"include/ftxui/component/component_options.hpp",
"include/ftxui/component/event.hpp",
"include/ftxui/component/loop.hpp",
"include/ftxui/component/mouse.hpp",
"include/ftxui/component/receiver.hpp",
"include/ftxui/component/screen_interactive.hpp",
"include/ftxui/component/task.hpp",
], ],
copts = ["-std=c++20"],
includes = [ includes = [
"include", "include",
"src", "src",
], ],
strip_include_prefix = "",
include_prefix = "",
deps = [":dom"],
linkopts = ["-lpthread"],
)
#"src/ftxui/component/component_fuzzer.cpp",
#"src/ftxui/component/terminal_input_parser_test_fuzzer.cpp",
#"src/ftxui/component/hoverable_test.cpp",
#"src/ftxui/component/collapsible_test.cpp",
#"src/ftxui/component/toggle_test.cpp",
#"src/ftxui/component/screen_interactive_test.cpp",
#"src/ftxui/component/modal_test.cpp",
#"src/ftxui/component/animation_test.cpp",
#"src/ftxui/component/★ selection_test.cpp",
#"src/ftxui/component/button_test.cpp",
#"src/ftxui/component/dropdown_test.cpp",
#"src/ftxui/component/slider_test.cpp",
#"src/ftxui/component/container_test.cpp",
#"src/ftxui/component/terminal_input_parser_test.cpp",
#"src/ftxui/component/receiver_test.cpp",
#"src/ftxui/component/resizable_split_test.cpp",
#"src/ftxui/component/component_test.cpp",
#"src/ftxui/component/input_test.cpp",
#"src/ftxui/component/menu_test.cpp",
#"src/ftxui/component/radiobox_test.cpp",
cc_test(
name = "component_test",
srcs = [
"src/ftxui/component/animation_test.cpp",
"src/ftxui/component/button_test.cpp",
"src/ftxui/component/collapsible_test.cpp",
"src/ftxui/component/component_test.cpp",
"src/ftxui/component/container_test.cpp",
"src/ftxui/component/dropdown_test.cpp",
"src/ftxui/component/hoverable_test.cpp",
"src/ftxui/component/input_test.cpp",
"src/ftxui/component/menu_test.cpp",
"src/ftxui/component/modal_test.cpp",
"src/ftxui/component/radiobox_test.cpp",
"src/ftxui/component/resizable_split_test.cpp",
"src/ftxui/component/screen_interactive_test.cpp",
"src/ftxui/component/selection_test.cpp",
"src/ftxui/component/slider_test.cpp",
"src/ftxui/component/toggle_test.cpp",
],
deps = [ deps = [
"//:component", "//:ftxui",
"@googletest//:gtest_main", "@googletest//:gtest_main",
], ],
includes = ["include", "src"], )
copts = ["-std=c++20"],
testonly = True, generate_examples()
)

View File

@@ -1,18 +1,20 @@
# Module. # FTXUI Module.
module( module(
name = "ftxui", name = "ftxui",
version = "6.0.2", version = "6.0.3",
) )
# Build deps. # Build deps.
bazel_dep(name = "rules_cc", version = "0.0.17") bazel_dep(name = "rules_cc", version = "0.0.17")
bazel_dep(name = "platforms", version = "0.0.10")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
# Test deps. # Test deps.
bazel_dep(name = "googletest", version = "1.15.2") bazel_dep(name = "googletest", version = "1.15.2")
# Toolchain deps. # Toolchain deps.
cc_configure = use_extension( #cc_configure = use_extension(
"@rules_cc//bzlmod:extensions.bzl", #"@rules_cc//bzlmod:extensions.bzl",
"cc_configure", #"cc_configure",
) #)
use_repo(cc_configure, "local_config_cc_toolchains") #use_repo(cc_configure, "local_config_cc_toolchains")

44
bazel/ftxui.bzl Normal file
View File

@@ -0,0 +1,44 @@
# ftxui_common.bzl
load("@rules_cc//cc:defs.bzl", "cc_library")
def ftxui_cc_library(
name,
srcs,
hdrs,
linkopts = [],
deps = []):
cc_library(
name = name,
srcs = srcs,
hdrs = hdrs,
linkopts = linkopts,
deps = deps,
strip_include_prefix = "",
include_prefix = "",
includes = [
"include",
"src",
],
copts = ["-std=c++17"],
visibility = ["//visibility:public"],
)
def generate_examples():
cpp_files = native.glob(["examples/**/*.cpp"])
for src in cpp_files:
# Skip failing examples due to the color_info_sorted_2d.ipp dependency.
if src == "examples/component/homescreen.cpp" or \
src == "examples/dom/color_info_palette256.cpp" or \
src == "examples/dom/color_gallery.cpp":
continue
# Turn "examples/component/button.cpp" → "example_component_button"
name = src.replace("/", "_").replace(".cpp", "")
native.cc_binary(
name = name,
srcs = [src],
deps = ["//:component"],
)

View File

@@ -19,10 +19,10 @@ add_executable(ftxui-tests
src/ftxui/component/menu_test.cpp src/ftxui/component/menu_test.cpp
src/ftxui/component/modal_test.cpp src/ftxui/component/modal_test.cpp
src/ftxui/component/radiobox_test.cpp src/ftxui/component/radiobox_test.cpp
src/ftxui/util/ref_test.cpp
src/ftxui/component/receiver_test.cpp src/ftxui/component/receiver_test.cpp
src/ftxui/component/resizable_split_test.cpp src/ftxui/component/resizable_split_test.cpp
src/ftxui/component/screen_interactive_test.cpp src/ftxui/component/screen_interactive_test.cpp
src/ftxui/component/selection_test.cpp
src/ftxui/component/slider_test.cpp src/ftxui/component/slider_test.cpp
src/ftxui/component/terminal_input_parser_test.cpp src/ftxui/component/terminal_input_parser_test.cpp
src/ftxui/component/toggle_test.cpp src/ftxui/component/toggle_test.cpp
@@ -42,7 +42,7 @@ add_executable(ftxui-tests
src/ftxui/dom/italic_test.cpp src/ftxui/dom/italic_test.cpp
src/ftxui/dom/linear_gradient_test.cpp src/ftxui/dom/linear_gradient_test.cpp
src/ftxui/dom/scroll_indicator_test.cpp src/ftxui/dom/scroll_indicator_test.cpp
src/ftxui/util/ref_test.cpp src/ftxui/dom/selection_test.cpp
src/ftxui/dom/separator_test.cpp src/ftxui/dom/separator_test.cpp
src/ftxui/dom/spinner_test.cpp src/ftxui/dom/spinner_test.cpp
src/ftxui/dom/table_test.cpp src/ftxui/dom/table_test.cpp

View File

@@ -19,7 +19,7 @@ using namespace ftxui;
int main() { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
std::array<int, 30> values; std::array<int, 30> values;
for (int i = 0; i < values.size(); ++i) { for (size_t i = 0; i < values.size(); ++i) {
values[i] = 50 + 20 * std::sin(i * 0.3); values[i] = 50 + 20 * std::sin(i * 0.3);
} }

View File

@@ -12,7 +12,6 @@
int main() { int main() {
using namespace ftxui; using namespace ftxui;
int saturation = 255;
Elements red_line; Elements red_line;
Elements green_line; Elements green_line;
Elements blue_line; Elements blue_line;

View File

@@ -10,6 +10,7 @@
#include <memory> // for shared_ptr #include <memory> // for shared_ptr
#include <string> // for operator<<, string #include <string> // for operator<<, string
#include <thread> // for sleep_for #include <thread> // for sleep_for
#include <utility> // for ignore
#include <vector> // for vector #include <vector> // for vector
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
@@ -49,6 +50,7 @@ int main() {
std::string reset_position; std::string reset_position;
for (int i = 0;; ++i) { for (int i = 0;; ++i) {
std::ignore = i;
auto document = hbox({ auto document = hbox({
vbox({ vbox({
graph(std::ref(my_graph)), graph(std::ref(my_graph)),

View File

@@ -42,8 +42,8 @@ class ComponentBase {
// Component hierarchy: // Component hierarchy:
ComponentBase* Parent() const; ComponentBase* Parent() const;
Component& ChildAt(int i); Component& ChildAt(size_t i);
int ChildCount() const; size_t ChildCount() const;
int Index() const; int Index() const;
void Add(Component children); void Add(Component children);
void Detach(); void Detach();

View File

@@ -266,7 +266,7 @@ TEST(MenuTest, MenuEntryIndex) {
menu->OnEvent(Event::ArrowDown); menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::ArrowDown); menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::Return); menu->OnEvent(Event::Return);
for (int index = 0; index < menu->ChildCount(); index++) { for (size_t index = 0; index < menu->ChildCount(); index++) {
EXPECT_EQ(menu->ChildAt(index)->Index(), index); EXPECT_EQ(menu->ChildAt(index)->Index(), index);
} }
} }