diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 00000000..b1fd142d --- /dev/null +++ b/.bazelrc @@ -0,0 +1,3 @@ +build --cxxopt=-std=c++20 +build --cxxopt=-Wall +build --cxxopt=-Werror diff --git a/.gitignore b/.gitignore index 4d12e758..f3477250 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,10 @@ out/ !flake.nix !ftxui.pc.in !iwyu.imp +!WORKSPACE +!BUILD.bazel +!MODULE.bazel +!.bazelrc # .github directory: !.github/**/*.yaml diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 00000000..a4978a3d --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,258 @@ +load( + "@rules_cc//cc:defs.bzl", + "cc_library", + "cc_test", + "cc_binary", +) + +package(default_visibility = ["//visibility:public"]) + +cc_library( + name = "screen", + srcs = [ + "src/ftxui/screen/box.cpp", + "src/ftxui/screen/color.cpp", + "src/ftxui/screen/color_info.cpp", + "src/ftxui/screen/image.cpp", + "src/ftxui/screen/screen.cpp", + "src/ftxui/screen/string.cpp", + "src/ftxui/screen/string_internal.hpp", + "src/ftxui/screen/terminal.cpp", + "src/ftxui/screen/util.hpp", + ], + hdrs = [ + "include/ftxui/screen/box.hpp", + "include/ftxui/screen/color.hpp", + "include/ftxui/screen/color_info.hpp", + "include/ftxui/screen/deprecated.hpp", + "include/ftxui/screen/image.hpp", + "include/ftxui/screen/pixel.hpp", + "include/ftxui/screen/screen.hpp", + "include/ftxui/screen/string.hpp", + "include/ftxui/screen/terminal.hpp", + "include/ftxui/util/autoreset.hpp", + "include/ftxui/util/ref.hpp", + ], + includes = ["include", "src"], + strip_include_prefix = "", + copts = ["-std=c++17"], +) + +cc_test( + name = "screen_test", + srcs = [ + "src/ftxui/screen/string_test.cpp", + "src/ftxui/screen/color_test.cpp", + ], + deps = [ + "//:screen", + "@googletest//:gtest_main", + ], + includes = ["include", "src"], + copts = ["-std=c++20"], + testonly = True, +) + +cc_library( + name = "dom", + srcs = [ + "src/ftxui/dom/automerge.cpp", + "src/ftxui/dom/blink.cpp", + "src/ftxui/dom/bold.cpp", + "src/ftxui/dom/border.cpp", + "src/ftxui/dom/box_helper.cpp", + "src/ftxui/dom/box_helper.hpp", + "src/ftxui/dom/canvas.cpp", + "src/ftxui/dom/clear_under.cpp", + "src/ftxui/dom/color.cpp", + "src/ftxui/dom/composite_decorator.cpp", + "src/ftxui/dom/dbox.cpp", + "src/ftxui/dom/dim.cpp", + "src/ftxui/dom/flex.cpp", + "src/ftxui/dom/flexbox.cpp", + "src/ftxui/dom/flexbox_config.cpp", + "src/ftxui/dom/flexbox_helper.cpp", + "src/ftxui/dom/flexbox_helper.hpp", + "src/ftxui/dom/focus.cpp", + "src/ftxui/dom/frame.cpp", + "src/ftxui/dom/gauge.cpp", + "src/ftxui/dom/graph.cpp", + "src/ftxui/dom/gridbox.cpp", + "src/ftxui/dom/hbox.cpp", + "src/ftxui/dom/hyperlink.cpp", + "src/ftxui/dom/inverted.cpp", + "src/ftxui/dom/italic.cpp", + "src/ftxui/dom/linear_gradient.cpp", + "src/ftxui/dom/node.cpp", + "src/ftxui/dom/node_decorator.cpp", + "src/ftxui/dom/node_decorator.hpp", + "src/ftxui/dom/paragraph.cpp", + "src/ftxui/dom/reflect.cpp", + "src/ftxui/dom/scroll_indicator.cpp", + "src/ftxui/dom/selection.cpp", + "src/ftxui/dom/selection_style.cpp", + "src/ftxui/dom/separator.cpp", + "src/ftxui/dom/size.cpp", + "src/ftxui/dom/spinner.cpp", + "src/ftxui/dom/strikethrough.cpp", + "src/ftxui/dom/table.cpp", + "src/ftxui/dom/text.cpp", + "src/ftxui/dom/underlined.cpp", + "src/ftxui/dom/underlined_double.cpp", + "src/ftxui/dom/util.cpp", + "src/ftxui/dom/vbox.cpp", + ], + hdrs = [ + "include/ftxui/dom/canvas.hpp", + "include/ftxui/dom/deprecated.hpp", + "include/ftxui/dom/direction.hpp", + "include/ftxui/dom/elements.hpp", + "include/ftxui/dom/flexbox_config.hpp", + "include/ftxui/dom/linear_gradient.hpp", + "include/ftxui/dom/node.hpp", + "include/ftxui/dom/requirement.hpp", + "include/ftxui/dom/selection.hpp", + "include/ftxui/dom/table.hpp", + "include/ftxui/dom/take_any_args.hpp", + ], + includes = ["include", "src"], + deps = [":screen"], +) + +cc_test( + name = "dom_test", + srcs = [ + "src/ftxui/dom/blink_test.cpp", + "src/ftxui/dom/bold_test.cpp", + "src/ftxui/dom/border_test.cpp", + "src/ftxui/dom/canvas_test.cpp", + "src/ftxui/dom/color_test.cpp", + "src/ftxui/dom/dbox_test.cpp", + "src/ftxui/dom/dim_test.cpp", + "src/ftxui/dom/flexbox_helper_test.cpp", + "src/ftxui/dom/flexbox_test.cpp", + "src/ftxui/dom/gauge_test.cpp", + "src/ftxui/dom/gridbox_test.cpp", + "src/ftxui/dom/hbox_test.cpp", + "src/ftxui/dom/hyperlink_test.cpp", + "src/ftxui/dom/italic_test.cpp", + "src/ftxui/dom/linear_gradient_test.cpp", + "src/ftxui/dom/scroll_indicator_test.cpp", + "src/ftxui/dom/separator_test.cpp", + "src/ftxui/dom/spinner_test.cpp", + "src/ftxui/dom/table_test.cpp", + "src/ftxui/dom/text_test.cpp", + "src/ftxui/dom/underlined_test.cpp", + "src/ftxui/dom/vbox_test.cpp", + ], + deps = [ + "//:dom", + "@googletest//:gtest_main", + ], + includes = ["include", "src"], + copts = ["-std=c++20"], + testonly = True, +) + +#"src/ftxui/dom/benchmark_test.cpp", +cc_library( + name = "component", + 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", + ], + includes = [ + "include", + "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 = [ + "//:component", + "@googletest//:gtest_main", + ], + includes = ["include", "src"], + copts = ["-std=c++20"], + testonly = True, + ) diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000..8284154f --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,18 @@ +# Module. +module( + name = "ftxui", + version = "6.0.2", +) + +# Build deps. +bazel_dep(name = "rules_cc", version = "0.0.17") + +# Test deps. +bazel_dep(name = "googletest", version = "1.15.2") + +# Toolchain deps. +cc_configure = use_extension( + "@rules_cc//bzlmod:extensions.bzl", + "cc_configure", +) +use_repo(cc_configure, "local_config_cc_toolchains") diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 00000000..945e96dd --- /dev/null +++ b/WORKSPACE @@ -0,0 +1 @@ +workspace(name = "ftxui") diff --git a/cmake/ftxui_test.cmake b/cmake/ftxui_test.cmake index 665b7444..652e7055 100644 --- a/cmake/ftxui_test.cmake +++ b/cmake/ftxui_test.cmake @@ -19,10 +19,10 @@ add_executable(ftxui-tests src/ftxui/component/menu_test.cpp src/ftxui/component/modal_test.cpp src/ftxui/component/radiobox_test.cpp - src/ftxui/util/ref_test.cpp src/ftxui/component/receiver_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/terminal_input_parser_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/linear_gradient_test.cpp src/ftxui/dom/scroll_indicator_test.cpp - src/ftxui/dom/selection_test.cpp + src/ftxui/util/ref_test.cpp src/ftxui/dom/separator_test.cpp src/ftxui/dom/spinner_test.cpp src/ftxui/dom/table_test.cpp diff --git a/include/ftxui/component/component_base.hpp b/include/ftxui/component/component_base.hpp index fcc67e16..e0fd527e 100644 --- a/include/ftxui/component/component_base.hpp +++ b/include/ftxui/component/component_base.hpp @@ -42,8 +42,8 @@ class ComponentBase { // Component hierarchy: ComponentBase* Parent() const; - Component& ChildAt(size_t i); - size_t ChildCount() const; + Component& ChildAt(int i); + int ChildCount() const; int Index() const; void Add(Component children); void Detach(); diff --git a/src/ftxui/dom/selection_test.cpp b/src/ftxui/component/selection_test.cpp similarity index 99% rename from src/ftxui/dom/selection_test.cpp rename to src/ftxui/component/selection_test.cpp index 7c48e28e..8f29c177 100644 --- a/src/ftxui/dom/selection_test.cpp +++ b/src/ftxui/component/selection_test.cpp @@ -127,8 +127,6 @@ TEST(SelectionTest, SelectionOnChangeSquashedEvents) { } TEST(SelectionTest, StyleSelection) { - int selectionChangeCounter = 0; - auto element = hbox({ text("Lorem "), text("ipsum") | selectionColor(Color::Red),