From 69928b374e84ce935c6664318b84e03cd95d40d5 Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:49:18 -0400 Subject: [PATCH 01/15] Add modules support --- .gitignore | 6 + CMakeLists.txt | 7 + modules/CMakeLists.txt | 1 + modules/ftxui/CMakeLists.txt | 48 +++++++ modules/ftxui/component.cppm | 18 +++ modules/ftxui/component/Animation.cppm | 66 +++++++++ modules/ftxui/component/CapturedMouse.cppm | 18 +++ modules/ftxui/component/Component.cppm | 61 ++++++++ modules/ftxui/component/ComponentBase.cppm | 28 ++++ modules/ftxui/component/ComponentOptions.cppm | 33 +++++ modules/ftxui/component/Event.cppm | 21 +++ modules/ftxui/component/Loop.cppm | 22 +++ modules/ftxui/component/Mouse.cppm | 18 +++ modules/ftxui/component/Receiver.cppm | 22 +++ .../ftxui/component/ScreenInteractive.cppm | 25 ++++ modules/ftxui/component/Task.cppm | 20 +++ modules/ftxui/dom.cppm | 17 +++ modules/ftxui/dom/Canvas.cppm | 18 +++ modules/ftxui/dom/Deprecated.cppm | 20 +++ modules/ftxui/dom/Direction.cppm | 18 +++ modules/ftxui/dom/Elements.cppm | 130 ++++++++++++++++++ modules/ftxui/dom/FlexboxConfig.cppm | 18 +++ modules/ftxui/dom/LinearGradient.cppm | 18 +++ modules/ftxui/dom/Node.cppm | 25 ++++ modules/ftxui/dom/Requirement.cppm | 18 +++ modules/ftxui/dom/Selection.cppm | 18 +++ modules/ftxui/dom/Table.cppm | 19 +++ modules/ftxui/screen.cppm | 16 +++ modules/ftxui/screen/Box.cppm | 18 +++ modules/ftxui/screen/Color.cppm | 22 +++ modules/ftxui/screen/ColorInfo.cppm | 20 +++ modules/ftxui/screen/Deprecated.cppm | 19 +++ modules/ftxui/screen/Image.cppm | 18 +++ modules/ftxui/screen/Pixel.cppm | 18 +++ modules/ftxui/screen/Screen.cppm | 24 ++++ modules/ftxui/screen/String.cppm | 22 +++ modules/ftxui/screen/Terminal.cppm | 26 ++++ modules/ftxui/util.cppm | 9 ++ modules/ftxui/util/AutoReset.cppm | 18 +++ modules/ftxui/util/Ref.cppm | 22 +++ 40 files changed, 985 insertions(+) create mode 100644 modules/CMakeLists.txt create mode 100644 modules/ftxui/CMakeLists.txt create mode 100644 modules/ftxui/component.cppm create mode 100644 modules/ftxui/component/Animation.cppm create mode 100644 modules/ftxui/component/CapturedMouse.cppm create mode 100644 modules/ftxui/component/Component.cppm create mode 100644 modules/ftxui/component/ComponentBase.cppm create mode 100644 modules/ftxui/component/ComponentOptions.cppm create mode 100644 modules/ftxui/component/Event.cppm create mode 100644 modules/ftxui/component/Loop.cppm create mode 100644 modules/ftxui/component/Mouse.cppm create mode 100644 modules/ftxui/component/Receiver.cppm create mode 100644 modules/ftxui/component/ScreenInteractive.cppm create mode 100644 modules/ftxui/component/Task.cppm create mode 100644 modules/ftxui/dom.cppm create mode 100644 modules/ftxui/dom/Canvas.cppm create mode 100644 modules/ftxui/dom/Deprecated.cppm create mode 100644 modules/ftxui/dom/Direction.cppm create mode 100644 modules/ftxui/dom/Elements.cppm create mode 100644 modules/ftxui/dom/FlexboxConfig.cppm create mode 100644 modules/ftxui/dom/LinearGradient.cppm create mode 100644 modules/ftxui/dom/Node.cppm create mode 100644 modules/ftxui/dom/Requirement.cppm create mode 100644 modules/ftxui/dom/Selection.cppm create mode 100644 modules/ftxui/dom/Table.cppm create mode 100644 modules/ftxui/screen.cppm create mode 100644 modules/ftxui/screen/Box.cppm create mode 100644 modules/ftxui/screen/Color.cppm create mode 100644 modules/ftxui/screen/ColorInfo.cppm create mode 100644 modules/ftxui/screen/Deprecated.cppm create mode 100644 modules/ftxui/screen/Image.cppm create mode 100644 modules/ftxui/screen/Pixel.cppm create mode 100644 modules/ftxui/screen/Screen.cppm create mode 100644 modules/ftxui/screen/String.cppm create mode 100644 modules/ftxui/screen/Terminal.cppm create mode 100644 modules/ftxui/util.cppm create mode 100644 modules/ftxui/util/AutoReset.cppm create mode 100644 modules/ftxui/util/Ref.cppm diff --git a/.gitignore b/.gitignore index 4d12e758..71797e17 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,12 @@ out/ !src/ftxui/**/*.hpp !src/ftxui/**/*.cpp +# modules directory: +!modules/*.txt +!modules/ftxui/*.cppm +!modules/ftxui/*.txt +!modules/ftxui/**/*.cppm + # tools directory: !tools/**/*.sh !tools/**/*.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8816a582..9a73f6a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,3 +179,10 @@ include(cmake/ftxui_package.cmake) add_subdirectory(examples) add_subdirectory(doc) + +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + message(STATUS "Building C++ modules (CMake ${CMAKE_VERSION} supports modules)") + add_subdirectory(modules) +else() + message(STATUS "Skipping C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})") +endif() \ No newline at end of file diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt new file mode 100644 index 00000000..b12821f3 --- /dev/null +++ b/modules/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(ftxui) \ No newline at end of file diff --git a/modules/ftxui/CMakeLists.txt b/modules/ftxui/CMakeLists.txt new file mode 100644 index 00000000..1449f0aa --- /dev/null +++ b/modules/ftxui/CMakeLists.txt @@ -0,0 +1,48 @@ +file(GLOB_RECURSE FTXUI_MODULES *.cppm) + +add_library(ftxui_modules) + +cmake_minimum_required(VERSION 3.28) + +if(NOT COMMAND configure_cpp_module_target) + function(configure_cpp_module_target target) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + target_sources(${target} PUBLIC FILE_SET CXX_MODULES FILES ${FTXUI_MODULES}) + else() + message(WARNING "C++ modules require CMake 3.28+. Using standard compilation.") + target_sources(${target} PRIVATE ${FTXUI_MODULES}) + endif() + endfunction() +endif() + +configure_cpp_module_target(ftxui_modules) + +target_link_libraries(ftxui_modules + PUBLIC + ftxui::screen + ftxui::dom + ftxui::component +) + +target_include_directories(ftxui_modules + PRIVATE + ${ftxui_SOURCE_DIR}/include +) + +set_target_properties(ftxui_modules PROPERTIES + CXX_STANDARD 23 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF + CXX_MODULE_DYNDEP OFF +) + +add_library(ftxui::modules ALIAS ftxui_modules) + +if(FTXUI_ENABLE_INSTALL) + install(TARGETS ftxui_modules + EXPORT ftxui-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules + ) +endif() \ No newline at end of file diff --git a/modules/ftxui/component.cppm b/modules/ftxui/component.cppm new file mode 100644 index 00000000..2d69a3e3 --- /dev/null +++ b/modules/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; \ No newline at end of file diff --git a/modules/ftxui/component/Animation.cppm b/modules/ftxui/component/Animation.cppm new file mode 100644 index 00000000..e624196b --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/CapturedMouse.cppm b/modules/ftxui/component/CapturedMouse.cppm new file mode 100644 index 00000000..fbff999f --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Component.cppm b/modules/ftxui/component/Component.cppm new file mode 100644 index 00000000..06ae5826 --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/ComponentBase.cppm b/modules/ftxui/component/ComponentBase.cppm new file mode 100644 index 00000000..55d0c62c --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/ComponentOptions.cppm b/modules/ftxui/component/ComponentOptions.cppm new file mode 100644 index 00000000..fe8877f1 --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Event.cppm b/modules/ftxui/component/Event.cppm new file mode 100644 index 00000000..d6a53d2b --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Loop.cppm b/modules/ftxui/component/Loop.cppm new file mode 100644 index 00000000..ae4caf26 --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Mouse.cppm b/modules/ftxui/component/Mouse.cppm new file mode 100644 index 00000000..086772ab --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Receiver.cppm b/modules/ftxui/component/Receiver.cppm new file mode 100644 index 00000000..69a6eb28 --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/ScreenInteractive.cppm b/modules/ftxui/component/ScreenInteractive.cppm new file mode 100644 index 00000000..61282c63 --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/component/Task.cppm b/modules/ftxui/component/Task.cppm new file mode 100644 index 00000000..359b9ffe --- /dev/null +++ b/modules/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; +} \ No newline at end of file diff --git a/modules/ftxui/dom.cppm b/modules/ftxui/dom.cppm new file mode 100644 index 00000000..db73c0dc --- /dev/null +++ b/modules/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/modules/ftxui/dom/Canvas.cppm b/modules/ftxui/dom/Canvas.cppm new file mode 100644 index 00000000..48a381c9 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Deprecated.cppm b/modules/ftxui/dom/Deprecated.cppm new file mode 100644 index 00000000..f0c5b6d8 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Direction.cppm b/modules/ftxui/dom/Direction.cppm new file mode 100644 index 00000000..f7ff1743 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Elements.cppm b/modules/ftxui/dom/Elements.cppm new file mode 100644 index 00000000..438d767e --- /dev/null +++ b/modules/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/modules/ftxui/dom/FlexboxConfig.cppm b/modules/ftxui/dom/FlexboxConfig.cppm new file mode 100644 index 00000000..f346405f --- /dev/null +++ b/modules/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/modules/ftxui/dom/LinearGradient.cppm b/modules/ftxui/dom/LinearGradient.cppm new file mode 100644 index 00000000..f61b12c4 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Node.cppm b/modules/ftxui/dom/Node.cppm new file mode 100644 index 00000000..4fcf86b0 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Requirement.cppm b/modules/ftxui/dom/Requirement.cppm new file mode 100644 index 00000000..9a51fcf1 --- /dev/null +++ b/modules/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/modules/ftxui/dom/Selection.cppm b/modules/ftxui/dom/Selection.cppm new file mode 100644 index 00000000..d305720b --- /dev/null +++ b/modules/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/modules/ftxui/dom/Table.cppm b/modules/ftxui/dom/Table.cppm new file mode 100644 index 00000000..c9d30670 --- /dev/null +++ b/modules/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/modules/ftxui/screen.cppm b/modules/ftxui/screen.cppm new file mode 100644 index 00000000..d9659f71 --- /dev/null +++ b/modules/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; \ No newline at end of file diff --git a/modules/ftxui/screen/Box.cppm b/modules/ftxui/screen/Box.cppm new file mode 100644 index 00000000..0e249b64 --- /dev/null +++ b/modules/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/modules/ftxui/screen/Color.cppm b/modules/ftxui/screen/Color.cppm new file mode 100644 index 00000000..31c7d87c --- /dev/null +++ b/modules/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/modules/ftxui/screen/ColorInfo.cppm b/modules/ftxui/screen/ColorInfo.cppm new file mode 100644 index 00000000..96f6145d --- /dev/null +++ b/modules/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/modules/ftxui/screen/Deprecated.cppm b/modules/ftxui/screen/Deprecated.cppm new file mode 100644 index 00000000..e325731e --- /dev/null +++ b/modules/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/modules/ftxui/screen/Image.cppm b/modules/ftxui/screen/Image.cppm new file mode 100644 index 00000000..7f432b49 --- /dev/null +++ b/modules/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/modules/ftxui/screen/Pixel.cppm b/modules/ftxui/screen/Pixel.cppm new file mode 100644 index 00000000..a2d4ef90 --- /dev/null +++ b/modules/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/modules/ftxui/screen/Screen.cppm b/modules/ftxui/screen/Screen.cppm new file mode 100644 index 00000000..eb549e5f --- /dev/null +++ b/modules/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/modules/ftxui/screen/String.cppm b/modules/ftxui/screen/String.cppm new file mode 100644 index 00000000..035fe94c --- /dev/null +++ b/modules/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/modules/ftxui/screen/Terminal.cppm b/modules/ftxui/screen/Terminal.cppm new file mode 100644 index 00000000..557efb7c --- /dev/null +++ b/modules/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/modules/ftxui/util.cppm b/modules/ftxui/util.cppm new file mode 100644 index 00000000..c55daa44 --- /dev/null +++ b/modules/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; \ No newline at end of file diff --git a/modules/ftxui/util/AutoReset.cppm b/modules/ftxui/util/AutoReset.cppm new file mode 100644 index 00000000..05089746 --- /dev/null +++ b/modules/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/modules/ftxui/util/Ref.cppm b/modules/ftxui/util/Ref.cppm new file mode 100644 index 00000000..a6e19ccb --- /dev/null +++ b/modules/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; +} From 730ebeed1d2c93a4df802224036d70ad76e033dc Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:59:58 -0400 Subject: [PATCH 02/15] Add my own project (using FTXUI modules) for an example --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 03c52e2f..a0c38c87 100644 --- a/README.md +++ b/README.md @@ -348,6 +348,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) From 0d50fa25fe74241ebe7868d66f389526e98d82c2 Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:09:35 -0400 Subject: [PATCH 03/15] I assume the version produced by CMake was supposed to be bumped up to 6.0.0, fixing this --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a73f6a4..53419436 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.12) project(ftxui LANGUAGES CXX - VERSION 5.0.0 + VERSION 6.0.0 DESCRIPTION "C++ Functional Terminal User Interface." ) From f87b6a4d12c1f8c4a3a982756e915b63c0883c73 Mon Sep 17 00:00:00 2001 From: Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Fri, 28 Mar 2025 03:54:25 +0000 Subject: [PATCH 04/15] Update CMakeLists.txt Directly go to `modules/ftxui` --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53419436..6e4d36a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,7 +182,7 @@ add_subdirectory(doc) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) message(STATUS "Building C++ modules (CMake ${CMAKE_VERSION} supports modules)") - add_subdirectory(modules) + add_subdirectory(modules/ftxui) else() message(STATUS "Skipping C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})") -endif() \ No newline at end of file +endif() From 5f5bc9019dc3858eb1b1136ca81160350a32570b Mon Sep 17 00:00:00 2001 From: Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Fri, 28 Mar 2025 03:54:48 +0000 Subject: [PATCH 05/15] Delete modules/CMakeLists.txt No longer needed --- modules/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 modules/CMakeLists.txt diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt deleted file mode 100644 index b12821f3..00000000 --- a/modules/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(ftxui) \ No newline at end of file From e57c275512eb764779c4d8f2eda4f07b1f98ed06 Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:28:05 -0400 Subject: [PATCH 06/15] Make modules opt-in (for pre-C++20 builds not to break) --- CMakeLists.txt | 16 +++++++++++----- README.md | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec44738e..2fbe694d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,9 +180,15 @@ include(cmake/ftxui_package.cmake) add_subdirectory(examples) add_subdirectory(doc) -if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) - message(STATUS "Building C++ modules (CMake ${CMAKE_VERSION} supports modules)") - add_subdirectory(modules/ftxui) +option(FTXUI_BUILD_MODULES "Build C++ modules support" OFF) + +if(FTXUI_BUILD_MODULES) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + message(STATUS "Building C++ modules (CMake ${CMAKE_VERSION} supports modules)") + add_subdirectory(modules/ftxui) + else() + message(STATUS "Skipping C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})") + endif() else() - message(STATUS "Skipping C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})") -endif() + message(STATUS "C++ modules support is disabled. Enable with -DFTXUI_BUILD_MODULES=ON") +endif() \ No newline at end of file diff --git a/README.md b/README.md index 96e26fcb..10a478b4 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), vcpkg, pkgbuild, conan. @@ -396,6 +397,7 @@ 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 From 571f6dcdcf14f1bbb44d0fd826d8e195c8312730 Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Sat, 29 Mar 2025 12:26:07 -0400 Subject: [PATCH 07/15] Trailing newline --- CMakeLists.txt | 2 +- modules/ftxui/CMakeLists.txt | 2 +- modules/ftxui/component.cppm | 2 +- modules/ftxui/component/Animation.cppm | 2 +- modules/ftxui/component/CapturedMouse.cppm | 2 +- modules/ftxui/component/Component.cppm | 2 +- modules/ftxui/component/ComponentBase.cppm | 2 +- modules/ftxui/component/ComponentOptions.cppm | 2 +- modules/ftxui/component/Event.cppm | 2 +- modules/ftxui/component/Loop.cppm | 2 +- modules/ftxui/component/Mouse.cppm | 2 +- modules/ftxui/component/Receiver.cppm | 2 +- modules/ftxui/component/ScreenInteractive.cppm | 2 +- modules/ftxui/component/Task.cppm | 2 +- modules/ftxui/screen.cppm | 2 +- modules/ftxui/util.cppm | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fbe694d..b17da422 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,4 +191,4 @@ if(FTXUI_BUILD_MODULES) endif() else() message(STATUS "C++ modules support is disabled. Enable with -DFTXUI_BUILD_MODULES=ON") -endif() \ No newline at end of file +endif() diff --git a/modules/ftxui/CMakeLists.txt b/modules/ftxui/CMakeLists.txt index 1449f0aa..7ac492c4 100644 --- a/modules/ftxui/CMakeLists.txt +++ b/modules/ftxui/CMakeLists.txt @@ -45,4 +45,4 @@ if(FTXUI_ENABLE_INSTALL) ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules ) -endif() \ No newline at end of file +endif() diff --git a/modules/ftxui/component.cppm b/modules/ftxui/component.cppm index 2d69a3e3..04d1d1b5 100644 --- a/modules/ftxui/component.cppm +++ b/modules/ftxui/component.cppm @@ -15,4 +15,4 @@ 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; \ No newline at end of file +export import ftxui.component.Task; diff --git a/modules/ftxui/component/Animation.cppm b/modules/ftxui/component/Animation.cppm index e624196b..2364393b 100644 --- a/modules/ftxui/component/Animation.cppm +++ b/modules/ftxui/component/Animation.cppm @@ -63,4 +63,4 @@ export namespace ftxui::animation { } using ftxui::animation::Animator; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/CapturedMouse.cppm b/modules/ftxui/component/CapturedMouse.cppm index fbff999f..3138b54c 100644 --- a/modules/ftxui/component/CapturedMouse.cppm +++ b/modules/ftxui/component/CapturedMouse.cppm @@ -15,4 +15,4 @@ export module ftxui.component.CapturedMouse; */ export namespace ftxui { using ftxui::CapturedMouseInterface; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Component.cppm b/modules/ftxui/component/Component.cppm index 06ae5826..1d3a6fec 100644 --- a/modules/ftxui/component/Component.cppm +++ b/modules/ftxui/component/Component.cppm @@ -58,4 +58,4 @@ export namespace ftxui { using ftxui::Collapsible; using ftxui::Hoverable; using ftxui::Window; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/ComponentBase.cppm b/modules/ftxui/component/ComponentBase.cppm index 55d0c62c..ec79c930 100644 --- a/modules/ftxui/component/ComponentBase.cppm +++ b/modules/ftxui/component/ComponentBase.cppm @@ -25,4 +25,4 @@ export namespace ftxui { using ftxui::ComponentBase; using ftxui::Component; using ftxui::Components; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/ComponentOptions.cppm b/modules/ftxui/component/ComponentOptions.cppm index fe8877f1..8ac022ad 100644 --- a/modules/ftxui/component/ComponentOptions.cppm +++ b/modules/ftxui/component/ComponentOptions.cppm @@ -30,4 +30,4 @@ export namespace ftxui { using ftxui::WindowRenderState; using ftxui::WindowOptions; using ftxui::DropdownOption; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Event.cppm b/modules/ftxui/component/Event.cppm index d6a53d2b..b148c9da 100644 --- a/modules/ftxui/component/Event.cppm +++ b/modules/ftxui/component/Event.cppm @@ -18,4 +18,4 @@ export namespace ftxui { using ftxui::ComponentBase; using ftxui::Event; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Loop.cppm b/modules/ftxui/component/Loop.cppm index ae4caf26..427a1469 100644 --- a/modules/ftxui/component/Loop.cppm +++ b/modules/ftxui/component/Loop.cppm @@ -19,4 +19,4 @@ export namespace ftxui { using ftxui::ScreenInteractive; using ftxui::Loop; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Mouse.cppm b/modules/ftxui/component/Mouse.cppm index 086772ab..533c03d0 100644 --- a/modules/ftxui/component/Mouse.cppm +++ b/modules/ftxui/component/Mouse.cppm @@ -15,4 +15,4 @@ export module ftxui.component.Mouse; */ export namespace ftxui { using ftxui::Mouse; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Receiver.cppm b/modules/ftxui/component/Receiver.cppm index 69a6eb28..8071fba6 100644 --- a/modules/ftxui/component/Receiver.cppm +++ b/modules/ftxui/component/Receiver.cppm @@ -19,4 +19,4 @@ export namespace ftxui { using ftxui::Sender; using ftxui::Receiver; using ftxui::MakeReceiver; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/ScreenInteractive.cppm b/modules/ftxui/component/ScreenInteractive.cppm index 61282c63..2d33cb0b 100644 --- a/modules/ftxui/component/ScreenInteractive.cppm +++ b/modules/ftxui/component/ScreenInteractive.cppm @@ -22,4 +22,4 @@ export namespace ftxui { using ftxui::Screen; using ftxui::ScreenInteractivePrivate; using ftxui::ScreenInteractive; -} \ No newline at end of file +} diff --git a/modules/ftxui/component/Task.cppm b/modules/ftxui/component/Task.cppm index 359b9ffe..7cdafd0a 100644 --- a/modules/ftxui/component/Task.cppm +++ b/modules/ftxui/component/Task.cppm @@ -17,4 +17,4 @@ export namespace ftxui { using ftxui::AnimationTask; using ftxui::Closure; using ftxui::Task; -} \ No newline at end of file +} diff --git a/modules/ftxui/screen.cppm b/modules/ftxui/screen.cppm index d9659f71..f0d529ca 100644 --- a/modules/ftxui/screen.cppm +++ b/modules/ftxui/screen.cppm @@ -13,4 +13,4 @@ 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; \ No newline at end of file +export import ftxui.screen.Terminal; diff --git a/modules/ftxui/util.cppm b/modules/ftxui/util.cppm index c55daa44..eba3bf20 100644 --- a/modules/ftxui/util.cppm +++ b/modules/ftxui/util.cppm @@ -6,4 +6,4 @@ export module ftxui.util; export import ftxui.util.AutoReset; -export import ftxui.util.Ref; \ No newline at end of file +export import ftxui.util.Ref; From 85c3dc45cad167aa028d4a1491fa36a03f02ce1b Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Wed, 9 Apr 2025 12:35:46 +0200 Subject: [PATCH 08/15] Add Changelog and remove flag. --- CHANGELOG.md | 16 ++++++ CMakeLists.txt | 14 +----- examples/component/button.cpp | 35 ++++++++++--- modules/ftxui/CMakeLists.txt | 95 +++++++++++++++++++++++++---------- 4 files changed, 114 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c8f7af0..80be8a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,22 @@ 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. + ### Component - Bugfix: Fix a crash with ResizeableSplit. See #1023. - Clamp screen size to terminal size. diff --git a/CMakeLists.txt b/CMakeLists.txt index c08b9608..a30de597 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,16 +179,4 @@ include(cmake/ftxui_package.cmake) add_subdirectory(examples) add_subdirectory(doc) - -option(FTXUI_BUILD_MODULES "Build C++ modules support" OFF) - -if(FTXUI_BUILD_MODULES) - if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) - message(STATUS "Building C++ modules (CMake ${CMAKE_VERSION} supports modules)") - add_subdirectory(modules/ftxui) - else() - message(STATUS "Skipping C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})") - endif() -else() - message(STATUS "C++ modules support is disabled. Enable with -DFTXUI_BUILD_MODULES=ON") -endif() +add_subdirectory(modules/ftxui) diff --git a/examples/component/button.cpp b/examples/component/button.cpp index 63032f42..25813849 100644 --- a/examples/component/button.cpp +++ b/examples/component/button.cpp @@ -1,9 +1,30 @@ -#include "ftxui/component/component.hpp" -#include "ftxui/component/screen_interactive.hpp" +#include // for shared_ptr, allocator, __shared_ptr_access + +#include "ftxui/component/component.hpp" // for Renderer, ResizableSplitBottom, ResizableSplitLeft, ResizableSplitRight, ResizableSplitTop +#include "ftxui/component/component_base.hpp" // for ComponentBase +#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive +#include "ftxui/dom/elements.hpp" // for Element, operator|, text, center, border + +using namespace ftxui; + +int main() { + auto screen = ScreenInteractive::Fullscreen(); -int main(){ - auto screen = ftxui::ScreenInteractive::Fullscreen(); - auto testComponent = ftxui::Renderer([](){return ftxui::text("test Component");}); - screen.Loop(testComponent); - return 0; + std::string a = "aa"; + + auto component = Renderer([a] { + + std::vector elements; + + for (auto i = 0; i < 10; ++i) { + elements.push_back(window(text(a), paragraph(a))); + } + + return vbox(elements); + }); + + auto renderer = + Renderer(component, [&] { return component->Render() | border; }); + + screen.Loop(renderer); } diff --git a/modules/ftxui/CMakeLists.txt b/modules/ftxui/CMakeLists.txt index 7ac492c4..28c4f1b5 100644 --- a/modules/ftxui/CMakeLists.txt +++ b/modules/ftxui/CMakeLists.txt @@ -1,21 +1,67 @@ -file(GLOB_RECURSE FTXUI_MODULES *.cppm) - -add_library(ftxui_modules) - -cmake_minimum_required(VERSION 3.28) - -if(NOT COMMAND configure_cpp_module_target) - function(configure_cpp_module_target target) - if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) - target_sources(${target} PUBLIC FILE_SET CXX_MODULES FILES ${FTXUI_MODULES}) - else() - message(WARNING "C++ modules require CMake 3.28+. Using standard compilation.") - target_sources(${target} PRIVATE ${FTXUI_MODULES}) - endif() - endfunction() +# CMake 3.28+ supports the new CMake C++ module system. +if(CMAKE_VERSION VERSION_LESS 3.28) + return() endif() -configure_cpp_module_target(ftxui_modules) +# Not all compilers support the C++ module system yet. +if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") + return() +endif() + +# The list of generators which support scanning sources for C++ modules include: +# - Ninja +# - Ninja Multi-Config +# - Visual Studio 17 2022 +if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND + NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND + CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) + return() +endif() + +cmake_minimum_required(VERSION 3.28) +add_library(ftxui_modules) + +target_sources(ftxui_modules + PUBLIC + FILE_SET CXX_MODULES + FILES + component.cppm + component/Animation.cppm + component/CapturedMouse.cppm + component/Component.cppm + component/ComponentBase.cppm + component/ComponentOptions.cppm + component/Event.cppm + component/Loop.cppm + component/Mouse.cppm + component/Receiver.cppm + component/ScreenInteractive.cppm + component/Task.cppm + dom.cppm + dom/Canvas.cppm + dom/Deprecated.cppm + dom/Direction.cppm + dom/Elements.cppm + dom/FlexboxConfig.cppm + dom/LinearGradient.cppm + dom/Node.cppm + dom/Requirement.cppm + dom/Selection.cppm + dom/Table.cppm + screen.cppm + screen/Box.cppm + screen/Color.cppm + screen/ColorInfo.cppm + screen/Deprecated.cppm + screen/Image.cppm + screen/Pixel.cppm + screen/Screen.cppm + screen/String.cppm + screen/Terminal.cppm + util.cppm + util/AutoReset.cppm + util/Ref.cppm + ) target_link_libraries(ftxui_modules PUBLIC @@ -24,17 +70,14 @@ target_link_libraries(ftxui_modules ftxui::component ) -target_include_directories(ftxui_modules - PRIVATE - ${ftxui_SOURCE_DIR}/include -) +target_compile_features(ftxui_modules PUBLIC cxx_std_20) -set_target_properties(ftxui_modules PROPERTIES - CXX_STANDARD 23 - CXX_STANDARD_REQUIRED ON - CXX_EXTENSIONS OFF - CXX_MODULE_DYNDEP OFF -) +#set_target_properties(ftxui_modules PROPERTIES + #CXX_STANDARD 23 + #CXX_STANDARD_REQUIRED ON + #CXX_EXTENSIONS OFF + #CXX_MODULE_DYNDEP OFF +#) add_library(ftxui::modules ALIAS ftxui_modules) From 0c6756642786bbc8e17b37838e2f16302c4c61cd Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Thu, 10 Apr 2025 14:45:45 +0200 Subject: [PATCH 09/15] Update --- CMakeLists.txt | 3 +- cmake/ftxui_message.cmake | 1 + cmake/ftxui_modules.cmake | 106 ++++++++++++++++++ modules/ftxui/CMakeLists.txt | 91 --------------- {modules => src}/ftxui/component.cppm | 0 .../ftxui/component/Animation.cppm | 0 .../ftxui/component/CapturedMouse.cppm | 0 .../ftxui/component/Component.cppm | 0 .../ftxui/component/ComponentBase.cppm | 0 .../ftxui/component/ComponentOptions.cppm | 0 {modules => src}/ftxui/component/Event.cppm | 0 {modules => src}/ftxui/component/Loop.cppm | 0 {modules => src}/ftxui/component/Mouse.cppm | 0 .../ftxui/component/Receiver.cppm | 0 .../ftxui/component/ScreenInteractive.cppm | 0 {modules => src}/ftxui/component/Task.cppm | 0 {modules => src}/ftxui/dom.cppm | 0 {modules => src}/ftxui/dom/Canvas.cppm | 0 {modules => src}/ftxui/dom/Deprecated.cppm | 0 {modules => src}/ftxui/dom/Direction.cppm | 0 {modules => src}/ftxui/dom/Elements.cppm | 0 {modules => src}/ftxui/dom/FlexboxConfig.cppm | 0 .../ftxui/dom/LinearGradient.cppm | 0 {modules => src}/ftxui/dom/Node.cppm | 0 {modules => src}/ftxui/dom/Requirement.cppm | 0 {modules => src}/ftxui/dom/Selection.cppm | 0 {modules => src}/ftxui/dom/Table.cppm | 0 {modules => src}/ftxui/screen.cppm | 0 {modules => src}/ftxui/screen/Box.cppm | 0 {modules => src}/ftxui/screen/Color.cppm | 0 {modules => src}/ftxui/screen/ColorInfo.cppm | 0 {modules => src}/ftxui/screen/Deprecated.cppm | 0 {modules => src}/ftxui/screen/Image.cppm | 0 {modules => src}/ftxui/screen/Pixel.cppm | 0 {modules => src}/ftxui/screen/Screen.cppm | 0 {modules => src}/ftxui/screen/String.cppm | 0 {modules => src}/ftxui/screen/Terminal.cppm | 0 {modules => src}/ftxui/util.cppm | 0 {modules => src}/ftxui/util/AutoReset.cppm | 0 {modules => src}/ftxui/util/Ref.cppm | 0 40 files changed, 109 insertions(+), 92 deletions(-) create mode 100644 cmake/ftxui_modules.cmake delete mode 100644 modules/ftxui/CMakeLists.txt rename {modules => src}/ftxui/component.cppm (100%) rename {modules => src}/ftxui/component/Animation.cppm (100%) rename {modules => src}/ftxui/component/CapturedMouse.cppm (100%) rename {modules => src}/ftxui/component/Component.cppm (100%) rename {modules => src}/ftxui/component/ComponentBase.cppm (100%) rename {modules => src}/ftxui/component/ComponentOptions.cppm (100%) rename {modules => src}/ftxui/component/Event.cppm (100%) rename {modules => src}/ftxui/component/Loop.cppm (100%) rename {modules => src}/ftxui/component/Mouse.cppm (100%) rename {modules => src}/ftxui/component/Receiver.cppm (100%) rename {modules => src}/ftxui/component/ScreenInteractive.cppm (100%) rename {modules => src}/ftxui/component/Task.cppm (100%) rename {modules => src}/ftxui/dom.cppm (100%) rename {modules => src}/ftxui/dom/Canvas.cppm (100%) rename {modules => src}/ftxui/dom/Deprecated.cppm (100%) rename {modules => src}/ftxui/dom/Direction.cppm (100%) rename {modules => src}/ftxui/dom/Elements.cppm (100%) rename {modules => src}/ftxui/dom/FlexboxConfig.cppm (100%) rename {modules => src}/ftxui/dom/LinearGradient.cppm (100%) rename {modules => src}/ftxui/dom/Node.cppm (100%) rename {modules => src}/ftxui/dom/Requirement.cppm (100%) rename {modules => src}/ftxui/dom/Selection.cppm (100%) rename {modules => src}/ftxui/dom/Table.cppm (100%) rename {modules => src}/ftxui/screen.cppm (100%) rename {modules => src}/ftxui/screen/Box.cppm (100%) rename {modules => src}/ftxui/screen/Color.cppm (100%) rename {modules => src}/ftxui/screen/ColorInfo.cppm (100%) rename {modules => src}/ftxui/screen/Deprecated.cppm (100%) rename {modules => src}/ftxui/screen/Image.cppm (100%) rename {modules => src}/ftxui/screen/Pixel.cppm (100%) rename {modules => src}/ftxui/screen/Screen.cppm (100%) rename {modules => src}/ftxui/screen/String.cppm (100%) rename {modules => src}/ftxui/screen/Terminal.cppm (100%) rename {modules => src}/ftxui/util.cppm (100%) rename {modules => src}/ftxui/util/AutoReset.cppm (100%) rename {modules => src}/ftxui/util/Ref.cppm (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index a30de597..6845d38b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ 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) +option(FTXUI_BUILD_MODULES "Build the C++20 modules" 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,7 +177,7 @@ 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(modules/ftxui) diff --git a/cmake/ftxui_message.cmake b/cmake/ftxui_message.cmake index 49cc4e82..28ca5b4e 100644 --- a/cmake/ftxui_message.cmake +++ b/cmake/ftxui_message.cmake @@ -14,4 +14,5 @@ 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_BUILD_MODULES : ${FTXUI_BUILD_MODULES}") ftxui_message("└─────────────────────────────────────") diff --git a/cmake/ftxui_modules.cmake b/cmake/ftxui_modules.cmake new file mode 100644 index 00000000..5f07998c --- /dev/null +++ b/cmake/ftxui_modules.cmake @@ -0,0 +1,106 @@ +if (NOT FTXUI_BUILD_MODULES) + return() +endif() + +# CMake 3.28+ supports the new CMake C++ module system. +if(CMAKE_VERSION VERSION_LESS 3.28) + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires CMake 3.28 or higher. " + ) + return() +endif() + +# Not all compilers support the C++ module system yet. +if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires a compiler that supports C++20 modules. " + "Currently, only Clang, GCC, and MSVC support this feature." + ) + return() +endif() + +# The list of generators which support scanning sources for C++ modules include: +# - Ninja +# - Ninja Multi-Config +# - Visual Studio 17 2022 +if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND + NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND + CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires a generator that supports C++20 modules. + Please use Ninja or Visual Studio 17 2022 or higher." + ) + return() +endif() + +cmake_minimum_required(VERSION 3.28) +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) + +#set_target_properties(ftxui-modules PROPERTIES + #CXX_STANDARD 23 + #CXX_STANDARD_REQUIRED ON + #CXX_EXTENSIONS OFF + #CXX_MODULE_DYNDEP OFF +#) + +add_library(ftxui::modules ALIAS ftxui-modules) + +if(FTXUI_ENABLE_INSTALL) + install(TARGETS ftxui-modules + EXPORT ftxui-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules + ) +endif() diff --git a/modules/ftxui/CMakeLists.txt b/modules/ftxui/CMakeLists.txt deleted file mode 100644 index 28c4f1b5..00000000 --- a/modules/ftxui/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -# CMake 3.28+ supports the new CMake C++ module system. -if(CMAKE_VERSION VERSION_LESS 3.28) - return() -endif() - -# Not all compilers support the C++ module system yet. -if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") - return() -endif() - -# The list of generators which support scanning sources for C++ modules include: -# - Ninja -# - Ninja Multi-Config -# - Visual Studio 17 2022 -if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND - NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND - CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) - return() -endif() - -cmake_minimum_required(VERSION 3.28) -add_library(ftxui_modules) - -target_sources(ftxui_modules - PUBLIC - FILE_SET CXX_MODULES - FILES - component.cppm - component/Animation.cppm - component/CapturedMouse.cppm - component/Component.cppm - component/ComponentBase.cppm - component/ComponentOptions.cppm - component/Event.cppm - component/Loop.cppm - component/Mouse.cppm - component/Receiver.cppm - component/ScreenInteractive.cppm - component/Task.cppm - dom.cppm - dom/Canvas.cppm - dom/Deprecated.cppm - dom/Direction.cppm - dom/Elements.cppm - dom/FlexboxConfig.cppm - dom/LinearGradient.cppm - dom/Node.cppm - dom/Requirement.cppm - dom/Selection.cppm - dom/Table.cppm - screen.cppm - screen/Box.cppm - screen/Color.cppm - screen/ColorInfo.cppm - screen/Deprecated.cppm - screen/Image.cppm - screen/Pixel.cppm - screen/Screen.cppm - screen/String.cppm - screen/Terminal.cppm - util.cppm - util/AutoReset.cppm - util/Ref.cppm - ) - -target_link_libraries(ftxui_modules - PUBLIC - ftxui::screen - ftxui::dom - ftxui::component -) - -target_compile_features(ftxui_modules PUBLIC cxx_std_20) - -#set_target_properties(ftxui_modules PROPERTIES - #CXX_STANDARD 23 - #CXX_STANDARD_REQUIRED ON - #CXX_EXTENSIONS OFF - #CXX_MODULE_DYNDEP OFF -#) - -add_library(ftxui::modules ALIAS ftxui_modules) - -if(FTXUI_ENABLE_INSTALL) - install(TARGETS ftxui_modules - EXPORT ftxui-targets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules - ) -endif() diff --git a/modules/ftxui/component.cppm b/src/ftxui/component.cppm similarity index 100% rename from modules/ftxui/component.cppm rename to src/ftxui/component.cppm diff --git a/modules/ftxui/component/Animation.cppm b/src/ftxui/component/Animation.cppm similarity index 100% rename from modules/ftxui/component/Animation.cppm rename to src/ftxui/component/Animation.cppm diff --git a/modules/ftxui/component/CapturedMouse.cppm b/src/ftxui/component/CapturedMouse.cppm similarity index 100% rename from modules/ftxui/component/CapturedMouse.cppm rename to src/ftxui/component/CapturedMouse.cppm diff --git a/modules/ftxui/component/Component.cppm b/src/ftxui/component/Component.cppm similarity index 100% rename from modules/ftxui/component/Component.cppm rename to src/ftxui/component/Component.cppm diff --git a/modules/ftxui/component/ComponentBase.cppm b/src/ftxui/component/ComponentBase.cppm similarity index 100% rename from modules/ftxui/component/ComponentBase.cppm rename to src/ftxui/component/ComponentBase.cppm diff --git a/modules/ftxui/component/ComponentOptions.cppm b/src/ftxui/component/ComponentOptions.cppm similarity index 100% rename from modules/ftxui/component/ComponentOptions.cppm rename to src/ftxui/component/ComponentOptions.cppm diff --git a/modules/ftxui/component/Event.cppm b/src/ftxui/component/Event.cppm similarity index 100% rename from modules/ftxui/component/Event.cppm rename to src/ftxui/component/Event.cppm diff --git a/modules/ftxui/component/Loop.cppm b/src/ftxui/component/Loop.cppm similarity index 100% rename from modules/ftxui/component/Loop.cppm rename to src/ftxui/component/Loop.cppm diff --git a/modules/ftxui/component/Mouse.cppm b/src/ftxui/component/Mouse.cppm similarity index 100% rename from modules/ftxui/component/Mouse.cppm rename to src/ftxui/component/Mouse.cppm diff --git a/modules/ftxui/component/Receiver.cppm b/src/ftxui/component/Receiver.cppm similarity index 100% rename from modules/ftxui/component/Receiver.cppm rename to src/ftxui/component/Receiver.cppm diff --git a/modules/ftxui/component/ScreenInteractive.cppm b/src/ftxui/component/ScreenInteractive.cppm similarity index 100% rename from modules/ftxui/component/ScreenInteractive.cppm rename to src/ftxui/component/ScreenInteractive.cppm diff --git a/modules/ftxui/component/Task.cppm b/src/ftxui/component/Task.cppm similarity index 100% rename from modules/ftxui/component/Task.cppm rename to src/ftxui/component/Task.cppm diff --git a/modules/ftxui/dom.cppm b/src/ftxui/dom.cppm similarity index 100% rename from modules/ftxui/dom.cppm rename to src/ftxui/dom.cppm diff --git a/modules/ftxui/dom/Canvas.cppm b/src/ftxui/dom/Canvas.cppm similarity index 100% rename from modules/ftxui/dom/Canvas.cppm rename to src/ftxui/dom/Canvas.cppm diff --git a/modules/ftxui/dom/Deprecated.cppm b/src/ftxui/dom/Deprecated.cppm similarity index 100% rename from modules/ftxui/dom/Deprecated.cppm rename to src/ftxui/dom/Deprecated.cppm diff --git a/modules/ftxui/dom/Direction.cppm b/src/ftxui/dom/Direction.cppm similarity index 100% rename from modules/ftxui/dom/Direction.cppm rename to src/ftxui/dom/Direction.cppm diff --git a/modules/ftxui/dom/Elements.cppm b/src/ftxui/dom/Elements.cppm similarity index 100% rename from modules/ftxui/dom/Elements.cppm rename to src/ftxui/dom/Elements.cppm diff --git a/modules/ftxui/dom/FlexboxConfig.cppm b/src/ftxui/dom/FlexboxConfig.cppm similarity index 100% rename from modules/ftxui/dom/FlexboxConfig.cppm rename to src/ftxui/dom/FlexboxConfig.cppm diff --git a/modules/ftxui/dom/LinearGradient.cppm b/src/ftxui/dom/LinearGradient.cppm similarity index 100% rename from modules/ftxui/dom/LinearGradient.cppm rename to src/ftxui/dom/LinearGradient.cppm diff --git a/modules/ftxui/dom/Node.cppm b/src/ftxui/dom/Node.cppm similarity index 100% rename from modules/ftxui/dom/Node.cppm rename to src/ftxui/dom/Node.cppm diff --git a/modules/ftxui/dom/Requirement.cppm b/src/ftxui/dom/Requirement.cppm similarity index 100% rename from modules/ftxui/dom/Requirement.cppm rename to src/ftxui/dom/Requirement.cppm diff --git a/modules/ftxui/dom/Selection.cppm b/src/ftxui/dom/Selection.cppm similarity index 100% rename from modules/ftxui/dom/Selection.cppm rename to src/ftxui/dom/Selection.cppm diff --git a/modules/ftxui/dom/Table.cppm b/src/ftxui/dom/Table.cppm similarity index 100% rename from modules/ftxui/dom/Table.cppm rename to src/ftxui/dom/Table.cppm diff --git a/modules/ftxui/screen.cppm b/src/ftxui/screen.cppm similarity index 100% rename from modules/ftxui/screen.cppm rename to src/ftxui/screen.cppm diff --git a/modules/ftxui/screen/Box.cppm b/src/ftxui/screen/Box.cppm similarity index 100% rename from modules/ftxui/screen/Box.cppm rename to src/ftxui/screen/Box.cppm diff --git a/modules/ftxui/screen/Color.cppm b/src/ftxui/screen/Color.cppm similarity index 100% rename from modules/ftxui/screen/Color.cppm rename to src/ftxui/screen/Color.cppm diff --git a/modules/ftxui/screen/ColorInfo.cppm b/src/ftxui/screen/ColorInfo.cppm similarity index 100% rename from modules/ftxui/screen/ColorInfo.cppm rename to src/ftxui/screen/ColorInfo.cppm diff --git a/modules/ftxui/screen/Deprecated.cppm b/src/ftxui/screen/Deprecated.cppm similarity index 100% rename from modules/ftxui/screen/Deprecated.cppm rename to src/ftxui/screen/Deprecated.cppm diff --git a/modules/ftxui/screen/Image.cppm b/src/ftxui/screen/Image.cppm similarity index 100% rename from modules/ftxui/screen/Image.cppm rename to src/ftxui/screen/Image.cppm diff --git a/modules/ftxui/screen/Pixel.cppm b/src/ftxui/screen/Pixel.cppm similarity index 100% rename from modules/ftxui/screen/Pixel.cppm rename to src/ftxui/screen/Pixel.cppm diff --git a/modules/ftxui/screen/Screen.cppm b/src/ftxui/screen/Screen.cppm similarity index 100% rename from modules/ftxui/screen/Screen.cppm rename to src/ftxui/screen/Screen.cppm diff --git a/modules/ftxui/screen/String.cppm b/src/ftxui/screen/String.cppm similarity index 100% rename from modules/ftxui/screen/String.cppm rename to src/ftxui/screen/String.cppm diff --git a/modules/ftxui/screen/Terminal.cppm b/src/ftxui/screen/Terminal.cppm similarity index 100% rename from modules/ftxui/screen/Terminal.cppm rename to src/ftxui/screen/Terminal.cppm diff --git a/modules/ftxui/util.cppm b/src/ftxui/util.cppm similarity index 100% rename from modules/ftxui/util.cppm rename to src/ftxui/util.cppm diff --git a/modules/ftxui/util/AutoReset.cppm b/src/ftxui/util/AutoReset.cppm similarity index 100% rename from modules/ftxui/util/AutoReset.cppm rename to src/ftxui/util/AutoReset.cppm diff --git a/modules/ftxui/util/Ref.cppm b/src/ftxui/util/Ref.cppm similarity index 100% rename from modules/ftxui/util/Ref.cppm rename to src/ftxui/util/Ref.cppm From 1dff6a5c3577facdec92c09589ca2b598e9b5673 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Fri, 11 Apr 2025 01:39:07 +0200 Subject: [PATCH 10/15] Compile examples with modules. --- .github/workflows/build.yaml | 32 ++++++++++++ CMakeLists.txt | 20 ++++--- cmake/ftxui_message.cmake | 12 ++--- cmake/ftxui_modules.cmake | 31 ----------- examples/component/button.cpp | 83 +++++++++++++++++++++--------- tools/generate_examples_modules.sh | 29 +++++++++++ 6 files changed, 139 insertions(+), 68 deletions(-) create mode 100755 tools/generate_examples_modules.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f9149b74..5b972bb4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -120,6 +120,38 @@ jobs: name: ${{ runner.os }}-coverage files: ./build/coverage.xml + test_modules: + name: "Test modules" + runs-on: ubuntu-latest + steps: + - name: "Checkout repository" + uses: actions/checkout@v3 + + - name: "Install cmake" + uses: lukka/get-cmake@latest + + - name: "Install ninja" + run: sudo apt-get install ninja-build + + - name: "Generate ./examples_modules" + run: > + ./tools/generate_examples_modules.sh + + - name: "Build modules" + run: > + mkdir build; + cd build; + cmake .. + -DCMAKE_GENERATOR=Ninja + -DCMAKE_BUILD_TYPE=Debug + -DFTXUI_BUILD_DOCS=OFF + -DFTXUI_BUILD_EXAMPLES=ON + -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 6845d38b..c9a9edc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.28) project(ftxui LANGUAGES CXX @@ -6,16 +6,16 @@ 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_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_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) -option(FTXUI_BUILD_MODULES "Build the C++20 modules" 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) 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 \ @@ -179,5 +179,11 @@ 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 "examples_modules") + add_subdirectory(examples_modules) +endif() diff --git a/cmake/ftxui_message.cmake b/cmake/ftxui_message.cmake index 28ca5b4e..5f25f1ac 100644 --- a/cmake/ftxui_message.cmake +++ b/cmake/ftxui_message.cmake @@ -5,14 +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_BUILD_MODULES : ${FTXUI_BUILD_MODULES}") +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 index 5f07998c..0c017479 100644 --- a/cmake/ftxui_modules.cmake +++ b/cmake/ftxui_modules.cmake @@ -2,37 +2,6 @@ if (NOT FTXUI_BUILD_MODULES) return() endif() -# CMake 3.28+ supports the new CMake C++ module system. -if(CMAKE_VERSION VERSION_LESS 3.28) - message(FATAL_ERROR - "FTXUI_BUILD_MODULES requires CMake 3.28 or higher. " - ) - return() -endif() - -# Not all compilers support the C++ module system yet. -if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") - message(FATAL_ERROR - "FTXUI_BUILD_MODULES requires a compiler that supports C++20 modules. " - "Currently, only Clang, GCC, and MSVC support this feature." - ) - return() -endif() - -# The list of generators which support scanning sources for C++ modules include: -# - Ninja -# - Ninja Multi-Config -# - Visual Studio 17 2022 -if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND - NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND - CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) - message(FATAL_ERROR - "FTXUI_BUILD_MODULES requires a generator that supports C++20 modules. - Please use Ninja or Visual Studio 17 2022 or higher." - ) - return() -endif() - cmake_minimum_required(VERSION 3.28) add_library(ftxui-modules) diff --git a/examples/component/button.cpp b/examples/component/button.cpp index 25813849..dda9dd3e 100644 --- a/examples/component/button.cpp +++ b/examples/component/button.cpp @@ -1,30 +1,65 @@ -#include // for shared_ptr, allocator, __shared_ptr_access - -#include "ftxui/component/component.hpp" // for Renderer, ResizableSplitBottom, ResizableSplitLeft, ResizableSplitRight, ResizableSplitTop +// 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 + +#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 Element, operator|, text, center, border - +#include "ftxui/dom/elements.hpp" // for separator, gauge, text, Element, operator|, vbox, border + using namespace ftxui; - -int main() { - auto screen = ScreenInteractive::Fullscreen(); - std::string a = "aa"; - - auto component = Renderer([a] { - - std::vector elements; - - for (auto i = 0; i < 10; ++i) { - elements.push_back(window(text(a), paragraph(a))); +// 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 vbox(elements); - }); - - auto renderer = - Renderer(component, [&] { return component->Render() | border; }); - - screen.Loop(renderer); + 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/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 Date: Fri, 11 Apr 2025 01:43:23 +0200 Subject: [PATCH 11/15] Fix workflow. --- .github/workflows/build.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5b972bb4..c6cf4ff9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -143,9 +143,10 @@ jobs: cd build; cmake .. -DCMAKE_GENERATOR=Ninja + -DFTXUI_BUILD_MODULES=ON + -DFTXUI_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug -DFTXUI_BUILD_DOCS=OFF - -DFTXUI_BUILD_EXAMPLES=ON -DFTXUI_BUILD_TESTS=OFF -DFTXUI_BUILD_TESTS_FUZZER=OFF -DFTXUI_ENABLE_INSTALL=ON From dd37fba10025de457ba6a7e1a418b57039db4153 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Fri, 11 Apr 2025 01:48:07 +0200 Subject: [PATCH 12/15] Fix workflow 2 --- .github/workflows/build.yaml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c6cf4ff9..e402f206 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -122,16 +122,27 @@ jobs: test_modules: name: "Test modules" - runs-on: ubuntu-latest + 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: "Install cmake" - uses: lukka/get-cmake@latest - - - name: "Install ninja" - run: sudo apt-get install ninja-build + - 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: > From cb8ebdeb44dff7c4471a5ad50807e8203ac59b46 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Fri, 11 Apr 2025 02:03:18 +0200 Subject: [PATCH 13/15] fix workflows 3 --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c9a9edc6..00d27368 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.28) +cmake_minimum_required(VERSION 3.12) project(ftxui LANGUAGES CXX @@ -184,6 +184,6 @@ add_subdirectory(examples) # You can generate ./examples_modules/ by running # ./tools/generate_examples_modules.sh -if(EXISTS "examples_modules") +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples_modules/CMakeLists.txt") add_subdirectory(examples_modules) endif() From f6dceabdc9f801da9dd67efe0e57fb150f86e023 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Fri, 11 Apr 2025 15:07:58 +0200 Subject: [PATCH 14/15] tweaks --- CMakeLists.txt | 21 +++++++++++++-------- cmake/ftxui_modules.cmake | 38 ++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00d27368..1b2f366e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,3 @@ -cmake_minimum_required(VERSION 3.12) - -project(ftxui - LANGUAGES CXX - VERSION 6.0.2 - DESCRIPTION "C++ Functional Terminal User Interface." -) - 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) @@ -17,6 +9,19 @@ 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.12) +else() + cmake_minimum_required(VERSION 3.28.2) +endif() + +project(ftxui + LANGUAGES CXX + VERSION 6.0.2 + DESCRIPTION "C++ Functional Terminal User Interface." +) + + 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 \ to counteract its implementations problems.") diff --git a/cmake/ftxui_modules.cmake b/cmake/ftxui_modules.cmake index 0c017479..beb14f53 100644 --- a/cmake/ftxui_modules.cmake +++ b/cmake/ftxui_modules.cmake @@ -2,13 +2,10 @@ if (NOT FTXUI_BUILD_MODULES) return() endif() -cmake_minimum_required(VERSION 3.28) add_library(ftxui-modules) target_sources(ftxui-modules - PUBLIC - FILE_SET CXX_MODULES - FILES + PUBLIC FILE_SET CXX_MODULES FILES src/ftxui/component.cppm src/ftxui/component/Animation.cppm src/ftxui/component/CapturedMouse.cppm @@ -55,21 +52,30 @@ target_link_libraries(ftxui-modules ) target_compile_features(ftxui-modules PUBLIC cxx_std_20) - -#set_target_properties(ftxui-modules PROPERTIES - #CXX_STANDARD 23 - #CXX_STANDARD_REQUIRED ON - #CXX_EXTENSIONS OFF - #CXX_MODULE_DYNDEP OFF -#) +if (CMAKE_COMPILER_IS_GNUCXX) + target_compile_options(${name} PUBLIC -fmodules-ts) +endif () add_library(ftxui::modules ALIAS ftxui-modules) if(FTXUI_ENABLE_INSTALL) - install(TARGETS ftxui-modules + +include(GNUInstallDirs) + +install(TARGETS ftxui-modules EXPORT ftxui-targets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules - ) + 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() From ffc6dcd3bf70b10810e4dfa6b93bbbc0118a75bb Mon Sep 17 00:00:00 2001 From: Toyosatomimi no Miko <110693261+mikomikotaishi@users.noreply.github.com> Date: Sat, 19 Apr 2025 09:54:02 -0400 Subject: [PATCH 15/15] Add ftxui module for all submodules --- .gitignore | 8 ++------ CMakeLists.txt | 4 ++-- src/ftxui/ftxui.cppm | 11 +++++++++++ 3 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 src/ftxui/ftxui.cppm diff --git a/.gitignore b/.gitignore index 71797e17..2df731ae 100644 --- a/.gitignore +++ b/.gitignore @@ -54,14 +54,10 @@ out/ !include/ftxui/**/*.cpp # src directory: +!src/ftxui/*.cppm !src/ftxui/**/*.hpp !src/ftxui/**/*.cpp - -# modules directory: -!modules/*.txt -!modules/ftxui/*.cppm -!modules/ftxui/*.txt -!modules/ftxui/**/*.cppm +!src/ftxui/**/*.cppm # tools directory: !tools/**/*.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b2f366e..f8a13bab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,9 @@ 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.12) -else() cmake_minimum_required(VERSION 3.28.2) +else() + cmake_minimum_required(VERSION 3.12) endif() project(ftxui 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;