34 Commits

Author SHA1 Message Date
Miko
4b8c8ea00d Merge branch 'ArthurSonzogni:main' into main 2025-05-11 17:12:31 -04:00
Arthur Sonzogni
08b8a3b28f Add documentation about Bazel (#1045)
Some checks failed
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
2025-05-11 08:00:11 +02:00
Miko
9e1120c146 Merge branch 'main' into main 2025-05-10 22:01:04 -04:00
ArthurSonzogni
5cfed50702 v6.1.9
Some checks failed
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
2025-05-07 22:43:27 +02:00
Arthur Sonzogni
b307a175ed Bazel: general improvements. (#1043)
* Bazel: general improvements.

Improve the Bazel build. Attempt to fix previous errors recorded while
trying to publish ftxui in the Bazel Central Registry:
- https://github.com/bazelbuild/bazel-central-registry/pull/4485
- https://buildkite.com/bazel/bcr-presubmit/builds/13601#01968b61-f5b2-4d16-94d0-c87a03a1a23b

Test against "recent" platforms
-------------------------------

Previously, I got the error:
```
gcc: error: unrecognized command line option '-std-c++20'; did you mean '-std-c++2a'?
```
This was due to using old distribution like ubuntu 2004. Test against
newer platforms only to avoid GCC version<-9.x.y

Downgrade gtest version.
------------------------

I suspect this caused the Bazel Central Registry error:
```
file:///workdir/modules/googletest/1.15.2/MODULE.bazel:68:20: name 'use_repo_rule' is not defined
```
Specifying using bazelmod fixes the issue. Thanks @robinlinden

Tag gtest as dev_dependency
---------------------------

Presumably, this should avoid dependants to fetch it?

Enable --features-layering_check
--------------------------------

Aka clang `-Wprivate-header`. Fix the encountered errors.

Use clang in the CI
-------------------

The CI was defining clang/gcc in the matrix, but was not using it. Fix
the bug.
2025-05-07 22:41:17 +02:00
Jacob Shing
4604adb502 Adds example project using FTXUI (#1044)
Some checks failed
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
2025-05-05 17:44:13 +02:00
Miko
006ec1cbed Merge branch 'ArthurSonzogni:main' into main 2025-05-04 19:27:15 -04:00
ArthurSonzogni
add5f40d31 Restore dbox behavior from ftxui5.0.0
Some checks failed
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
Bug:https://github.com/eclipse-ecal/ecal/pull/2095
2025-05-02 16:48:00 +02:00
Miko
16c25ae441 Merge branch 'main' into main 2025-05-01 17:09:57 -04:00
ArthurSonzogni
805db9bdea Set Bazel compatibility level
Some checks failed
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
2025-05-01 11:53:18 +02:00
ArthurSonzogni
784f53fd7e Remove attestion for Bazel 2025-05-01 11:30:12 +02:00
ArthurSonzogni
799d8a267e Fix release workflow 2025-05-01 10:52:54 +02:00
ArthurSonzogni
f4513702b0 Fix release workflow 2025-05-01 10:40:53 +02:00
Miko
05b4bffe3b Merge branch 'main' into main 2025-04-30 14:39:52 -04:00
Toyosatomimi no Miko
ffc6dcd3bf Add ftxui module for all submodules 2025-04-19 09:54:02 -04:00
ArthurSonzogni
f6dceabdc9 tweaks 2025-04-11 15:07:58 +02:00
ArthurSonzogni
cb8ebdeb44 fix workflows 3 2025-04-11 02:03:18 +02:00
ArthurSonzogni
dd37fba100 Fix workflow 2 2025-04-11 01:48:07 +02:00
ArthurSonzogni
4d627c1ffb Fix workflow. 2025-04-11 01:43:23 +02:00
ArthurSonzogni
1dff6a5c35 Compile examples with modules. 2025-04-11 01:39:07 +02:00
ArthurSonzogni
0c67566427 Update 2025-04-10 14:45:45 +02:00
ArthurSonzogni
85c3dc45ca Add Changelog and remove flag. 2025-04-09 12:35:46 +02:00
Miko
84f691e9d3 Merge branch 'ArthurSonzogni:main' into main 2025-04-08 11:45:52 -04:00
Miko
2e36aa061a Merge branch 'ArthurSonzogni:main' into main 2025-03-29 22:17:54 -04:00
Miko
8ed06a4812 Merge branch 'ArthurSonzogni:main' into main 2025-03-29 12:26:56 -04:00
Toyosatomimi no Miko
571f6dcdcf Trailing newline 2025-03-29 12:26:07 -04:00
Toyosatomimi no Miko
e57c275512 Make modules opt-in (for pre-C++20 builds not to break) 2025-03-28 08:28:05 -04:00
Miko
1c37cdd192 Merge branch 'ArthurSonzogni:main' into main 2025-03-28 08:22:58 -04:00
Miko
772d4ebeed Merge branch 'ArthurSonzogni:main' into main 2025-03-27 23:56:08 -04:00
Miko
5f5bc9019d Delete modules/CMakeLists.txt
No longer needed
2025-03-28 03:54:48 +00:00
Miko
f87b6a4d12 Update CMakeLists.txt
Directly go to `modules/ftxui`
2025-03-28 03:54:25 +00:00
Toyosatomimi no Miko
0d50fa25fe I assume the version produced by CMake was supposed to be bumped up to 6.0.0, fixing this 2025-03-25 19:09:35 -04:00
Toyosatomimi no Miko
730ebeed1d Add my own project (using FTXUI modules) for an example 2025-03-25 18:59:58 -04:00
Toyosatomimi no Miko
69928b374e Add modules support 2025-03-25 18:49:18 -04:00
56 changed files with 1586 additions and 226 deletions

7
.bazelrc Normal file
View File

@@ -0,0 +1,7 @@
build --features=layering_check
build --enable_bzlmod
build --enable_platform_specific_config
build:linux --cxxopt=-std=c++20
build:macos --cxxopt=-std=c++20
build:windows --cxxopt=-std:c++20

View File

@@ -1,24 +1,36 @@
# Copyright 2025 Arthur Sonzogni. All rights reserved.
# Use of this source code is governed by the MIT license that can be found in
# the LICENSE file.
matrix: matrix:
platform: bazel:
- centos7 - 7.x
- debian10 - 8.x
- ubuntu2004 - rolling
- macos unix_platform:
- windows - debian11
bazel: [6.x, 7.x, 8.x] - ubuntu2204
- macos
- macos_arm64
win_platform:
- windows
tasks: tasks:
verify_targets:
name: Build and test. unix_test:
platform: ${{ platform }} name: Verify build targets on Unix
platform: ${{ unix_platform }}
bazel: ${{ bazel }} bazel: ${{ bazel }}
build_flags:
- --cxxopt=-std=c++20
build_targets: build_targets:
- '@ftxui//:ftxui'
- '@ftxui//:screen'
- '@ftxui//:dom' - '@ftxui//:dom'
- '@ftxui//:component' - '@ftxui//:component'
test_targets: - '@ftxui//:screen'
- '@ftxui//:tests'
windows_test:
name: Verify build targets
platform: ${{ win_platform }}
bazel: ${{ bazel }}
build_flags:
- --cxxopt=/std:c++20
build_targets:
- '@ftxui//:dom'
- '@ftxui//:component'
- '@ftxui//:screen'

View File

@@ -14,25 +14,30 @@ on:
jobs: jobs:
test_bazel: test_bazel:
name: "Bazel, ${{ matrix.compiler }}, ${{ matrix.os }}" name: "Bazel, ${{ matrix.cxx }}, ${{ matrix.os }}"
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- os: ubuntu-latest - os: ubuntu-latest
compiler: gcc cxx: g++
cc: gcc
- os: ubuntu-latest - os: ubuntu-latest
compiler: llvm cxx: clang++
cc: clang
- os: macos-latest - os: macos-latest
compiler: llvm cxx: g++
cc: gcc
- os: macos-latest - os: macos-latest
compiler: gcc cxx: clang++
cc: clang
- os: windows-latest - os: windows-latest
compiler: cl cxx: cl
cc: cl
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
@@ -40,10 +45,16 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: "Build with Bazel" - name: "Build with Bazel"
env:
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cxx }}
run: bazel build ... run: bazel build ...
- name: "Tests with Bazel" - name: "Tests with Bazel"
run: bazel run tests env:
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cxx }}
run: bazel test --test_output=all ...
test_cmake: test_cmake:
name: "CMake, ${{ matrix.compiler }}, ${{ matrix.os }}" name: "CMake, ${{ matrix.compiler }}, ${{ matrix.os }}"
@@ -154,3 +165,188 @@ jobs:
flags: ${{ runner.os }} flags: ${{ runner.os }}
name: ${{ runner.os }}-coverage name: ${{ runner.os }}-coverage
files: ./build/coverage.xml files: ./build/coverage.xml
test_modules:
name: "Test modules"
strategy:
matrix:
include:
- os: ubuntu-latest
compiler: llvm
# TODO add gcc / msvc
runs-on: ${{ matrix.os }}
steps:
- name: "Checkout repository"
uses: actions/checkout@v3
- name: "Setup Cpp"
uses: aminya/setup-cpp@v1
with:
compiler: ${{ matrix.compiler }}
vcvarsall: ${{ contains(matrix.os, 'windows' )}}
cmake: true
ninja: true
clangtidy: false
cppcheck: false
opencppcoverage: false
- name: "Generate ./examples_modules"
run: >
./tools/generate_examples_modules.sh
- name: "Build modules"
run: >
mkdir build;
cd build;
cmake ..
-DCMAKE_GENERATOR=Ninja
-DFTXUI_BUILD_MODULES=ON
-DFTXUI_BUILD_EXAMPLES=ON
-DCMAKE_BUILD_TYPE=Debug
-DFTXUI_BUILD_DOCS=OFF
-DFTXUI_BUILD_TESTS=OFF
-DFTXUI_BUILD_TESTS_FUZZER=OFF
-DFTXUI_ENABLE_INSTALL=ON
-DFTXUI_DEV_WARNINGS=ON ;
cmake --build .
# Create a release on new v* tags
release:
needs:
- test_cmake
- test_bazel
if: ${{ github.event_name == 'create' && startsWith(github.ref, 'refs/tags/v') }}
name: "Create release"
runs-on: ubuntu-latest
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: "Create release"
uses: softprops/action-gh-release@v1
id: create_release
with:
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Build artifact for the release
package_compiled:
name: "Build packages"
needs: release
strategy:
matrix:
include:
- os: ubuntu-latest
asset_path: build/ftxui*Linux*
- os: macos-latest
asset_path: build/ftxui*Darwin*
- os: windows-latest
asset_path: build/ftxui*Win64*
runs-on: ${{ matrix.os }}
steps:
- name: Get number of CPU cores
uses: SimenB/github-actions-cpu-cores@v1
id: cpu-cores
- name: "Checkout repository"
uses: actions/checkout@v3
- name: "Install cmake"
uses: lukka/get-cmake@latest
- name: "Build packages"
run: >
mkdir build;
cd build;
cmake ..
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_BUILD_PARALLEL_LEVEL=${{ steps.cpu-cores.outputs.count }}
-DFTXUI_BUILD_DOCS=OFF
-DFTXUI_BUILD_EXAMPLES=OFF
-DFTXUI_BUILD_TESTS=OFF
-DFTXUI_BUILD_TESTS_FUZZER=OFF
-DFTXUI_ENABLE_INSTALL=ON
-DFTXUI_DEV_WARNINGS=ON ;
cmake --build . --target package;
- uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.release.outputs.upload_url }}
asset_path: ${{ matrix.asset_path }}
overwrite: true
# Build "source" artifact for the release. This is the same as the github
# "source" archive, but with a stable URL. This is useful for the Bazel
# Central Repository.
package_source:
name: "Build source package"
needs: release
runs-on: ubuntu-latest
steps:
- name: "Checkout repository"
uses: actions/checkout@v3
- name: "Create source package"
run: >
git archive --format=tar.gz -o source.tar.gz HEAD
- name: "Upload source package"
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.release.outputs.upload_url }}
asset_path: source.tar.gz
overwrite: true
documentation:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: "Checkout repository"
uses: actions/checkout@v3
- name: "Install cmake"
uses: lukka/get-cmake@latest
- name: "Install emsdk"
uses: mymindstorm/setup-emsdk@v7
- name: "Install Doxygen/Graphviz"
run: >
sudo apt-get update;
sudo apt-get install doxygen graphviz;
- name: "Build documentation"
run: >
mkdir build;
cd build;
emcmake cmake ..
-DCMAKE_BUILD_TYPE=Release
-DFTXUI_BUILD_DOCS=ON
-DFTXUI_BUILD_EXAMPLES=ON
-DFTXUI_BUILD_TESTS=OFF
-DFTXUI_BUILD_TESTS_FUZZER=OFF
-DFTXUI_ENABLE_INSTALL=OFF
-DFTXUI_DEV_WARNINGS=ON ;
cmake --build . --target doc;
cmake --build . ;
rsync -amv
--include='*/'
--include='*.html'
--include='*.css'
--include='*.mjs'
--include='*.js'
--include='*.wasm'
--exclude='*'
examples
doc/doxygen/html;
- name: "Deploy"
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: build/doc/doxygen/html/
enable_jekyll: false
allow_empty_commit: false
force_orphan: true
publish_branch: gh-pages

