diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cdecf41d..0da4ce5d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -154,3 +154,188 @@ jobs: flags: ${{ runner.os }} name: ${{ runner.os }}-coverage 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 diff --git a/.gitignore b/.gitignore index a3820005..40a2b7c4 100644 --- a/.gitignore +++ b/.gitignore @@ -62,8 +62,10 @@ out/ !include/ftxui/**/*.cpp # src directory: +!src/ftxui/*.cppm !src/ftxui/**/*.hpp !src/ftxui/**/*.cpp +!src/ftxui/**/*.cppm # tools directory: !tools/**/*.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f5e22fa..fb63ef34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ Changelog ========= +Development +----------- + +### 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 ------------ diff --git a/CMakeLists.txt b/CMakeLists.txt index 907d99b2..5d05d70b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,19 @@ -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 LANGUAGES CXX @@ -6,15 +21,6 @@ project(ftxui 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 \ 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_install.cmake) include(cmake/ftxui_package.cmake) +include(cmake/ftxui_modules.cmake) -add_subdirectory(examples) 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() diff --git a/README.md b/README.md index 3918c09d..191024d3 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ 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 drawing. [Demo](https://arthursonzogni.github.io/FTXUI/examples/?file=component/canvas_animated) * No dependencies + * Module support * **Cross platform**: Linux/MacOS (main target), WebAssembly, Windows (Thanks to contributors!). * 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. @@ -348,6 +349,7 @@ Feel free to add your projects here: - [terminal-rain](https://github.com/Oakamoore/terminal-rain) - [keywords](https://github.com/Oakamoore/keywords) ([Play web version :heart:](https://oakamoore.itch.io/keywords)) - [FTB - tertminal file browser](https://github.com/Cyxuan0311/FTB) +- [openJuice](https://github.com/mikomikotaishi/openJuice) ### [cpp-best-practices/game_jam](https://github.com/cpp-best-practices/game_jam) @@ -396,6 +398,8 @@ If you choose to build and link FTXUI yourself, `ftxui-component` must be first 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 diff --git a/cmake/ftxui_message.cmake b/cmake/ftxui_message.cmake index 49cc4e82..5f25f1ac 100644 --- a/cmake/ftxui_message.cmake +++ b/cmake/ftxui_message.cmake @@ -5,13 +5,14 @@ function(ftxui_message msg) endfunction() 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_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_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_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("└─────────────────────────────────────") diff --git a/cmake/ftxui_modules.cmake b/cmake/ftxui_modules.cmake new file mode 100644 index 00000000..beb14f53 --- /dev/null +++ b/cmake/ftxui_modules.cmake @@ -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() diff --git a/examples/component/button.cpp b/examples/component/button.cpp index 63032f42..dda9dd3e 100644 --- a/examples/component/button.cpp +++ b/examples/component/button.cpp @@ -1,9 +1,65 @@ -#include "ftxui/component/component.hpp" -#include "ftxui/component/screen_interactive.hpp" +// Copyright 2020 Arthur Sonzogni. All rights reserved. +// Use of this source code is governed by the MIT license that can be found in +// the LICENSE file. +#include // for shared_ptr, __shared_ptr_access +#include // for operator+, to_string -int main(){ - auto screen = ftxui::ScreenInteractive::Fullscreen(); - auto testComponent = ftxui::Renderer([](){return ftxui::text("test Component");}); - screen.Loop(testComponent); - return 0; +#include "ftxui/component/captured_mouse.hpp" // for ftxui +#include "ftxui/component/component.hpp" // for Button, Horizontal, Renderer +#include "ftxui/component/component_base.hpp" // for ComponentBase +#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive +#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; } diff --git a/src/ftxui/component.cppm b/src/ftxui/component.cppm new file mode 100644 index 00000000..04d1d1b5 --- /dev/null +++ b/src/ftxui/component.cppm @@ -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; diff --git a/src/ftxui/component/Animation.cppm b/src/ftxui/component/Animation.cppm new file mode 100644 index 00000000..2364393b --- /dev/null +++ b/src/ftxui/component/Animation.cppm @@ -0,0 +1,66 @@ +/** + * @file Animation.cppm + * @brief Module file for the Animation namespace of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/CapturedMouse.cppm b/src/ftxui/component/CapturedMouse.cppm new file mode 100644 index 00000000..3138b54c --- /dev/null +++ b/src/ftxui/component/CapturedMouse.cppm @@ -0,0 +1,18 @@ +/** + * @file CapturedMouse.cppm + * @brief Module file for the CapturedMouseInterface class of the Component module + */ + +module; + +#include + +export module ftxui.component.CapturedMouse; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::CapturedMouseInterface; +} diff --git a/src/ftxui/component/Component.cppm b/src/ftxui/component/Component.cppm new file mode 100644 index 00000000..1d3a6fec --- /dev/null +++ b/src/ftxui/component/Component.cppm @@ -0,0 +1,61 @@ +/** + * @file Component.cppm + * @brief Module file for the Component classes of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/ComponentBase.cppm b/src/ftxui/component/ComponentBase.cppm new file mode 100644 index 00000000..ec79c930 --- /dev/null +++ b/src/ftxui/component/ComponentBase.cppm @@ -0,0 +1,28 @@ +/** + * @file ComponentBase.cppm + * @brief Module file for the ComponentBase class of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/ComponentOptions.cppm b/src/ftxui/component/ComponentOptions.cppm new file mode 100644 index 00000000..8ac022ad --- /dev/null +++ b/src/ftxui/component/ComponentOptions.cppm @@ -0,0 +1,33 @@ +/** + * @file ComponentOptions.cppm + * @brief Module file for options for the Component class of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/Event.cppm b/src/ftxui/component/Event.cppm new file mode 100644 index 00000000..b148c9da --- /dev/null +++ b/src/ftxui/component/Event.cppm @@ -0,0 +1,21 @@ +/** + * @file Event.cppm + * @brief Module file for the Event struct of the Component module + */ + +module; + +#include + +export module ftxui.component.Event; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::ScreenInteractive; + using ftxui::ComponentBase; + + using ftxui::Event; +} diff --git a/src/ftxui/component/Loop.cppm b/src/ftxui/component/Loop.cppm new file mode 100644 index 00000000..427a1469 --- /dev/null +++ b/src/ftxui/component/Loop.cppm @@ -0,0 +1,22 @@ +/** + * @file Loop.cppm + * @brief Module file for the Loop class of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/Mouse.cppm b/src/ftxui/component/Mouse.cppm new file mode 100644 index 00000000..533c03d0 --- /dev/null +++ b/src/ftxui/component/Mouse.cppm @@ -0,0 +1,18 @@ +/** + * @file Mouse.cppm + * @brief Module file for the Mouse struct of the Component module + */ + +module; + +#include + +export module ftxui.component.Mouse; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Mouse; +} diff --git a/src/ftxui/component/Receiver.cppm b/src/ftxui/component/Receiver.cppm new file mode 100644 index 00000000..8071fba6 --- /dev/null +++ b/src/ftxui/component/Receiver.cppm @@ -0,0 +1,22 @@ +/** + * @file Receiver.cppm + * @brief Module file for the Receiver class of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/ScreenInteractive.cppm b/src/ftxui/component/ScreenInteractive.cppm new file mode 100644 index 00000000..2d33cb0b --- /dev/null +++ b/src/ftxui/component/ScreenInteractive.cppm @@ -0,0 +1,25 @@ +/** + * @file ScreenInteractive.cppm + * @brief Module file for the ScreenInteractive class of the Component module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/component/Task.cppm b/src/ftxui/component/Task.cppm new file mode 100644 index 00000000..7cdafd0a --- /dev/null +++ b/src/ftxui/component/Task.cppm @@ -0,0 +1,20 @@ +/** + * @file Task.cppm + * @brief Module file for the Task class of the Component module + */ + +module; + +#include + +export module ftxui.component.Task; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::AnimationTask; + using ftxui::Closure; + using ftxui::Task; +} diff --git a/src/ftxui/dom.cppm b/src/ftxui/dom.cppm new file mode 100644 index 00000000..db73c0dc --- /dev/null +++ b/src/ftxui/dom.cppm @@ -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; diff --git a/src/ftxui/dom/Canvas.cppm b/src/ftxui/dom/Canvas.cppm new file mode 100644 index 00000000..48a381c9 --- /dev/null +++ b/src/ftxui/dom/Canvas.cppm @@ -0,0 +1,18 @@ +/** + * @file Canvas.cppm + * @brief Module file for the Canvas struct of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Canvas; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Canvas; +} diff --git a/src/ftxui/dom/Deprecated.cppm b/src/ftxui/dom/Deprecated.cppm new file mode 100644 index 00000000..f0c5b6d8 --- /dev/null +++ b/src/ftxui/dom/Deprecated.cppm @@ -0,0 +1,20 @@ +/** + * @file Deprecated.cppm + * @brief Module file for deprecated parts of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Deprecated; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::text; + using ftxui::vtext; + using ftxui::paragraph; +} diff --git a/src/ftxui/dom/Direction.cppm b/src/ftxui/dom/Direction.cppm new file mode 100644 index 00000000..f7ff1743 --- /dev/null +++ b/src/ftxui/dom/Direction.cppm @@ -0,0 +1,18 @@ +/** + * @file Direction.cppm + * @brief Module file for the Direction enum of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Direction; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Direction; +} diff --git a/src/ftxui/dom/Elements.cppm b/src/ftxui/dom/Elements.cppm new file mode 100644 index 00000000..438d767e --- /dev/null +++ b/src/ftxui/dom/Elements.cppm @@ -0,0 +1,130 @@ +/** + * @file Canvas.cppm + * @brief Module file for the Element classes and functions of the Dom module + */ + +module; + +#include + +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; + } +} diff --git a/src/ftxui/dom/FlexboxConfig.cppm b/src/ftxui/dom/FlexboxConfig.cppm new file mode 100644 index 00000000..f346405f --- /dev/null +++ b/src/ftxui/dom/FlexboxConfig.cppm @@ -0,0 +1,18 @@ +/** + * @file FlexboxConfig.cppm + * @brief Module file for the FlexboxConfig struct of the Dom module + */ + +module; + +#include + +export module ftxui.dom.FlexboxConfig; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::FlexboxConfig; +} diff --git a/src/ftxui/dom/LinearGradient.cppm b/src/ftxui/dom/LinearGradient.cppm new file mode 100644 index 00000000..f61b12c4 --- /dev/null +++ b/src/ftxui/dom/LinearGradient.cppm @@ -0,0 +1,18 @@ +/** + * @file LinearGradient.cppm + * @brief Module file for the LinearGradient struct of the Dom module + */ + +module; + +#include + +export module ftxui.dom.LinearGradient; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::LinearGradient; +} diff --git a/src/ftxui/dom/Node.cppm b/src/ftxui/dom/Node.cppm new file mode 100644 index 00000000..4fcf86b0 --- /dev/null +++ b/src/ftxui/dom/Node.cppm @@ -0,0 +1,25 @@ +/** + * @file Node.cppm + * @brief Module file for the Node class of the Dom module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/dom/Requirement.cppm b/src/ftxui/dom/Requirement.cppm new file mode 100644 index 00000000..9a51fcf1 --- /dev/null +++ b/src/ftxui/dom/Requirement.cppm @@ -0,0 +1,18 @@ +/** + * @file Requirement.cppm + * @brief Module file for the Requirement struct of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Requirement; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Requirement; +} diff --git a/src/ftxui/dom/Selection.cppm b/src/ftxui/dom/Selection.cppm new file mode 100644 index 00000000..d305720b --- /dev/null +++ b/src/ftxui/dom/Selection.cppm @@ -0,0 +1,18 @@ +/** + * @file Selection.cppm + * @brief Module file for the Selection class of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Selection; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Selection; +} diff --git a/src/ftxui/dom/Table.cppm b/src/ftxui/dom/Table.cppm new file mode 100644 index 00000000..c9d30670 --- /dev/null +++ b/src/ftxui/dom/Table.cppm @@ -0,0 +1,19 @@ +/** + * @file Table.cppm + * @brief Module file for the Table class of the Dom module + */ + +module; + +#include + +export module ftxui.dom.Table; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Table; + using ftxui::TableSelection; +} diff --git a/src/ftxui/ftxui.cppm b/src/ftxui/ftxui.cppm new file mode 100644 index 00000000..effab708 --- /dev/null +++ b/src/ftxui/ftxui.cppm @@ -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; diff --git a/src/ftxui/screen.cppm b/src/ftxui/screen.cppm new file mode 100644 index 00000000..f0d529ca --- /dev/null +++ b/src/ftxui/screen.cppm @@ -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; diff --git a/src/ftxui/screen/Box.cppm b/src/ftxui/screen/Box.cppm new file mode 100644 index 00000000..0e249b64 --- /dev/null +++ b/src/ftxui/screen/Box.cppm @@ -0,0 +1,18 @@ +/** + * @file Box.cppm + * @brief Module file for the Box struct of the Screen module + */ + +module; + +#include + +export module ftxui.screen.Box; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Box; +} diff --git a/src/ftxui/screen/Color.cppm b/src/ftxui/screen/Color.cppm new file mode 100644 index 00000000..31c7d87c --- /dev/null +++ b/src/ftxui/screen/Color.cppm @@ -0,0 +1,22 @@ +/** + * @file Color.cppm + * @brief Module file for the Color class of the Screen module + */ + +module; + +#include + +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; + } +} diff --git a/src/ftxui/screen/ColorInfo.cppm b/src/ftxui/screen/ColorInfo.cppm new file mode 100644 index 00000000..96f6145d --- /dev/null +++ b/src/ftxui/screen/ColorInfo.cppm @@ -0,0 +1,20 @@ +/** + * @file ColorInfo.cppm + * @brief Module file for the ColorInfo struct of the Screen module + */ + +module; + +#include + +export module ftxui.screen.ColorInfo; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::ColorInfo; + + using ftxui::GetColorInfo; +} diff --git a/src/ftxui/screen/Deprecated.cppm b/src/ftxui/screen/Deprecated.cppm new file mode 100644 index 00000000..e325731e --- /dev/null +++ b/src/ftxui/screen/Deprecated.cppm @@ -0,0 +1,19 @@ +/** + * @file Box.cppm + * @brief Module file for the deprecated parts of the Screen module + */ + +module; + +#include + +export module ftxui.screen.Deprecated; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::wchar_width; + using ftxui::wstring_width; +} diff --git a/src/ftxui/screen/Image.cppm b/src/ftxui/screen/Image.cppm new file mode 100644 index 00000000..7f432b49 --- /dev/null +++ b/src/ftxui/screen/Image.cppm @@ -0,0 +1,18 @@ +/** + * @file Image.cppm + * @brief Module file for the Image class of the Screen module + */ + +module; + +#include + +export module ftxui.screen.Image; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Image; +} diff --git a/src/ftxui/screen/Pixel.cppm b/src/ftxui/screen/Pixel.cppm new file mode 100644 index 00000000..a2d4ef90 --- /dev/null +++ b/src/ftxui/screen/Pixel.cppm @@ -0,0 +1,18 @@ +/** + * @file Pixel.cppm + * @brief Module file for the Pixel struct of the Screen module + */ + +module; + +#include + +export module ftxui.screen.Pixel; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::Pixel; +} diff --git a/src/ftxui/screen/Screen.cppm b/src/ftxui/screen/Screen.cppm new file mode 100644 index 00000000..eb549e5f --- /dev/null +++ b/src/ftxui/screen/Screen.cppm @@ -0,0 +1,24 @@ +/** + * @file Screen.cppm + * @brief Module file for the Screen class of the Screen module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/screen/String.cppm b/src/ftxui/screen/String.cppm new file mode 100644 index 00000000..035fe94c --- /dev/null +++ b/src/ftxui/screen/String.cppm @@ -0,0 +1,22 @@ +/** + * @file String.cppm + * @brief Module file for string functions of the Screen module + */ + +module; + +#include + +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; +} diff --git a/src/ftxui/screen/Terminal.cppm b/src/ftxui/screen/Terminal.cppm new file mode 100644 index 00000000..557efb7c --- /dev/null +++ b/src/ftxui/screen/Terminal.cppm @@ -0,0 +1,26 @@ +/** + * @file Terminal.cppm + * @brief Module file for the Terminal namespace of the Screen module + */ + +module; + +#include + +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; + } +} diff --git a/src/ftxui/util.cppm b/src/ftxui/util.cppm new file mode 100644 index 00000000..eba3bf20 --- /dev/null +++ b/src/ftxui/util.cppm @@ -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; diff --git a/src/ftxui/util/AutoReset.cppm b/src/ftxui/util/AutoReset.cppm new file mode 100644 index 00000000..05089746 --- /dev/null +++ b/src/ftxui/util/AutoReset.cppm @@ -0,0 +1,18 @@ +/** + * @file AutoReset.cppm + * @brief Module file for the AutoReset class of the Util module + */ + +module; + +#include + +export module ftxui.util.AutoReset; + +/** + * @namespace ftxui + * @brief The FTXUI ftxui:: namespace + */ +export namespace ftxui { + using ftxui::AutoReset; +} diff --git a/src/ftxui/util/Ref.cppm b/src/ftxui/util/Ref.cppm new file mode 100644 index 00000000..a6e19ccb --- /dev/null +++ b/src/ftxui/util/Ref.cppm @@ -0,0 +1,22 @@ +/** + * @file Ref.cppm + * @brief Module file for the Ref classes of the Util module + */ + +module; + +#include + +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; +} diff --git a/tools/generate_examples_modules.sh b/tools/generate_examples_modules.sh new file mode 100755 index 00000000..aa6a5165 --- /dev/null +++ b/tools/generate_examples_modules.sh @@ -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