View File

@@ -9,33 +9,16 @@ on:
required: true required: true
type: string type: string
# Fire as soon as the Release workflow completes
workflow_run:
workflows:
- Release
types:
- completed
permissions: permissions:
attestations: write
contents: write contents: write
id-token: write
jobs: jobs:
publish: publish:
uses: bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml@v0.0.4 uses: bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml@v0.0.4
# Only run on manual dispatch, or when Release finishes successfully
if: |
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
with: with:
# If manual: use the input, otherwise grab the tag from the completed run tag_name: ${{ github.event.inputs.tag_name }}
tag_name: ${{
github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name ||
github.event_name == 'workflow_run' && github.event.workflow_run.head_branch
}}
registry_fork: ArthurSonzogni/bazel-central-registry registry_fork: ArthurSonzogni/bazel-central-registry
attest: false
secrets: secrets:
publish_token: ${{ secrets.PUBLISH_TOKEN }} publish_token: ${{ secrets.PUBLISH_TOKEN }}

View File

@@ -92,27 +92,9 @@ jobs:
run: > run: >
git archive --format=tar.gz -o source.tar.gz HEAD git archive --format=tar.gz -o source.tar.gz HEAD
- name: Generate source attestation
id: attest_source
uses: actions/attest-build-provenance@v2
with:
subject-path: source.tar.gz
- name: Write source.intoto.jsonl
run:
jq --compact-output < "${{ steps.attest_source.outputs.bundle-path }}" \
> source.tar.gz.intoto.jsonl
- name: "Upload source package" - name: "Upload source package"
uses: shogo82148/actions-upload-release-asset@v1 uses: shogo82148/actions-upload-release-asset@v1
with: with:
upload_url: ${{ needs.release.outputs.upload_url }} upload_url: ${{ needs.release.outputs.upload_url }}
asset_path: source.tar.gz asset_path: source.tar.gz
overwrite: true overwrite: true
- name: "Upload source attestation"
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.release.outputs.upload_url }}
asset_path: source.tar.gz.intoto.jsonl
overwrite: true

2
.gitignore vendored
View File

@@ -62,8 +62,10 @@ out/
!include/ftxui/**/*.cpp !include/ftxui/**/*.cpp
# src directory: # src directory:
!src/ftxui/*.cppm
!src/ftxui/**/*.hpp !src/ftxui/**/*.hpp
!src/ftxui/**/*.cpp !src/ftxui/**/*.cpp
!src/ftxui/**/*.cppm
# tools directory: # tools directory:
!tools/**/*.sh !tools/**/*.sh

View File

@@ -12,23 +12,19 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
load(":bazel/ftxui.bzl", "ftxui_cc_library") load(":bazel/ftxui.bzl", "ftxui_cc_library")
load(":bazel/ftxui.bzl", "generate_examples") load(":bazel/ftxui.bzl", "generate_examples")
load(":bazel/ftxui.bzl", "cpp20")
load(":bazel/ftxui.bzl", "windows_copts") load(":bazel/ftxui.bzl", "windows_copts")
load(":bazel/ftxui.bzl", "pthread_linkopts") load(":bazel/ftxui.bzl", "pthread_linkopts")
package(default_visibility = ["//visibility:public"]) # A meta target depending on all of the ftxui submodules.
# Note that component depends on dom and screen, so ftxui is just an alias for
# component.
# ┌component──┐
# │┌dom──────┐│
# ││┌screen─┐││
# └┴┴───────┴┴┘
alias(name = "ftxui", actual = ":component")
# A meta target that depends on all the ftxui sub modules. # @ftxui:screen is a module that provides a screen buffer and color management
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 # 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 # contain a glyph, a color, and other attributes. The library also provides
# functions to manipulate the screen. # functions to manipulate the screen.
@@ -60,7 +56,7 @@ ftxui_cc_library(
], ],
) )
# ftxui:dom is a library that provides a way to create and manipulate a # @ftxui:dom is a library that provides a way to create and manipulate a
# "document" that can be rendered to a screen. The document is a tree of nodes. # "document" that can be rendered to a screen. The document is a tree of nodes.
# Nodes can be text, layouts, or various decorators. Users needs to compose # Nodes can be text, layouts, or various decorators. Users needs to compose
# nodes to create a document. A document is responsive to the size of the # nodes to create a document. A document is responsive to the size of the
@@ -130,7 +126,7 @@ ftxui_cc_library(
deps = [":screen"], deps = [":screen"],
) )
# ftxui:component is a library to create "dynamic" component renderering and # @ftxui:component is a library to create "dynamic" component renderering and
# updating a ftxui::dom document on the screen. It is a higher level API than # updating a ftxui::dom document on the screen. It is a higher level API than
# ftxui:dom. # ftxui:dom.
# #
@@ -167,6 +163,13 @@ ftxui_cc_library(
"src/ftxui/component/terminal_input_parser.hpp", "src/ftxui/component/terminal_input_parser.hpp",
"src/ftxui/component/util.cpp", "src/ftxui/component/util.cpp",
"src/ftxui/component/window.cpp", "src/ftxui/component/window.cpp",
# Private header from ftxui:dom.
"src/ftxui/dom/node_decorator.hpp",
# Private header from ftxui:screen.
"src/ftxui/screen/string_internal.hpp",
"src/ftxui/screen/util.hpp",
], ],
hdrs = [ hdrs = [
"include/ftxui/component/animation.hpp", "include/ftxui/component/animation.hpp",
@@ -182,7 +185,10 @@ ftxui_cc_library(
"include/ftxui/component/task.hpp", "include/ftxui/component/task.hpp",
], ],
linkopts = pthread_linkopts(), linkopts = pthread_linkopts(),
deps = [":dom"], deps = [
":dom",
":screen",
],
) )
# FTXUI's tests # FTXUI's tests
@@ -205,7 +211,6 @@ cc_test(
"src/ftxui/component/resizable_split_test.cpp", "src/ftxui/component/resizable_split_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/terminal_input_parser_test_fuzzer.cpp",
"src/ftxui/component/toggle_test.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",
@@ -233,6 +238,17 @@ cc_test(
"src/ftxui/screen/string_test.cpp", "src/ftxui/screen/string_test.cpp",
"src/ftxui/util/ref_test.cpp", "src/ftxui/util/ref_test.cpp",
# Private header from ftxui:screen for string_test.cpp.
"src/ftxui/screen/string_internal.hpp",
# Private header from ftxui::component for
# terminal_input_parser_test.cpp.
"src/ftxui/component/terminal_input_parser.hpp",
# Private header from ftxui::dom for
# flexbox_helper_test.cpp.
"src/ftxui/dom/flexbox_helper.hpp",
# TODO: Enable the two tests timing out with Bazel: # TODO: Enable the two tests timing out with Bazel:
# - "src/ftxui/component/screen_interactive_test.cpp", # - "src/ftxui/component/screen_interactive_test.cpp",
# - "src/ftxui/dom/selection_test.cpp", # - "src/ftxui/dom/selection_test.cpp",
@@ -241,9 +257,12 @@ cc_test(
"include", "include",
"src", "src",
], ],
copts = cpp20() + windows_copts(), copts = windows_copts(),
deps = [ deps = [
"//:ftxui", ":screen",
":dom",
":component",
"@googletest//:gtest",
"@googletest//:gtest_main", "@googletest//:gtest_main",
], ],
) )

View File

@@ -1,22 +1,50 @@
Changelog Changelog
========= =========
Future release Development
------------ -----------
6.1.4 (2025-05-01) ### Build
- Feature: Support C++20 modules.
This requires:
- Using the Ninja or MSVC generator
- A recent Clang/GCC/MSVC compiler.
- Cmake 3.28 or higher.
Usage:
```cpp
import ftxui;
import ftxui.component;
import ftxui.dom;
import ftxui.screen;
```
Thanks @mikomikotaishi for PR #1015.
Future release
=======
6.1.9 (2025-05-07
### Build
If all goes well (pending), ftxui should appear in the Bazel central repository.
It can be imported into your project using the following lines:
**MODULE.bazel**
```bazel
bazel_dep(name = "ftxui", version = "6.1.9")
```
Thanks @robinlinden and @kcc for the reviews.
### dom
- Bugfix: Restore the `dbox` behavior from ftxui 5.0.0. To apply bgcolor
blending between the two layers, a new `dboxBlend` will be added.
6.1.8 (2025-05-01)
------------------ ------------------
### Build ### Build
- Feature: Support `bazel` build system. See #1032. - Feature: Support `bazel` build system. See #1032.
Proposed by Kostya Serebryany @kcc Proposed by Kostya Serebryany @kcc
If all goes well (pending), it should appear in the Bazel central repository.
It can be imported into your project using the following lines:
**MODULE.bazel**
```bazel
bazel_dep(name = "ftxui", version = "6.1.4")
```
**BUILD.bazel** **BUILD.bazel**
```bazel ```bazel

View File

@@ -1,20 +1,26 @@
cmake_minimum_required(VERSION 3.12) option(FTXUI_BUILD_DOCS "Set to ON to build docs" OFF)
option(FTXUI_BUILD_EXAMPLES "Set to ON to build examples" OFF)
option(FTXUI_BUILD_MODULES "Build the C++20 modules" OFF)
option(FTXUI_BUILD_TESTS "Set to ON to build tests" OFF)
option(FTXUI_BUILD_TESTS_FUZZER "Set to ON to enable fuzzing" OFF)
option(FTXUI_CLANG_TIDY "Execute clang-tidy" OFF)
option(FTXUI_DEV_WARNINGS "Enable more compiler warnings and warnings as errors" OFF)
option(FTXUI_ENABLE_COVERAGE "Execute code coverage" OFF)
option(FTXUI_ENABLE_INSTALL "Generate the install target" ON)
option(FTXUI_QUIET "Set to ON for FTXUI to be quiet" OFF)
if (FTXUI_BUILD_MODULES)
cmake_minimum_required(VERSION 3.28.2)
else()
cmake_minimum_required(VERSION 3.12)
endif()
project(ftxui project(ftxui
LANGUAGES CXX LANGUAGES CXX
VERSION 6.1.4 VERSION 6.1.9
DESCRIPTION "C++ Functional Terminal User Interface." DESCRIPTION "C++ Functional Terminal User Interface."
) )
option(FTXUI_QUIET "Set to ON for FTXUI to be quiet" OFF)
option(FTXUI_BUILD_EXAMPLES "Set to ON to build examples" OFF)
option(FTXUI_BUILD_DOCS "Set to ON to build docs" OFF)
option(FTXUI_BUILD_TESTS "Set to ON to build tests" OFF)
option(FTXUI_BUILD_TESTS_FUZZER "Set to ON to enable fuzzing" OFF)
option(FTXUI_ENABLE_INSTALL "Generate the install target" ON)
option(FTXUI_CLANG_TIDY "Execute clang-tidy" OFF)
option(FTXUI_ENABLE_COVERAGE "Execute code coverage" OFF)
option(FTXUI_DEV_WARNINGS "Enable more compiler warnings and warnings as errors" OFF)
set(FTXUI_MICROSOFT_TERMINAL_FALLBACK_HELP_TEXT "On windows, assume the \ set(FTXUI_MICROSOFT_TERMINAL_FALLBACK_HELP_TEXT "On windows, assume the \
terminal used will be one of Microsoft and use a set of reasonnable fallback \ terminal used will be one of Microsoft and use a set of reasonnable fallback \
@@ -176,6 +182,13 @@ include(cmake/iwyu.cmake)
include(cmake/ftxui_export.cmake) include(cmake/ftxui_export.cmake)
include(cmake/ftxui_install.cmake) include(cmake/ftxui_install.cmake)
include(cmake/ftxui_package.cmake) include(cmake/ftxui_package.cmake)
include(cmake/ftxui_modules.cmake)
add_subdirectory(examples)
add_subdirectory(doc) add_subdirectory(doc)
add_subdirectory(examples)
# You can generate ./examples_modules/ by running
# ./tools/generate_examples_modules.sh
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples_modules/CMakeLists.txt")
add_subdirectory(examples_modules)
endif()

View File

@@ -1,13 +1,13 @@
# Copyright 2025 Arthur Sonzogni. All rights reserved. # FTXUI module.
# Use of this source code is governed by the MIT license that can be found in module(
# the LICENSE file. name = "ftxui",
version = "6.1.9",
compatibility_level = 6,
)
# FTXUI Module. # Build dependencies.
module(name = "ftxui", version = "6.1.4")
# Build deps.
bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "platforms", version = "0.0.10")
# Test deps. # Test dependencies.
bazel_dep(name = "googletest", version = "1.16.0.bcr.1") bazel_dep(name = "googletest", version = "1.14.0.bcr.1", dev_dependency = True)

View File

@@ -40,17 +40,27 @@ A simple cross-platform C++ library for terminal based user interfaces!
* Support for animations. [Demo 1](https://arthursonzogni.github.io/FTXUI/examples/?file=component/menu_underline_animated_gallery), [Demo 2](https://arthursonzogni.github.io/FTXUI/examples/?file=component/button_style) * Support for animations. [Demo 1](https://arthursonzogni.github.io/FTXUI/examples/?file=component/menu_underline_animated_gallery), [Demo 2](https://arthursonzogni.github.io/FTXUI/examples/?file=component/button_style)
* Support for drawing. [Demo](https://arthursonzogni.github.io/FTXUI/examples/?file=component/canvas_animated) * Support for drawing. [Demo](https://arthursonzogni.github.io/FTXUI/examples/?file=component/canvas_animated)
* No dependencies * No dependencies
* Module support
* **Cross platform**: Linux/MacOS (main target), WebAssembly, Windows (Thanks to contributors!). * **Cross platform**: Linux/MacOS (main target), WebAssembly, Windows (Thanks to contributors!).
* Learn by [examples](#documentation), and [tutorials](#documentation) * Learn by [examples](#documentation), and [tutorials](#documentation)
* Multiple packages: CMake [FetchContent]([https://bewagner.net/programming/2020/05/02/cmake-fetchcontent/](https://cmake.org/cmake/help/latest/module/FetchContent.html)) (preferred),Bazel, vcpkg, pkgbuild, conan. * Multiple packages:
- CMake [FetchContent]([https://bewagner.net/programming/2020/05/02/cmake-fetchcontent/](https://cmake.org/cmake/help/latest/module/FetchContent.html)) (preferred)
- [Bazel](https://registry.bazel.build/modules/ftxui)
- [vcpkg](https://vcpkg.link/ports/ftxui)
- [Conan](https://conan.io/center/recipes/ftxui) [Debian package](https://tracker.debian.org/pkg/ftxui)
- [Ubuntu package](https://launchpad.net/ubuntu/+source/ftxui)
- [Arch Linux](https://aur.archlinux.org/packages/ftxui/)
- [OpenSUSE](https://build.opensuse.org/package/show/devel:libraries:c_c++/ftxui)
* Good practices: documentation, tests, fuzzers, performance tests, automated CI, automated packaging, etc... * Good practices: documentation, tests, fuzzers, performance tests, automated CI, automated packaging, etc...
## Documentation ## Documentation
- [Starter example project](https://github.com/ArthurSonzogni/ftxui-starter) - [Starter CMake](https://github.com/ArthurSonzogni/ftxui-starter)
- [Starter Bazel](https://github.com/ArthurSonzogni/ftxui-bazel)
- [Documentation](https://arthursonzogni.github.io/FTXUI/) - [Documentation](https://arthursonzogni.github.io/FTXUI/)
- [Examples (WebAssembly)](https://arthursonzogni.github.io/FTXUI/examples/) - [Examples (WebAssembly)](https://arthursonzogni.github.io/FTXUI/examples/)
- [Build using CMake](https://arthursonzogni.github.io/FTXUI/#build-cmake) - [Build using CMake](https://arthursonzogni.github.io/FTXUI/#build-cmake)
- [Build using Bazel](https://arthursonzogni.github.io/FTXUI/#build-bazel)
## Example ## Example
~~~cpp ~~~cpp
@@ -348,6 +358,8 @@ Feel free to add your projects here:
- [terminal-rain](https://github.com/Oakamoore/terminal-rain) - [terminal-rain](https://github.com/Oakamoore/terminal-rain)
- [keywords](https://github.com/Oakamoore/keywords) ([Play web version :heart:](https://oakamoore.itch.io/keywords)) - [keywords](https://github.com/Oakamoore/keywords) ([Play web version :heart:](https://oakamoore.itch.io/keywords))
- [FTB - tertminal file browser](https://github.com/Cyxuan0311/FTB) - [FTB - tertminal file browser](https://github.com/Cyxuan0311/FTB)
- [openJuice](https://github.com/mikomikotaishi/openJuice)
- [SHOOT!](https://github.com/ShingZhanho/ENGG1340-Project-25Spring)
### [cpp-best-practices/game_jam](https://github.com/cpp-best-practices/game_jam) ### [cpp-best-practices/game_jam](https://github.com/cpp-best-practices/game_jam)
@@ -364,38 +376,69 @@ Several games using the FTXUI have been made during the Game Jam:
- [smoothlife](https://github.com/cpp-best-practices/game_jam/blob/main/Jam1_April_2022/smoothlife.md) - [smoothlife](https://github.com/cpp-best-practices/game_jam/blob/main/Jam1_April_2022/smoothlife.md)
- [Consu](https://github.com/cpp-best-practices/game_jam/blob/main/Jam1_April_2022/consu.md) - [Consu](https://github.com/cpp-best-practices/game_jam/blob/main/Jam1_April_2022/consu.md)
## Utilization ## Build using CMake
It is **highly** recommended to use CMake FetchContent to depend on FTXUI so you may specify which commit you would like to depend on. It is **highly** recommended to use CMake FetchContent to depend on FTXUI so you may specify which commit you would like to depend on.
```cmake ```cmake
include(FetchContent) include(FetchContent)
FetchContent_Declare(ftxui FetchContent_Declare(ftxui
GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
GIT_TAG v6.1.4 GIT_TAG v6.1.9
) )
FetchContent_MakeAvailable(ftxui)
FetchContent_GetProperties(ftxui) target_link_libraries(your_target PRIVATE
if(NOT ftxui_POPULATED) # Chose a submodule
FetchContent_Populate(ftxui) ftxui::component
add_subdirectory(${ftxui_SOURCE_DIR} ${ftxui_BINARY_DIR} EXCLUDE_FROM_ALL) ftxui::dom
endif() ftxui::screen
)
``` ```
# Build using Bazel
**MODULE.bazel**
```starlark
bazel_dep(
name = "ftxui",
version = "v6.1.9",
)
```
**BUILD.bazel**
```starlark
cc_binary(
name = "your_target",
srcs = ["your_source.cc"],
deps = [
"@ftxui//:ftxui_component",
"@ftxui//:ftxui_dom",
"@ftxui//:ftxui_screen",
],
)
```
# Build with something else:
If you don't, FTXUI may be used from the following packages: If you don't, FTXUI may be used from the following packages:
- [bazel](...) - CMake [FetchContent]([https://bewagner.net/programming/2020/05/02/cmake-fetchcontent/](https://cmake.org/cmake/help/latest/module/FetchContent.html)) (preferred),
- [vcpkg](https://vcpkgx.com/details.html?package=ftxui) - [Bazel](https://registry.bazel.build/modules/ftxui),
- [Arch Linux PKGBUILD](https://aur.archlinux.org/packages/ftxui-git/). - [vcpkg](https://vcpkg.link/ports/ftxui),
- [conan.io](https://conan.io/center/ftxui) - [Conan](https://conan.io/center/recipes/ftxui)
- [openSUSE](https://build.opensuse.org/package/show/devel:libraries:c_c++/ftxui) - [Debian package](https://tracker.debian.org/pkg/ftxui),
- - [Ubuntu package](https://launchpad.net/ubuntu/+source/ftxui),
- [Arch Linux](https://aur.archlinux.org/packages/ftxui/),
- [OpenSUSE](https://build.opensuse.org/package/show/devel:libraries:c_c++/ftxui),
[![Packaging status](https://repology.org/badge/vertical-allrepos/libftxui.svg)](https://repology.org/project/libftxui/versions) [![Packaging status](https://repology.org/badge/vertical-allrepos/libftxui.svg)](https://repology.org/project/libftxui/versions)
If you choose to build and link FTXUI yourself, `ftxui-component` must be first in the linking order relative to the other FTXUI libraries, i.e. If you choose to build and link FTXUI yourself, `ftxui-component` must be first in the linking order relative to the other FTXUI libraries, i.e.
```bash ```bash
g++ . . . -lftxui-component -lftxui-dom -lftxui-screen . . . g++ . . . -lftxui-component -lftxui-dom -lftxui-screen . . .
``` ```
To build FTXUI with modules, ensure that you are using a generator like Ninja or Visual Studio that supports modules, and pass the flag `FTXUI_BUILD_MODULES`.
## Contributors ## Contributors
<a href="https://github.com/ArthurSonzogni/FTXUI/graphs/contributors"> <a href="https://github.com/ArthurSonzogni/FTXUI/graphs/contributors">

View File

@@ -1,24 +1,7 @@
# ftxui_common.bzl # ftxui_common.bzl
load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_cc//cc:defs.bzl", "cc_library")
load("@rules_cc//cc:defs.bzl", "cc_binary")
def cpp17():
return select({
"@rules_cc//cc/compiler:msvc-cl": ["/std:c++17"],
"@rules_cc//cc/compiler:clang-cl": ["/std:c++17"],
"@rules_cc//cc/compiler:clang": ["-std=c++17"],
"@rules_cc//cc/compiler:gcc": ["-std=c++17"],
"//conditions:default": ["-std=c++17"],
})
def cpp20():
return select({
"@rules_cc//cc/compiler:msvc-cl": ["/std:c++20"],
"@rules_cc//cc/compiler:clang-cl": ["/std:c++20"],
"@rules_cc//cc/compiler:clang": ["-std=c++20"],
"@rules_cc//cc/compiler:gcc": ["-std=c++20"],
"//conditions:default": ["-std=c++20"],
})
# Microsoft terminal is a bit buggy ¯\_(ツ)_/¯ and MSVC uses bad defaults. # Microsoft terminal is a bit buggy ¯\_(ツ)_/¯ and MSVC uses bad defaults.
def windows_copts(): def windows_copts():
@@ -45,7 +28,8 @@ def windows_copts():
# This # This
# - Replace missing font symbols by others. # - Replace missing font symbols by others.
# - Reduce screen position pooling frequency to deals against a Microsoft # - Reduce screen position pooling frequency to deals against a Microsoft
# race condition. This was fixed in 2020, but clients never not updated. # race condition. This was fixed in 2020, but clients are still using
# old versions.
# - https://github.com/microsoft/terminal/pull/7583 # - https://github.com/microsoft/terminal/pull/7583
# - https://github.com/ArthurSonzogni/FTXUI/issues/136 # - https://github.com/ArthurSonzogni/FTXUI/issues/136
"-DFTXUI_MICROSOFT_TERMINAL_FALLBACK", "-DFTXUI_MICROSOFT_TERMINAL_FALLBACK",
@@ -71,8 +55,8 @@ def pthread_linkopts():
def ftxui_cc_library( def ftxui_cc_library(
name, name,
srcs, srcs = [],
hdrs, hdrs = [],
linkopts = [], linkopts = [],
deps = []): deps = []):
@@ -88,12 +72,13 @@ def ftxui_cc_library(
"include", "include",
"src", "src",
], ],
copts = cpp17() + windows_copts(), copts = windows_copts(),
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
# Compile all the examples in the examples/ directory. # Compile all the examples in the examples/ directory.
# This is useful to check the Bazel is synchronized with CMake definitions. # This is useful to check the Bazel is always synchronized against CMake
# definitions.
def generate_examples(): def generate_examples():
cpp_files = native.glob(["examples/**/*.cpp"]) cpp_files = native.glob(["examples/**/*.cpp"])
@@ -107,9 +92,13 @@ def generate_examples():
# Turn "examples/component/button.cpp" → "example_component_button" # Turn "examples/component/button.cpp" → "example_component_button"
name = src.replace("/", "_").replace(".cpp", "") name = src.replace("/", "_").replace(".cpp", "")
native.cc_binary( cc_binary(
name = name, name = name,
srcs = [src], srcs = [src],
deps = ["//:component"], deps = [
copts = cpp20() + windows_copts(), ":component",
":dom",
":screen",
],
copts = windows_copts(),
) )

View File

@@ -5,13 +5,14 @@ function(ftxui_message msg)
endfunction() endfunction()
ftxui_message("┌─ FTXUI options ─────────────────────") ftxui_message("┌─ FTXUI options ─────────────────────")
ftxui_message("│ FTXUI_ENABLE_INSTALL : ${FTXUI_ENABLE_INSTALL}")
ftxui_message("│ FTXUI_BUILD_EXAMPLES : ${FTXUI_BUILD_EXAMPLES}")
ftxui_message("│ FTXUI_QUIET : ${FTXUI_QUIET}")
ftxui_message("│ FTXUI_BUILD_DOCS : ${FTXUI_BUILD_DOCS}") ftxui_message("│ FTXUI_BUILD_DOCS : ${FTXUI_BUILD_DOCS}")
ftxui_message("│ FTXUI_BUILD_EXAMPLES : ${FTXUI_BUILD_EXAMPLES}")
ftxui_message("│ FTXUI_BUILD_MODULES : ${FTXUI_BUILD_MODULES}")
ftxui_message("│ FTXUI_BUILD_TESTS : ${FTXUI_BUILD_TESTS}") ftxui_message("│ FTXUI_BUILD_TESTS : ${FTXUI_BUILD_TESTS}")
ftxui_message("│ FTXUI_BUILD_TESTS_FUZZER : ${FTXUI_BUILD_TESTS_FUZZER}") ftxui_message("│ FTXUI_BUILD_TESTS_FUZZER : ${FTXUI_BUILD_TESTS_FUZZER}")
ftxui_message("│ FTXUI_ENABLE_COVERAGE : ${FTXUI_ENABLE_COVERAGE}")
ftxui_message("│ FTXUI_DEV_WARNINGS : ${FTXUI_DEV_WARNINGS}")
ftxui_message("│ FTXUI_CLANG_TIDY : ${FTXUI_CLANG_TIDY}") ftxui_message("│ FTXUI_CLANG_TIDY : ${FTXUI_CLANG_TIDY}")
ftxui_message("│ FTXUI_DEV_WARNINGS : ${FTXUI_DEV_WARNINGS}")
ftxui_message("│ FTXUI_ENABLE_COVERAGE : ${FTXUI_ENABLE_COVERAGE}")
ftxui_message("│ FTXUI_ENABLE_INSTALL : ${FTXUI_ENABLE_INSTALL}")
ftxui_message("│ FTXUI_QUIET : ${FTXUI_QUIET}")
ftxui_message("└─────────────────────────────────────") ftxui_message("└─────────────────────────────────────")

81
cmake/ftxui_modules.cmake Normal file
View File

@@ -0,0 +1,81 @@
if (NOT FTXUI_BUILD_MODULES)
return()
endif()
add_library(ftxui-modules)
target_sources(ftxui-modules
PUBLIC FILE_SET CXX_MODULES FILES
src/ftxui/component.cppm
src/ftxui/component/Animation.cppm
src/ftxui/component/CapturedMouse.cppm
src/ftxui/component/Component.cppm
src/ftxui/component/ComponentBase.cppm
src/ftxui/component/ComponentOptions.cppm
src/ftxui/component/Event.cppm
src/ftxui/component/Loop.cppm
src/ftxui/component/Mouse.cppm
src/ftxui/component/Receiver.cppm
src/ftxui/component/ScreenInteractive.cppm
src/ftxui/component/Task.cppm
src/ftxui/dom.cppm
src/ftxui/dom/Canvas.cppm
src/ftxui/dom/Deprecated.cppm
src/ftxui/dom/Direction.cppm
src/ftxui/dom/Elements.cppm
src/ftxui/dom/FlexboxConfig.cppm
src/ftxui/dom/LinearGradient.cppm
src/ftxui/dom/Node.cppm
src/ftxui/dom/Requirement.cppm
src/ftxui/dom/Selection.cppm
src/ftxui/dom/Table.cppm
src/ftxui/screen.cppm
src/ftxui/screen/Box.cppm
src/ftxui/screen/Color.cppm
src/ftxui/screen/ColorInfo.cppm
src/ftxui/screen/Deprecated.cppm
src/ftxui/screen/Image.cppm
src/ftxui/screen/Pixel.cppm
src/ftxui/screen/Screen.cppm
src/ftxui/screen/String.cppm
src/ftxui/screen/Terminal.cppm
src/ftxui/util.cppm
src/ftxui/util/AutoReset.cppm
src/ftxui/util/Ref.cppm
)
target_link_libraries(ftxui-modules
PUBLIC
ftxui::screen
ftxui::dom
ftxui::component
)
target_compile_features(ftxui-modules PUBLIC cxx_std_20)
if (CMAKE_COMPILER_IS_GNUCXX)
target_compile_options(${name} PUBLIC -fmodules-ts)
endif ()
add_library(ftxui::modules ALIAS ftxui-modules)
if(FTXUI_ENABLE_INSTALL)
include(GNUInstallDirs)
install(TARGETS ftxui-modules
EXPORT ftxui-targets
FILE_SET CXX_MODULES
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui
FILE_SET HEADERS
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui
INCLUDES
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui
)
install(EXPORT ftxui-targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ftxui
CXX_MODULES_DIRECTORY ${CMAKE_INSTALL_LIBDIR}/cmake/ftxui
)
install(FILES my_package-config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ftxui
)
endif()

View File

@@ -81,7 +81,7 @@ include(FetchContent)
set(FETCHCONTENT_UPDATES_DISCONNECTED TRUE) set(FETCHCONTENT_UPDATES_DISCONNECTED TRUE)
FetchContent_Declare(ftxui FetchContent_Declare(ftxui
GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
GIT_TAG main # Important: Specify a version or a commit hash here. GIT_TAG 6.1.9
) )
FetchContent_MakeAvailable(ftxui) FetchContent_MakeAvailable(ftxui)
@@ -94,13 +94,33 @@ target_link_libraries(ftxui-starter
) )
``` ```
## Build ### Using Bazel {#build-bazel}
```bash See [ftxui module](https://registry.bazel.build/modules/ftxui) from the Bazel
mkdir build && cd build Central Registry.
cmake ..
make See also this [starter](https://github.com/ArthurSonzogni/ftxui-bazel) project.
./main
**Module.bazel**
```starlark
bazel_dep(
name = "ftxui",
version = "6.1.9",
)
```
**BUILD.bazel**
```starlark
cc_binary(
name = "main",
srcs = ["main.cpp"],
deps = [
# Choose one of the following:
"@ftxui//:dom",
"@ftxui//:screen",
"@ftxui//:component",
],
)
``` ```
# List of modules. {#modules} # List of modules. {#modules}

View File

@@ -1,9 +1,65 @@
#include "ftxui/component/component.hpp" // Copyright 2020 Arthur Sonzogni. All rights reserved.
#include "ftxui/component/screen_interactive.hpp" // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#include <memory> // for shared_ptr, __shared_ptr_access
#include <string> // for operator+, to_string
int main(){ #include "ftxui/component/captured_mouse.hpp" // for ftxui
auto screen = ftxui::ScreenInteractive::Fullscreen(); #include "ftxui/component/component.hpp" // for Button, Horizontal, Renderer
auto testComponent = ftxui::Renderer([](){return ftxui::text("test Component");}); #include "ftxui/component/component_base.hpp" // for ComponentBase
screen.Loop(testComponent); #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
return 0; #include "ftxui/dom/elements.hpp" // for separator, gauge, text, Element, operator|, vbox, border
using namespace ftxui;
// This is a helper function to create a button with a custom style.
// The style is defined by a lambda function that takes an EntryState and
// returns an Element.
// We are using `center` to center the text inside the button, then `border` to
// add a border around the button, and finally `flex` to make the button fill
// the available space.
ButtonOption ButtonStyle() {
auto option = ButtonOption::Animated();
option.transform = [](const EntryState& s) {
auto element = text(s.label);
if (s.focused) {
element |= bold;
}
return element | center | borderEmpty | flex;
};
return option;
}
int main() {
int value = 50;
// The tree of components. This defines how to navigate using the keyboard.
auto buttons = Container::Vertical({
Container::Horizontal({
Button(
"-1", [&] { value--; }, ButtonStyle()),
Button(
"+1", [&] { value++; }, ButtonStyle()),
}) | flex,
Container::Horizontal({
Button(
"-10", [&] { value -= 10; }, ButtonStyle()),
Button(
"+10", [&] { value += 10; }, ButtonStyle()),
}) | flex,
});
// Modify the way to render them on screen:
auto component = Renderer(buttons, [&] {
return vbox({
text("value = " + std::to_string(value)),
separator(),
buttons->Render() | flex,
}) |
flex | border;
});
auto screen = ScreenInteractive::Fullscreen();
screen.Loop(component);
return 0;
} }

18
src/ftxui/component.cppm Normal file
View File

@@ -0,0 +1,18 @@
/**
* @file component.cppm
* @brief Module file for FTXUI component operations.
*/
export module ftxui.component;
export import ftxui.component.Animation;
export import ftxui.component.CapturedMouse;
export import ftxui.component.Component;
export import ftxui.component.ComponentBase;
export import ftxui.component.ComponentOptions;
export import ftxui.component.Event;
export import ftxui.component.Loop;
export import ftxui.component.Mouse;
export import ftxui.component.Receiver;
export import ftxui.component.ScreenInteractive;
export import ftxui.component.Task;

View File

@@ -0,0 +1,66 @@
/**
* @file Animation.cppm
* @brief Module file for the Animation namespace of the Component module
*/
module;
#include <ftxui/component/animation.hpp>
export module ftxui.component.Animation;
/**
* @namespace ftxui::animation
* @brief The FTXUI ftxui::animation:: namespace
*/
export namespace ftxui::animation {
using ftxui::animation::RequestAnimationFrame;
using ftxui::animation::Clock;
using ftxui::animation::TimePoint;
using ftxui::animation::Duration;
using ftxui::animation::Params;
/**
* @namespace easing
* @brief The FTXUI sf::animation::easing:: namespace
*/
namespace easing {
using ftxui::animation::easing::Function;
using ftxui::animation::easing::Linear;
using ftxui::animation::easing::QuadraticIn;
using ftxui::animation::easing::QuadraticOut;
using ftxui::animation::easing::QuadraticInOut;
using ftxui::animation::easing::CubicIn;
using ftxui::animation::easing::CubicOut;
using ftxui::animation::easing::CubicInOut;
using ftxui::animation::easing::QuarticIn;
using ftxui::animation::easing::QuarticOut;
using ftxui::animation::easing::QuarticInOut;
using ftxui::animation::easing::QuinticIn;
using ftxui::animation::easing::QuinticOut;
using ftxui::animation::easing::QuinticInOut;
using ftxui::animation::easing::SineIn;
using ftxui::animation::easing::SineOut;
using ftxui::animation::easing::SineInOut;
using ftxui::animation::easing::CircularIn;
using ftxui::animation::easing::CircularOut;
using ftxui::animation::easing::CircularInOut;
using ftxui::animation::easing::ExponentialIn;
using ftxui::animation::easing::ExponentialOut;
using ftxui::animation::easing::ExponentialInOut;
using ftxui::animation::easing::ElasticIn;
using ftxui::animation::easing::ElasticOut;
using ftxui::animation::easing::ElasticInOut;
using ftxui::animation::easing::BackIn;
using ftxui::animation::easing::BackOut;
using ftxui::animation::easing::BackInOut;
using ftxui::animation::easing::BounceIn;
using ftxui::animation::easing::BounceOut;
using ftxui::animation::easing::BounceInOut;
}
using ftxui::animation::Animator;
}

View File

@@ -0,0 +1,18 @@
/**
* @file CapturedMouse.cppm
* @brief Module file for the CapturedMouseInterface class of the Component module
*/
module;
#include <ftxui/component/captured_mouse.hpp>
export module ftxui.component.CapturedMouse;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::CapturedMouseInterface;
}

View File

@@ -0,0 +1,61 @@
/**
* @file Component.cppm
* @brief Module file for the Component classes of the Component module
*/
module;
#include <ftxui/component/component.hpp>
export module ftxui.component.Component;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ButtonOption;
using ftxui::CheckboxOption;
using ftxui::Event;
using ftxui::InputOption;
using ftxui::MenuOption;
using ftxui::RadioboxOption;
using ftxui::MenuEntryOption;
using ftxui::Make;
using ftxui::ComponentDecorator;
using ftxui::ElementDecorator;
using ftxui::operator|;
using ftxui::operator|=;
namespace Container {
using ftxui::Container::Vertical;
using ftxui::Container::Horizontal;
using ftxui::Container::Tab;
using ftxui::Container::Stacked;
}
using ftxui::Button;
using ftxui::Checkbox;
using ftxui::Input;
using ftxui::Menu;
using ftxui::MenuEntry;
using ftxui::Radiobox;
using ftxui::Dropdown;
using ftxui::Toggle;
using ftxui::Slider;
using ftxui::ResizableSplit;
using ftxui::ResizableSplitLeft;
using ftxui::ResizableSplitRight;
using ftxui::ResizableSplitTop;
using ftxui::ResizableSplitBottom;
using ftxui::Renderer;
using ftxui::CatchEvent;
using ftxui::Maybe;
using ftxui::Modal;
using ftxui::Collapsible;
using ftxui::Hoverable;
using ftxui::Window;
}

View File

@@ -0,0 +1,28 @@
/**
* @file ComponentBase.cppm
* @brief Module file for the ComponentBase class of the Component module
*/
module;
#include <ftxui/component/component_base.hpp>
export module ftxui.component.ComponentBase;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Delegate;
using ftxui::Focus;
using ftxui::Event;
namespace animation {
using ftxui::animation::Params;
}
using ftxui::ComponentBase;
using ftxui::Component;
using ftxui::Components;
}

View File

@@ -0,0 +1,33 @@
/**
* @file ComponentOptions.cppm
* @brief Module file for options for the Component class of the Component module
*/
module;
#include <ftxui/component/component_options.hpp>
export module ftxui.component.ComponentOptions;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::EntryState;
using ftxui::UnderlineOption;
using ftxui::AnimatedColorOption;
using ftxui::AnimatedColorsOption;
using ftxui::MenuEntryOption;
using ftxui::MenuOption;
using ftxui::ButtonOption;
using ftxui::CheckboxOption;
using ftxui::InputState;
using ftxui::InputOption;
using ftxui::RadioboxOption;
using ftxui::ResizableSplitOption;
using ftxui::SliderOption;
using ftxui::WindowRenderState;
using ftxui::WindowOptions;
using ftxui::DropdownOption;
}

View File

@@ -0,0 +1,21 @@
/**
* @file Event.cppm
* @brief Module file for the Event struct of the Component module
*/
module;
#include <ftxui/component/event.hpp>
export module ftxui.component.Event;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ScreenInteractive;
using ftxui::ComponentBase;
using ftxui::Event;
}

View File

@@ -0,0 +1,22 @@
/**
* @file Loop.cppm
* @brief Module file for the Loop class of the Component module
*/
module;
#include <ftxui/component/loop.hpp>
export module ftxui.component.Loop;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ComponentBase;
using ftxui::Component;
using ftxui::ScreenInteractive;
using ftxui::Loop;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Mouse.cppm
* @brief Module file for the Mouse struct of the Component module
*/
module;
#include <ftxui/component/mouse.hpp>
export module ftxui.component.Mouse;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Mouse;
}

View File

@@ -0,0 +1,22 @@
/**
* @file Receiver.cppm
* @brief Module file for the Receiver class of the Component module
*/
module;
#include <ftxui/component/receiver.hpp>
export module ftxui.component.Receiver;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::SenderImpl;
using ftxui::ReceiverImpl;
using ftxui::Sender;
using ftxui::Receiver;
using ftxui::MakeReceiver;
}

View File

@@ -0,0 +1,25 @@
/**
* @file ScreenInteractive.cppm
* @brief Module file for the ScreenInteractive class of the Component module
*/
module;
#include <ftxui/component/screen_interactive.hpp>
export module ftxui.component.ScreenInteractive;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ComponentBase;
using ftxui::Loop;
using ftxui::Event;
using ftxui::Component;
using ftxui::Screen;
using ftxui::ScreenInteractivePrivate;
using ftxui::ScreenInteractive;
}

View File

@@ -0,0 +1,20 @@
/**
* @file Task.cppm
* @brief Module file for the Task class of the Component module
*/
module;
#include <ftxui/component/task.hpp>
export module ftxui.component.Task;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::AnimationTask;
using ftxui::Closure;
using ftxui::Task;
}

17
src/ftxui/dom.cppm Normal file
View File

@@ -0,0 +1,17 @@
/**
* @file dom.cppm
* @brief Module file for FTXUI main operations.
*/
export module ftxui.dom;
export import ftxui.dom.Canvas;
export import ftxui.dom.Deprecated;
export import ftxui.dom.Direction;
export import ftxui.dom.Elements;
export import ftxui.dom.FlexboxConfig;
export import ftxui.dom.LinearGradient;
export import ftxui.dom.Node;
export import ftxui.dom.Requirement;
export import ftxui.dom.Selection;
export import ftxui.dom.Table;

18
src/ftxui/dom/Canvas.cppm Normal file
View File

@@ -0,0 +1,18 @@
/**
* @file Canvas.cppm
* @brief Module file for the Canvas struct of the Dom module
*/
module;
#include <ftxui/dom/canvas.hpp>
export module ftxui.dom.Canvas;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Canvas;
}

View File

@@ -0,0 +1,20 @@
/**
* @file Deprecated.cppm
* @brief Module file for deprecated parts of the Dom module
*/
module;
#include <ftxui/dom/deprecated.hpp>
export module ftxui.dom.Deprecated;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::text;
using ftxui::vtext;
using ftxui::paragraph;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Direction.cppm
* @brief Module file for the Direction enum of the Dom module
*/
module;
#include <ftxui/dom/direction.hpp>
export module ftxui.dom.Direction;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Direction;
}

130
src/ftxui/dom/Elements.cppm Normal file
View File

@@ -0,0 +1,130 @@
/**
* @file Canvas.cppm
* @brief Module file for the Element classes and functions of the Dom module
*/
module;
#include <ftxui/dom/elements.hpp>
export module ftxui.dom.Elements;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Node;
using ftxui::Element;
using ftxui::Elements;
using ftxui::Decorator;
using ftxui::GraphFunction;
using ftxui::BorderStyle;
using ftxui::operator|;
using ftxui::operator|=;
using ftxui::text;
using ftxui::vtext;
using ftxui::separator;
using ftxui::separatorLight;
using ftxui::separatorDashed;
using ftxui::separatorHeavy;
using ftxui::separatorDouble;
using ftxui::separatorEmpty;
using ftxui::separatorStyled;
using ftxui::separatorCharacter;
using ftxui::separatorHSelector;
using ftxui::separatorVSelector;
using ftxui::gauge;
using ftxui::gaugeLeft;
using ftxui::gaugeRight;
using ftxui::gaugeUp;
using ftxui::gaugeDown;
using ftxui::gaugeDirection;
using ftxui::border;
using ftxui::borderLight;
using ftxui::borderDashed;
using ftxui::borderHeavy;
using ftxui::borderDouble;
using ftxui::borderRounded;
using ftxui::borderEmpty;
using ftxui::borderStyled;
using ftxui::borderWith;
using ftxui::window;
using ftxui::spinner;
using ftxui::paragraph;
using ftxui::paragraphAlignLeft;
using ftxui::paragraphAlignRight;
using ftxui::paragraphAlignCenter;
using ftxui::paragraphAlignJustify;
using ftxui::graph;
using ftxui::emptyElement;
using ftxui::canvas;
using ftxui::bold;
using ftxui::dim;
using ftxui::inverted;
using ftxui::underlined;
using ftxui::underlinedDouble;
using ftxui::blink;
using ftxui::strikethrough;
using ftxui::color;
using ftxui::bgcolor;
using ftxui::focusPosition;
using ftxui::focusPositionRelative;
using ftxui::automerge;
using ftxui::hyperlink;
using ftxui::selectionStyleReset;
using ftxui::selectionColor;
using ftxui::selectionBackgroundColor;
using ftxui::selectionForegroundColor;
using ftxui::selectionStyle;
using ftxui::hbox;
using ftxui::vbox;
using ftxui::dbox;
using ftxui::flexbox;
using ftxui::gridbox;
using ftxui::hflow;
using ftxui::vflow;
using ftxui::flex;
using ftxui::flex_grow;
using ftxui::flex_shrink;
using ftxui::xflex;
using ftxui::xflex_grow;
using ftxui::xflex_shrink;
using ftxui::yflex;
using ftxui::yflex_grow;
using ftxui::yflex_shrink;
using ftxui::notflex;
using ftxui::filler;
using ftxui::WidthOrHeight;
using ftxui::Constraint;
using ftxui::size;
using ftxui::focusCursorBlock;
using ftxui::focusCursorBlockBlinking;
using ftxui::focusCursorBar;
using ftxui::focusCursorBarBlinking;
using ftxui::focusCursorUnderline;
using ftxui::focusCursorUnderlineBlinking;
using ftxui::vscroll_indicator;
using ftxui::hscroll_indicator;
using ftxui::reflect;
using ftxui::clear_under;
using ftxui::hcenter;
using ftxui::vcenter;
using ftxui::center;
using ftxui::align_right;
using ftxui::nothing;
namespace Dimension {
using ftxui::Dimension::Fit;
}
}

View File

@@ -0,0 +1,18 @@
/**
* @file FlexboxConfig.cppm
* @brief Module file for the FlexboxConfig struct of the Dom module
*/
module;
#include <ftxui/dom/flexbox_config.hpp>
export module ftxui.dom.FlexboxConfig;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::FlexboxConfig;
}

View File

@@ -0,0 +1,18 @@
/**
* @file LinearGradient.cppm
* @brief Module file for the LinearGradient struct of the Dom module
*/
module;
#include <ftxui/dom/linear_gradient.hpp>
export module ftxui.dom.LinearGradient;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::LinearGradient;
}

25
src/ftxui/dom/Node.cppm Normal file
View File

@@ -0,0 +1,25 @@
/**
* @file Node.cppm
* @brief Module file for the Node class of the Dom module
*/
module;
#include <ftxui/dom/node.hpp>
export module ftxui.dom.Node;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Node;
using ftxui::Screen;
using ftxui::Element;
using ftxui::Elements;
using ftxui::Render;
using ftxui::GetNodeSelectedContent;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Requirement.cppm
* @brief Module file for the Requirement struct of the Dom module
*/
module;
#include <ftxui/dom/requirement.hpp>
export module ftxui.dom.Requirement;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Requirement;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Selection.cppm
* @brief Module file for the Selection class of the Dom module
*/
module;
#include <ftxui/dom/selection.hpp>
export module ftxui.dom.Selection;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Selection;
}

19
src/ftxui/dom/Table.cppm Normal file
View File

@@ -0,0 +1,19 @@
/**
* @file Table.cppm
* @brief Module file for the Table class of the Dom module
*/
module;
#include <ftxui/dom/table.hpp>
export module ftxui.dom.Table;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Table;
using ftxui::TableSelection;
}

View File

@@ -45,59 +45,6 @@ class DBox : public Node {
child->SetBox(box); child->SetBox(box);
} }
} }
void Render(Screen& screen) override {
if (children_.size() <= 1) {
Node::Render(screen);
return;
}
const int width = box_.x_max - box_.x_min + 1;
const int height = box_.y_max - box_.y_min + 1;
std::vector<Pixel> pixels(std::size_t(width * height));
for (auto& child : children_) {
child->Render(screen);
// Accumulate the pixels
Pixel* acc = pixels.data();
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
auto& pixel = screen.PixelAt(x + box_.x_min, y + box_.y_min);
acc->background_color =
Color::Blend(acc->background_color, pixel.background_color);
acc->automerge = pixel.automerge || acc->automerge;
if (pixel.character.empty()) {
acc->foreground_color =
Color::Blend(acc->foreground_color, pixel.background_color);
} else {
acc->blink = pixel.blink;
acc->bold = pixel.bold;
acc->dim = pixel.dim;
acc->inverted = pixel.inverted;
acc->italic = pixel.italic;
acc->underlined = pixel.underlined;
acc->underlined_double = pixel.underlined_double;
acc->strikethrough = pixel.strikethrough;
acc->hyperlink = pixel.hyperlink;
acc->character = pixel.character;
acc->foreground_color = pixel.foreground_color;
}
++acc; // NOLINT
pixel = Pixel();
}
}
}
// Render the accumulated pixels:
Pixel* acc = pixels.data();
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
screen.PixelAt(x + box_.x_min, y + box_.y_min) = *acc++; // NOLINT
}
}
}
}; };
} // namespace } // namespace

11
src/ftxui/ftxui.cppm Normal file
View File

@@ -0,0 +1,11 @@
/**
* @file ftxui.cppm
* @brief Module file re-exporting all FTXUI submodules.
*/
export module ftxui;
export import ftxui.component;
export import ftxui.dom;
export import ftxui.screen;
export import ftxui.util;

16
src/ftxui/screen.cppm Normal file
View File

@@ -0,0 +1,16 @@
/**
* @file screen.cppm
* @brief Module file for FTXUI screen operations.
*/
export module ftxui.screen;
export import ftxui.screen.Box;
export import ftxui.screen.Color;
export import ftxui.screen.ColorInfo;
export import ftxui.screen.Deprecated;
export import ftxui.screen.Image;
export import ftxui.screen.Pixel;
export import ftxui.screen.Screen;
export import ftxui.screen.String;
export import ftxui.screen.Terminal;

18
src/ftxui/screen/Box.cppm Normal file
View File

@@ -0,0 +1,18 @@
/**
* @file Box.cppm
* @brief Module file for the Box struct of the Screen module
*/
module;
#include <ftxui/screen/box.hpp>
export module ftxui.screen.Box;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Box;
}

View File

@@ -0,0 +1,22 @@
/**
* @file Color.cppm
* @brief Module file for the Color class of the Screen module
*/
module;
#include <ftxui/screen/color.hpp>
export module ftxui.screen.Color;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Color;
inline namespace literals {
using ftxui::literals::operator""_rgb;
}
}

View File

@@ -0,0 +1,20 @@
/**
* @file ColorInfo.cppm
* @brief Module file for the ColorInfo struct of the Screen module
*/
module;
#include <ftxui/screen/color_info.hpp>
export module ftxui.screen.ColorInfo;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ColorInfo;
using ftxui::GetColorInfo;
}

View File

@@ -0,0 +1,19 @@
/**
* @file Box.cppm
* @brief Module file for the deprecated parts of the Screen module
*/
module;
#include <ftxui/screen/deprecated.hpp>
export module ftxui.screen.Deprecated;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::wchar_width;
using ftxui::wstring_width;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Image.cppm
* @brief Module file for the Image class of the Screen module
*/
module;
#include <ftxui/screen/image.hpp>
export module ftxui.screen.Image;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Image;
}

View File

@@ -0,0 +1,18 @@
/**
* @file Pixel.cppm
* @brief Module file for the Pixel struct of the Screen module
*/
module;
#include <ftxui/screen/pixel.hpp>
export module ftxui.screen.Pixel;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Pixel;
}

View File

@@ -0,0 +1,24 @@
/**
* @file Screen.cppm
* @brief Module file for the Screen class of the Screen module
*/
module;
#include <ftxui/screen/screen.hpp>
export module ftxui.screen.Screen;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
namespace Dimension {
using ftxui::Dimension::Fixed;
using ftxui::Dimension::Full;
}
using ftxui::Image;
using ftxui::Screen;
}

View File

@@ -0,0 +1,22 @@
/**
* @file String.cppm
* @brief Module file for string functions of the Screen module
*/
module;
#include <ftxui/screen/string.hpp>
export module ftxui.screen.String;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::to_string;
using ftxui::to_wstring;
using ftxui::string_width;
using ftxui::Utf8ToGlyphs;
using ftxui::CellToGlyphIndex;
}

View File

@@ -0,0 +1,26 @@
/**
* @file Terminal.cppm
* @brief Module file for the Terminal namespace of the Screen module
*/
module;
#include <ftxui/screen/terminal.hpp>
export module ftxui.screen.Terminal;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::Dimensions;
namespace Terminal {
using ftxui::Terminal::Size;
using ftxui::Terminal::SetFallbackSize;
using ftxui::Terminal::Color;
using ftxui::Terminal::ColorSupport;
using ftxui::Terminal::SetColorSupport;
}
}

9
src/ftxui/util.cppm Normal file
View File

@@ -0,0 +1,9 @@
/**
* @file util.cppm
* @brief Module file for FTXUI utility operations.
*/
export module ftxui.util;
export import ftxui.util.AutoReset;
export import ftxui.util.Ref;

View File

@@ -0,0 +1,18 @@
/**
* @file AutoReset.cppm
* @brief Module file for the AutoReset class of the Util module
*/
module;
#include <ftxui/util/autoreset.hpp>
export module ftxui.util.AutoReset;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::AutoReset;
}

22
src/ftxui/util/Ref.cppm Normal file
View File

@@ -0,0 +1,22 @@
/**
* @file Ref.cppm
* @brief Module file for the Ref classes of the Util module
*/
module;
#include <ftxui/util/ref.hpp>
export module ftxui.util.Ref;
/**
* @namespace ftxui
* @brief The FTXUI ftxui:: namespace
*/
export namespace ftxui {
using ftxui::ConstRef;
using ftxui::Ref;
using ftxui::StringRef;
using ftxui::ConstStringRef;
using ftxui::ConstStringListRef;
}

View File

@@ -0,0 +1,29 @@
#!/bin/bash
# Generate ./examples_modules from ./examples to using C++20 modules instead of
# #includes for ftxui.
# This is useful for testing ftxui with modules. This ensures we don't forget
# to update the FTXUI modules when adding new features to FTXUI.
echo "Generating ./examples_modules"
rm -rf ./examples_modules
cp -r ./examples ./examples_modules
for file in ./examples_modules/**/*.cpp; do
echo "Generating $file"
sed -i '/#include "ftxui/d' "$file"
sed -i '/#include <ftxui/d' "$file"
sed -i '1i\import ftxui.component;' "$file"
sed -i '2i\import ftxui.dom;' "$file"
sed -i '3i\import ftxui.screen;' "$file"
sed -i '4i\import ftxui.util;' "$file"
sed -i '5i\\' "$file"
done
# Modify the CMakeLists.txt file to link against ftxui-modules
sed -i 's/${DIRECTORY_LIB}/ftxui-modules/g' ./examples_modules/CMakeLists.txt
sed -i 's/ftxui_example_/ftxui_modules_example_/g' ./examples_modules/CMakeLists.txt

18
tools/test_bazel.sh Executable file
View File

@@ -0,0 +1,18 @@
# This script tests the project with different versions of Bazel and compilers
# locally. This avoids waiting on the CI to run the tests.
for ver in \
"6.0.0" \
"7.0.0" \
"8.0.0"
do
for cc in \
"gcc" \
"clang"
do
echo "=== Testing with Bazel ${ver} with ${cc} ==="
USE_BAZEL_VERSION=${ver} CC=${cc} bazel clean --expunge
USE_BAZEL_VERSION=${ver} CC=${cc} bazel build //...
USE_BAZEL_VERSION=${ver} CC=${cc} bazel test //...
done
done