20 Commits

Author SHA1 Message Date
ArthurSonzogni
0200632555 Update CHANGELOG for v4.2 2023-07-26 00:04:11 +02:00
ArthurSonzogni
ce252ff92e Add missing includes for gcc
Bug:https://github.com/ArthurSonzogni/FTXUI/issues/695
2023-07-25 23:55:41 +02:00
cblack-dev
afb03620da Resolve unused varaible warning in _WIN32 builds of screen_interactive.cpp (#693)
Marks constexpr int timeout_microseconds on line 73 as [[maybe_unused]] to resolve unused variable warning on _WIN32 builds.
2023-07-25 23:54:51 +02:00
Stefan Ravn van Overeem
de6749fed7 Improve unicode codepoint Bisearch performance (#691)
Improve the performance of the functions for searching for codepoints
in a table by passing the table array in as a reference instead of copying
it.

Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
2023-07-25 23:54:45 +02:00
Stefan Ravn van Overeem
2bcdb9ac54 Support Fn keys for every terminal standards (#689)
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
2023-07-25 23:54:39 +02:00
Arthur Sonzogni
2ed61a9d31 Support F1-F5 from OS terminal (#687)
Bug:https://github.com/ArthurSonzogni/FTXUI/issues/685
2023-07-25 23:53:20 +02:00
Arthur Sonzogni
46042ce74a Feature: hyperlink support. (#665)
See the [OSC 8 page](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda).
FTXUI support proposed by @aaleino in [#662](https://github.com/ArthurSonzogni/FTXUI/issues/662).

API:
```cpp
auto link = text("Click here") | hyperlink("https://github.com/FTXUI")
```

Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/662
2023-07-25 23:35:55 +02:00
Prokop Randáček
1651ae56ca fix some warnings (#660)
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
2023-07-25 23:26:41 +02:00
Henrik S. Gaßmann
f64e1e128e build: Properly escape paths which may contain spaces 2023-05-30 09:03:49 +02:00
Henrik S. Gaßmann
3483022703 build: Remove redundant cmake version check
The main `CMakelists.txt` already asserts a minimum version of `3.12`
which renders the condition `cmake <= 3.11.4` to be always false.
2023-05-30 09:03:44 +02:00
Henrik S. Gaßmann
7f5aed1e66 build(install): Remove redundant install settings 2023-05-30 09:03:38 +02:00
Henrik S. Gaßmann
438a7dc842 build(install): Fix pkgconfig install directory
`pkg-config` finds configs within `$prefix/lib/pkgconfig`, but not in
`$prefix/lib`.

See-Also: https://linux.die.net/man/1/pkg-config
2023-05-30 09:03:33 +02:00
ArthurSonzogni
513ec6c5e1 Increase version to 4.1.1 2023-05-29 14:07:29 +02:00
ArthurSonzogni
234b3c8a5d Resolve compile issues in component_fuzzer 2023-05-27 20:54:12 +02:00
SpaceIm
6ce88c25e5 CMake: use compile_features to set min C++ standard (#647) 2023-05-27 20:50:35 +02:00
ArthurSonzogni
f74c5322bd Revert "Update float style in animation.cpp (#607)"
This reverts commit 7b08dae6d0.
2023-05-25 19:52:51 +02:00
ArthurSonzogni
1e86587b68 Revert "Feature resizable spilt with custom separator (#583)"
This reverts commit eb313e0f2d.
2023-05-25 19:47:33 +02:00
SpaceIm
41c3d4dd52 add FTXUI_DEV_WARNINGS option in CMakeLists (#648)
This option allows to enable warnings as errors, and add more compiler warnings
2023-05-25 19:38:45 +02:00
Robin Lindén
2fb0b77f02 Fix MSVC possible loss of data warning (#645) 2023-05-25 19:37:58 +02:00
Henrik Gaßmann
e2aff66b98 build: Check package version in find_package (#643)
Modify the `ftxui-config.cmake.in` file so that it includes
`ftxui-targets.cmake`. This causes cmake to check the version is
compatible with what the user requested.

This patch also includes additional minor changes.

Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
2023-05-25 19:37:55 +02:00
116 changed files with 936 additions and 642 deletions

View File

@@ -66,7 +66,8 @@ jobs:
-DFTXUI_BUILD_EXAMPLES:BOOL=ON -DFTXUI_BUILD_EXAMPLES:BOOL=ON
-DFTXUI_BUILD_TESTS:BOOL=ON -DFTXUI_BUILD_TESTS:BOOL=ON
-DFTXUI_BUILD_TESTS_FUZZER:BOOL=OFF -DFTXUI_BUILD_TESTS_FUZZER:BOOL=OFF
-DFTXUI_ENABLE_INSTALL:BOOL=ON ; -DFTXUI_ENABLE_INSTALL:BOOL=ON
-DFTXUI_DEV_WARNINGS:BOOL=ON ;
- name: "Build" - name: "Build"
run: > run: >
@@ -160,7 +161,8 @@ jobs:
-DFTXUI_BUILD_EXAMPLES=OFF -DFTXUI_BUILD_EXAMPLES=OFF
-DFTXUI_BUILD_TESTS=OFF -DFTXUI_BUILD_TESTS=OFF
-DFTXUI_BUILD_TESTS_FUZZER=OFF -DFTXUI_BUILD_TESTS_FUZZER=OFF
-DFTXUI_ENABLE_INSTALL=ON; -DFTXUI_ENABLE_INSTALL=ON
-DFTXUI_DEV_WARNINGS=ON ;
cmake --build . --target package; cmake --build . --target package;
- uses: shogo82148/actions-upload-release-asset@v1 - uses: shogo82148/actions-upload-release-asset@v1
with: with:
@@ -196,7 +198,8 @@ jobs:
-DFTXUI_BUILD_EXAMPLES=ON -DFTXUI_BUILD_EXAMPLES=ON
-DFTXUI_BUILD_TESTS=OFF -DFTXUI_BUILD_TESTS=OFF
-DFTXUI_BUILD_TESTS_FUZZER=OFF -DFTXUI_BUILD_TESTS_FUZZER=OFF
-DFTXUI_ENABLE_INSTALL=OFF; -DFTXUI_ENABLE_INSTALL=OFF
-DFTXUI_DEV_WARNINGS=ON ;
cmake --build . --target doc; cmake --build . --target doc;
cmake --build . ; cmake --build . ;
rsync -amv rsync -amv

View File

@@ -1,7 +1,37 @@
Changelog Changelog
========= =========
4.1.0 4.2
---
### Component
- Bugfix: Support Fn keys for every terminal specifications.
### Dom
- Feature: Add `hyperlink` decorator. For instance:
```cpp
auto link = text("Click here") | hyperlink("https://github.com/FTXUI")
```
See the [OSC 8 page](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda).
FTXUI support proposed by @aaleino in [#662](https://github.com/ArthurSonzogni/FTXUI/issues/662).
### Screen
- Fix huge performance bug affecting some compilers about unicode bisection.
### Build
- Check version compatibility when using cmake find_package()
- Fix missing includes for some gcc versions.
4.1.1
-----
### Component
- Revert Feature: Support `ResizableSplit` with customizable separator.
### Build
- Check version compatibility when using cmake find_package()
4.1.0 (abandonned)
----- -----
### Component ### Component

View File

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.11)
project(ftxui project(ftxui
LANGUAGES CXX LANGUAGES CXX
VERSION 4.1.0 VERSION 4.1.1
DESCRIPTION "C++ Functional Terminal User Interface." DESCRIPTION "C++ Functional Terminal User Interface."
) )
@@ -13,6 +13,7 @@ option(FTXUI_BUILD_TESTS_FUZZER "Set to ON to enable fuzzing" OFF)
option(FTXUI_ENABLE_INSTALL "Generate the install target" ON) option(FTXUI_ENABLE_INSTALL "Generate the install target" ON)
option(FTXUI_CLANG_TIDY "Execute clang-tidy" OFF) option(FTXUI_CLANG_TIDY "Execute clang-tidy" OFF)
option(FTXUI_ENABLE_COVERAGE "Execute code coverage" OFF) option(FTXUI_ENABLE_COVERAGE "Execute code coverage" OFF)
option(FTXUI_DEV_WARNINGS "Enable more compiler warnings and warnings as errors" OFF)
set(FTXUI_MICROSOFT_TERMINAL_FALLBACK_HELP_TEXT "On windows, assume the \ set(FTXUI_MICROSOFT_TERMINAL_FALLBACK_HELP_TEXT "On windows, assume the \
terminal used will be one of Microsoft and use a set of reasonnable fallback \ terminal used will be one of Microsoft and use a set of reasonnable fallback \
@@ -43,7 +44,6 @@ add_library(screen
add_library(dom add_library(dom
include/ftxui/dom/canvas.hpp include/ftxui/dom/canvas.hpp
include/ftxui/dom/direction.hpp
include/ftxui/dom/elements.hpp include/ftxui/dom/elements.hpp
include/ftxui/dom/flexbox_config.hpp include/ftxui/dom/flexbox_config.hpp
include/ftxui/dom/node.hpp include/ftxui/dom/node.hpp
@@ -52,6 +52,7 @@ add_library(dom
src/ftxui/dom/automerge.cpp src/ftxui/dom/automerge.cpp
src/ftxui/dom/blink.cpp src/ftxui/dom/blink.cpp
src/ftxui/dom/bold.cpp src/ftxui/dom/bold.cpp
src/ftxui/dom/hyperlink.cpp
src/ftxui/dom/border.cpp src/ftxui/dom/border.cpp
src/ftxui/dom/box_helper.cpp src/ftxui/dom/box_helper.cpp
src/ftxui/dom/box_helper.hpp src/ftxui/dom/box_helper.hpp

View File

@@ -127,6 +127,7 @@ An element can be decorated using the functions:
- `strikethrough` - `strikethrough`
- `color` - `color`
- `bgcolor` - `bgcolor`
- `hyperlink`
[Example](https://arthursonzogni.github.io/FTXUI/examples_2dom_2style_gallery_8cpp-example.html) [Example](https://arthursonzogni.github.io/FTXUI/examples_2dom_2style_gallery_8cpp-example.html)

View File

@@ -2,3 +2,5 @@
include(CMakeFindDependencyMacro) include(CMakeFindDependencyMacro)
find_dependency(Threads) find_dependency(Threads)
include("${CMAKE_CURRENT_LIST_DIR}/ftxui-targets.cmake")

View File

@@ -4,5 +4,5 @@ add_library(ftxui::component ALIAS component)
export( export(
TARGETS screen dom component TARGETS screen dom component
NAMESPACE ftxui:: NAMESPACE ftxui::
FILE ${PROJECT_BINARY_DIR}/ftxui-targets.cmake FILE "${PROJECT_BINARY_DIR}/ftxui-targets.cmake"
) )

View File

@@ -27,7 +27,7 @@ set(BUILD_GMOCK OFF CACHE INTERNAL "")
set(INSTALL_GTEST OFF CACHE INTERNAL "") set(INSTALL_GTEST OFF CACHE INTERNAL "")
set(gtest_force_shared_crt ON CACHE INTERNAL "") set(gtest_force_shared_crt ON CACHE INTERNAL "")
add_subdirectory( add_subdirectory(
${googletest_SOURCE_DIR} "${googletest_SOURCE_DIR}"
${googletest_BINARY_DIR} "${googletest_BINARY_DIR}"
EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL
) )

View File

@@ -10,18 +10,11 @@ function(fuzz name)
add_executable(${name} add_executable(${name}
src/ftxui/component/${name}.cpp src/ftxui/component/${name}.cpp
) )
target_include_directories(${name} target_include_directories(${name} PRIVATE src)
PRIVATE src target_link_libraries(${name} PRIVATE component)
) target_compile_options(${name} PRIVATE -fsanitize=fuzzer,address)
target_link_libraries(${name} target_link_libraries(${name} PRIVATE -fsanitize=fuzzer,address)
PRIVATE component target_compile_features(${name} PRIVATE cxx_std_17)
)
target_compile_options(${name}
PRIVATE -fsanitize=fuzzer,address
)
target_link_libraries(${name}
PRIVATE -fsanitize=fuzzer,address
)
endfunction(fuzz) endfunction(fuzz)
fuzz(terminal_input_parser_test_fuzzer) fuzz(terminal_input_parser_test_fuzzer)

View File

@@ -3,41 +3,58 @@ if(NOT FTXUI_ENABLE_INSTALL)
endif() endif()
include(GNUInstallDirs) include(GNUInstallDirs)
install(TARGETS screen dom component include(CMakePackageConfigHelpers)
EXPORT ftxui-export
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # ------------------------------------------------------------------------------
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # Install the library and its public headers into the standard subdirectories
# ------------------------------------------------------------------------------
install(
TARGETS screen dom component
EXPORT ftxui-targets
) )
install(DIRECTORY include/ftxui DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(
DIRECTORY include/ftxui
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)
# CMake package configuration for easy use of library in CMake # ------------------------------------------------------------------------------
include(CMakePackageConfigHelpers) # Install the exported cmake targets for use in other CMake projects.
configure_package_config_file(ftxui-config.cmake.in # ------------------------------------------------------------------------------
${CMAKE_CURRENT_BINARY_DIR}/ftxui-config.cmake install(
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/ftxui/cmake EXPORT ftxui-targets
NAMESPACE ftxui::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ftxui"
)
# ------------------------------------------------------------------------------
# Create and install the ftuxi-config.cmake and ftuxi-config-version.cmake files
# needed to support users of find_package()
# ------------------------------------------------------------------------------
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/ftxui-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/ftxui-config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/ftxui/cmake"
PATH_VARS CMAKE_INSTALL_INCLUDEDIR PATH_VARS CMAKE_INSTALL_INCLUDEDIR
) )
write_basic_package_version_file( write_basic_package_version_file(
ftxui-config-version.cmake "${CMAKE_CURRENT_BINARY_DIR}/cmake/ftxui-config-version.cmake"
VERSION ${PACKAGE_VERSION} VERSION ${PACKAGE_VERSION}
COMPATIBILITY AnyNewerVersion COMPATIBILITY SameMajorVersion
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/cmake/ftxui-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/ftxui-config-version.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ftxui"
) )
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ftxui-config.cmake # ------------------------------------------------------------------------------
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ftxui # Create and install pkg-config file for easy use of library in build systems
) # other than CMake:
install(EXPORT ftxui-export # ------------------------------------------------------------------------------
FILE ftxui-config-version.cmake configure_file(ftxui.pc.in ${CMAKE_CURRENT_BINARY_DIR}/ftxui.pc @ONLY)
NAMESPACE ftxui:: install(
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ftxui FILES "${CMAKE_CURRENT_BINARY_DIR}/ftxui.pc"
) DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
# pkg-config file for easy use of library in build systems other than CMake
configure_file(ftxui.pc.in
${CMAKE_CURRENT_BINARY_DIR}/ftxui.pc
@ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ftxui.pc
DESTINATION lib/pkgconfig
) )

View File

@@ -43,19 +43,7 @@ function(ftxui_set_options library)
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
) )
# Play nicely if we are being consumed by another project target_compile_features(${library} PUBLIC cxx_std_17)
# and use their CMAKE_CXX_STANDARD. Otherwise, fall back to 17
# C++17 is used. We require fold expression at least.
if (DEFINED CMAKE_CXX_STANDARD)
set(CXX_STANDARD ${CMAKE_CXX_STANDARD})
else()
set(CXX_STANDARD 17)
endif()
set_target_properties(${library} PROPERTIES
CXX_STANDARD ${CXX_STANDARD}
CXX_EXTENSIONS OFF
)
# Force Microsoft Visual Studio to decode sources files in UTF-8. This applies # Force Microsoft Visual Studio to decode sources files in UTF-8. This applies
# to the library and the library users. # to the library and the library users.
@@ -66,8 +54,10 @@ function(ftxui_set_options library)
# Add as many warning as possible: # Add as many warning as possible:
if (WIN32) if (WIN32)
if (MSVC) if (MSVC)
if(FTXUI_DEV_WARNINGS)
target_compile_options(${library} PRIVATE "/W3") target_compile_options(${library} PRIVATE "/W3")
target_compile_options(${library} PRIVATE "/WX") target_compile_options(${library} PRIVATE "/WX")
endif()
target_compile_options(${library} PRIVATE "/wd4244") target_compile_options(${library} PRIVATE "/wd4244")
target_compile_options(${library} PRIVATE "/wd4267") target_compile_options(${library} PRIVATE "/wd4267")
target_compile_options(${library} PRIVATE "/D_CRT_SECURE_NO_WARNINGS") target_compile_options(${library} PRIVATE "/D_CRT_SECURE_NO_WARNINGS")
@@ -75,13 +65,21 @@ function(ftxui_set_options library)
# Force Win32 to UNICODE # Force Win32 to UNICODE
target_compile_definitions(${library} PRIVATE UNICODE _UNICODE) target_compile_definitions(${library} PRIVATE UNICODE _UNICODE)
else() else()
if(FTXUI_DEV_WARNINGS)
target_compile_options(${library} PRIVATE "-Wall") target_compile_options(${library} PRIVATE "-Wall")
target_compile_options(${library} PRIVATE "-Wextra")
target_compile_options(${library} PRIVATE "-pedantic")
target_compile_options(${library} PRIVATE "-Werror") target_compile_options(${library} PRIVATE "-Werror")
target_compile_options(${library} PRIVATE "-Wmissing-declarations") target_compile_options(${library} PRIVATE "-Wextra")
target_compile_options(${library} PRIVATE "-Wcast-align")
target_compile_options(${library} PRIVATE "-Wdeprecated") target_compile_options(${library} PRIVATE "-Wdeprecated")
target_compile_options(${library} PRIVATE "-Wmissing-declarations")
target_compile_options(${library} PRIVATE "-Wnon-virtual-dtor")
target_compile_options(${library} PRIVATE "-Wnull-dereference")
target_compile_options(${library} PRIVATE "-Woverloaded-virtual")
target_compile_options(${library} PRIVATE "-Wpedantic")
target_compile_options(${library} PRIVATE "-Wshadow") target_compile_options(${library} PRIVATE "-Wshadow")
target_compile_options(${library} PRIVATE "-Wunused")
endif()
endif() endif()
if (FTXUI_MICROSOFT_TERMINAL_FALLBACK) if (FTXUI_MICROSOFT_TERMINAL_FALLBACK)

View File

@@ -1,5 +1,4 @@
if (NOT FTXUI_BUILD_TESTS OR if (NOT FTXUI_BUILD_TESTS)
NOT ${CMAKE_VERSION} VERSION_GREATER "3.11.4")
return() return()
endif() endif()
@@ -37,6 +36,7 @@ add_executable(ftxui-tests
src/ftxui/dom/gauge_test.cpp src/ftxui/dom/gauge_test.cpp
src/ftxui/dom/gridbox_test.cpp src/ftxui/dom/gridbox_test.cpp
src/ftxui/dom/hbox_test.cpp src/ftxui/dom/hbox_test.cpp
src/ftxui/dom/hyperlink_test.cpp
src/ftxui/dom/linear_gradient_test.cpp src/ftxui/dom/linear_gradient_test.cpp
src/ftxui/dom/scroll_indicator_test.cpp src/ftxui/dom/scroll_indicator_test.cpp
src/ftxui/dom/separator_test.cpp src/ftxui/dom/separator_test.cpp
@@ -57,8 +57,12 @@ target_link_libraries(ftxui-tests
target_include_directories(ftxui-tests target_include_directories(ftxui-tests
PRIVATE src PRIVATE src
) )
ftxui_set_options(ftxui-tests) target_compile_features(ftxui-tests PRIVATE cxx_std_20)
target_compile_features(ftxui-tests PUBLIC cxx_std_20)
if (FTXUI_MICROSOFT_TERMINAL_FALLBACK)
target_compile_definitions(ftxui-tests
PRIVATE "FTXUI_MICROSOFT_TERMINAL_FALLBACK")
endif()
include(GoogleTest) include(GoogleTest)
gtest_discover_tests(ftxui-tests gtest_discover_tests(ftxui-tests

View File

@@ -1,7 +1,7 @@
find_program(iwyu_path NAMES include-what-you-use iwyu) find_program(iwyu_path NAMES include-what-you-use iwyu)
if(iwyu_path) if(iwyu_path)
set_property(TARGET ${lib} set_property(TARGET ${lib}
PROPERTY ${iwyu_path} -Xiwyu PROPERTY "${iwyu_path}" -Xiwyu
--mapping_file ${CMAKE_CURRENT_SOURCE_DIR}/iwyu.imp --mapping_file "${CMAKE_CURRENT_SOURCE_DIR}/iwyu.imp"
) )
endif() endif()

View File

@@ -8,9 +8,7 @@ function(example name)
target_link_libraries(ftxui_example_${name} PUBLIC ${DIRECTORY_LIB}) target_link_libraries(ftxui_example_${name} PUBLIC ${DIRECTORY_LIB})
file(RELATIVE_PATH dir ${EXAMPLES_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) file(RELATIVE_PATH dir ${EXAMPLES_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
set_property(GLOBAL APPEND PROPERTY FTXUI::EXAMPLES ${dir}/${name}) set_property(GLOBAL APPEND PROPERTY FTXUI::EXAMPLES ${dir}/${name})
set_target_properties(ftxui_example_${name} PROPERTIES target_compile_features(ftxui_example_${name} PRIVATE cxx_std_17)
CXX_STANDARD 20
)
endfunction(example) endfunction(example)
add_subdirectory(component) add_subdirectory(component)

View File

@@ -9,7 +9,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
int value = 50; int value = 50;
// The tree of components. This defines how to navigate using the keyboard. // The tree of components. This defines how to navigate using the keyboard.

View File

@@ -11,7 +11,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
int value = 50; int value = 50;
// The tree of components. This defines how to navigate using the keyboard. // The tree of components. This defines how to navigate using the keyboard.

View File

@@ -11,7 +11,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
int counter = 0; int counter = 0;
auto on_click = [&] { counter++; }; auto on_click = [&] { counter++; };

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
int value = 0; int value = 0;
auto action = [&] { value++; }; auto action = [&] { value++; };
auto action_renderer = auto action_renderer =

View File

@@ -14,7 +14,7 @@
#include "ftxui/dom/canvas.hpp" // for Canvas #include "ftxui/dom/canvas.hpp" // for Canvas
#include "ftxui/screen/color.hpp" // for Color, Color::Red, Color::Blue, Color::Green, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::Red, Color::Blue, Color::Green, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
int mouse_x = 0; int mouse_x = 0;

View File

@@ -8,12 +8,12 @@
#include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive
#include "ftxui/dom/elements.hpp" // for operator|, Element, size, border, frame, vscroll_indicator, HEIGHT, LESS_THAN #include "ftxui/dom/elements.hpp" // for operator|, Element, size, border, frame, vscroll_indicator, HEIGHT, LESS_THAN
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
Component input_list = Container::Vertical({}); Component input_list = Container::Vertical({});
std::vector<std::string> items(100, ""); std::vector<std::string> items(100, "");
for (int i = 0; i < items.size(); ++i) { for (size_t i = 0; i < items.size(); ++i) {
input_list->Add(Input(&(items[i]), "placeholder " + std::to_string(i))); input_list->Add(Input(&(items[i]), "placeholder " + std::to_string(i)));
} }

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::array<bool, 30> states; std::array<bool, 30> states;
auto container = Container::Vertical({}); auto container = Container::Vertical({});

View File

@@ -26,7 +26,7 @@ Component Empty() {
return std::make_shared<ComponentBase>(); return std::make_shared<ComponentBase>();
} }
int main(int argc, const char* argv[]) { int main() {
auto component = auto component =
Collapsible("Collapsible 1", Collapsible("Collapsible 1",
Inner({ Inner({

View File

@@ -11,7 +11,7 @@ using namespace ftxui;
// An example of how to compose multiple components into one and maintain their // An example of how to compose multiple components into one and maintain their
// interactiveness. // interactiveness.
int main(int argc, const char* argv[]) { int main() {
auto left_count = 0; auto left_count = 0;
auto right_count = 0; auto right_count = 0;

View File

@@ -11,7 +11,7 @@
#include "ftxui/component/loop.hpp" // for Loop #include "ftxui/component/loop.hpp" // for Loop
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::FitComponent(); auto screen = ScreenInteractive::FitComponent();

View File

@@ -5,7 +5,7 @@
#include "ftxui/component/component.hpp" // for Dropdown, Horizontal, Vertical #include "ftxui/component/component.hpp" // for Dropdown, Horizontal, Vertical
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
std::vector<std::string> entries = { std::vector<std::string> entries = {

View File

@@ -13,7 +13,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::Fullscreen(); auto screen = ScreenInteractive::Fullscreen();
int direction_index = 0; int direction_index = 0;

View File

@@ -31,7 +31,7 @@ Element make_grid() {
return gridbox(rows); return gridbox(rows);
}; };
int main(int argc, const char* argv[]) { int main() {
float focus_x = 0.5f; float focus_x = 0.5f;
float focus_y = 0.5f; float focus_y = 0.5f;

View File

@@ -19,7 +19,7 @@ Component Instance(std::string label, Decorator focusCursor) {
}); });
}; };
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::Fullscreen(); auto screen = ScreenInteractive::Fullscreen();
screen.Loop(Container::Vertical({ screen.Loop(Container::Vertical({
Instance("focus", focus), Instance("focus", focus),

View File

@@ -23,7 +23,7 @@ Component Wrap(std::string name, Component component) {
}); });
} }
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::FitComponent(); auto screen = ScreenInteractive::FitComponent();
// -- Menu // -- Menu

View File

@@ -24,7 +24,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::Fullscreen(); auto screen = ScreenInteractive::Fullscreen();
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@@ -9,7 +9,7 @@
#include "ftxui/dom/elements.hpp" // for text, hbox, separator, Element, operator|, vbox, border #include "ftxui/dom/elements.hpp" // for text, hbox, separator, Element, operator|, vbox, border
#include "ftxui/util/ref.hpp" // for Ref #include "ftxui/util/ref.hpp" // for Ref
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
std::string first_name; std::string first_name;

View File

@@ -9,7 +9,7 @@
#include "ftxui/component/component.hpp" // for Slider, Renderer, Vertical #include "ftxui/component/component.hpp" // for Slider, Renderer, Vertical
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::Fullscreen(); auto screen = ScreenInteractive::Fullscreen();

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> entries = { std::vector<std::string> entries = {
"entry 1", "entry 1",
"entry 2", "entry 2",

View File

@@ -8,7 +8,7 @@
#include "ftxui/component/component_options.hpp" // for MenuOption #include "ftxui/component/component_options.hpp" // for MenuOption
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();

View File

@@ -10,7 +10,7 @@
#include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive
#include "ftxui/dom/elements.hpp" // for text, separator, bold, hcenter, vbox, hbox, gauge, Element, operator|, border #include "ftxui/dom/elements.hpp" // for text, separator, bold, hcenter, vbox, hbox, gauge, Element, operator|, border
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();

View File

@@ -28,7 +28,7 @@ MenuEntryOption Colored(ftxui::Color c) {
return option; return option;
} }
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
int selected = 0; int selected = 0;

View File

@@ -24,7 +24,7 @@ MenuEntryOption Colored(ftxui::Color c) {
return option; return option;
} }
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
int selected = 0; int selected = 0;

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> entries; std::vector<std::string> entries;
int selected = 0; int selected = 0;

View File

@@ -17,7 +17,7 @@ Component Window(std::string title, Component component) {
}); });
} }
int main(int argc, const char* argv[]) { int main() {
int menu_selected[] = {0, 0, 0}; int menu_selected[] = {0, 0, 0};
std::vector<std::vector<std::string>> menu_entries = { std::vector<std::vector<std::string>> menu_entries = {
{ {

View File

@@ -30,7 +30,7 @@ Component HMenu3(std::vector<std::string>* entries, int* selected);
Component HMenu4(std::vector<std::string>* entries, int* selected); Component HMenu4(std::vector<std::string>* entries, int* selected);
Component HMenu5(std::vector<std::string>* entries, int* selected); Component HMenu5(std::vector<std::string>* entries, int* selected);
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
std::vector<std::string> entries{ std::vector<std::string> entries{

View File

@@ -27,7 +27,7 @@ Component Text(const std::string& t) {
return Renderer([t] { return text(t) | borderEmpty; }); return Renderer([t] { return text(t) | borderEmpty; });
} }
int main(int argc, const char* argv[]) { int main() {
using namespace std::literals; using namespace std::literals;
std::vector<std::string> tab_values{ std::vector<std::string> tab_values{
"Tab 1", "Tab 2", "Tab 3", "A very very long tab", "", "Tab 1", "Tab 2", "Tab 3", "A very very long tab", "",

View File

@@ -8,7 +8,7 @@
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
#include "ftxui/dom/elements.hpp" // for operator|, Element, filler, text, hbox, separator, center, vbox, bold, border, clear_under, dbox, size, GREATER_THAN, HEIGHT #include "ftxui/dom/elements.hpp" // for operator|, Element, filler, text, hbox, separator, center, vbox, bold, border, clear_under, dbox, size, GREATER_THAN, HEIGHT
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();

View File

@@ -35,7 +35,7 @@ void Nested(std::string path) {
screen.Loop(renderer); screen.Loop(renderer);
} }
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::FitComponent(); auto screen = ScreenInteractive::FitComponent();
auto button_quit = Button("Quit", screen.ExitLoopClosure()); auto button_quit = Button("Quit", screen.ExitLoopClosure());
auto button_nested = Button("Nested", [] { Nested(""); }); auto button_nested = Button("Nested", [] { Nested(""); });

View File

@@ -134,7 +134,7 @@ std::string Stringify(Event event) {
return out; return out;
} }
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
std::vector<Event> keys; std::vector<Event> keys;

View File

@@ -7,7 +7,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> radiobox_list = { std::vector<std::string> radiobox_list = {
"Use gcc", "Use gcc",
"Use clang", "Use clang",

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> entries; std::vector<std::string> entries;
int selected = 0; int selected = 0;

View File

@@ -7,7 +7,7 @@
#include "ftxui/dom/elements.hpp" // for operator|, Element, text, bold, border, center, color #include "ftxui/dom/elements.hpp" // for operator|, Element, text, bold, border, center, color
#include "ftxui/screen/color.hpp" // for Color, Color::Red #include "ftxui/screen/color.hpp" // for Color, Color::Red
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto screen = ScreenInteractive::FitComponent(); auto screen = ScreenInteractive::FitComponent();

View File

@@ -8,7 +8,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::Fullscreen(); auto screen = ScreenInteractive::Fullscreen();
auto middle = Renderer([] { return text("middle") | center; }); auto middle = Renderer([] { return text("middle") | center; });

View File

@@ -4,7 +4,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
int value = 50; int value = 50;
auto slider = Slider("Value:", &value, 0, 100, 1); auto slider = Slider("Value:", &value, 0, 100, 1);

View File

@@ -2,8 +2,7 @@
#include <cmath> // for sin #include <cmath> // for sin
#include <ftxui/component/component_base.hpp> // for ComponentBase #include <ftxui/component/component_base.hpp> // for ComponentBase
#include <ftxui/component/component_options.hpp> // for SliderOption #include <ftxui/component/component_options.hpp> // for SliderOption
#include <ftxui/dom/direction.hpp> // for Direction, Direction::Up #include <ftxui/dom/elements.hpp> // for size, GREATER_THAN, GaugeDirection, GaugeDirection::Up, HEIGHT
#include <ftxui/dom/elements.hpp> // for size, GREATER_THAN, HEIGHT
#include <ftxui/util/ref.hpp> // for ConstRef, Ref #include <ftxui/util/ref.hpp> // for ConstRef, Ref
#include <memory> // for shared_ptr, __shared_ptr_access #include <memory> // for shared_ptr, __shared_ptr_access
@@ -13,7 +12,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
auto screen = ScreenInteractive::TerminalOutput(); auto screen = ScreenInteractive::TerminalOutput();
std::array<int, 30> values; std::array<int, 30> values;
for (int i = 0; i < values.size(); ++i) { for (int i = 0; i < values.size(); ++i) {
@@ -21,13 +20,13 @@ int main(int argc, const char* argv[]) {
} }
auto layout_horizontal = Container::Horizontal({}); auto layout_horizontal = Container::Horizontal({});
for (int i = 0; i < values.size(); ++i) { for (auto& value : values) {
// In C++17: // In C++17:
SliderOption<int> option; SliderOption<int> option;
option.value = &values[i]; option.value = &value;
option.max = 100; option.max = 100;
option.increment = 5; option.increment = 5;
option.direction = Direction::Up; option.direction = GaugeDirection::Up;
layout_horizontal->Add(Slider<int>(option)); layout_horizontal->Add(Slider<int>(option));
/* In C++20: /* In C++20:
@@ -35,7 +34,7 @@ int main(int argc, const char* argv[]) {
.value = &values[i], .value = &values[i],
.max = 100, .max = 100,
.increment = 5, .increment = 5,
.direction = Direction::Up, .direction = GaugeDirection::Up,
})); }));
*/ */
} }

View File

@@ -23,7 +23,7 @@ Element ColorString(int red, int green, int blue) {
); );
} }
int main(int argc, const char* argv[]) { int main() {
int red = 128; int red = 128;
int green = 25; int green = 25;
int blue = 100; int blue = 100;

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> tab_values{ std::vector<std::string> tab_values{
"tab_1", "tab_1",
"tab_2", "tab_2",

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> tab_values{ std::vector<std::string> tab_values{
"tab_1", "tab_1",
"tab_2", "tab_2",

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
int main(int argc, const char* argv[]) { int main() {
std::vector<std::string> toggle_1_entries = { std::vector<std::string> toggle_1_entries = {
"On", "On",
"Off", "Off",

View File

@@ -27,6 +27,7 @@ example(style_bold)
example(style_color) example(style_color)
example(style_dim) example(style_dim)
example(style_gallery) example(style_gallery)
example(style_hyperlink)
example(style_inverted) example(style_inverted)
example(style_strikethrough) example(style_strikethrough)
example(style_underlined) example(style_underlined)

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto make_boxed = [] { auto make_boxed = [] {

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = vbox({ auto document = vbox({

View File

@@ -8,7 +8,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, Color::Red, Color::Blue, Color::Green, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::Red, Color::Blue, Color::Green, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto c = Canvas(100, 100); auto c = Canvas(100, 100);

View File

@@ -10,7 +10,7 @@
using namespace ftxui; using namespace ftxui;
#include "./color_info_sorted_2d.ipp" // for ColorInfoSorted2D #include "./color_info_sorted_2d.ipp" // for ColorInfoSorted2D
int main(int argc, const char* argv[]) { int main() {
std::vector<std::vector<ColorInfo>> info_columns = ColorInfoSorted2D(); std::vector<std::vector<ColorInfo>> info_columns = ColorInfoSorted2D();
// Draw every columns // Draw every columns

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, ftxui #include "ftxui/screen/color.hpp" // for Color, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
int saturation = 255; int saturation = 255;

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, ftxui #include "ftxui/screen/color.hpp" // for Color, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
int saturation = 255; int saturation = 255;

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = dbox({ auto document = dbox({
vbox({ vbox({

View File

@@ -8,7 +8,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
using namespace std::chrono_literals; using namespace std::chrono_literals;

View File

@@ -8,7 +8,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
using namespace std::chrono_literals; using namespace std::chrono_literals;

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto cell = [](const char* t) { return text(t) | border; }; auto cell = [](const char* t) { return text(t) | border; };
auto document = // auto document = //

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto make_box = [](int dimx, int dimy) { auto make_box = [](int dimx, int dimy) {
std::string title = std::to_string(dimx) + "x" + std::to_string(dimy); std::string title = std::to_string(dimx) + "x" + std::to_string(dimy);

View File

@@ -9,7 +9,7 @@
#include "ftxui/screen/box.hpp" // for ftxui #include "ftxui/screen/box.hpp" // for ftxui
#include "ftxui/screen/color.hpp" // for Color, Color::Red #include "ftxui/screen/color.hpp" // for Color, Color::Red
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
using namespace std::chrono_literals; using namespace std::chrono_literals;

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, Color::DeepPink1, Color::DeepSkyBlue1, Color::Yellow, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::DeepPink1, Color::DeepSkyBlue1, Color::Yellow, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = text("gradient") | center; auto document = text("gradient") | center;

View File

@@ -12,7 +12,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, Color::Green, Color::Red, Color::RedLight, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::Green, Color::Red, Color::RedLight, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
struct Task { struct Task {

View File

@@ -10,13 +10,13 @@
#include "ftxui/screen/box.hpp" // for ftxui #include "ftxui/screen/box.hpp" // for ftxui
using namespace std::chrono_literals; using namespace std::chrono_literals;
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
std::string p = std::string p =
R"(In probability theory and statistics, Bayes' theorem (alternatively Bayes' law or Bayes' rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes' theorem, a person's age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person's age. One of the many applications of Bayes' theorem is Bayesian inference, a particular approach to statistical inference. When applied, the probabilities involved in Bayes' theorem may have different probability interpretations. With the Bayesian probability interpretation the theorem expresses how a subjective degree of belief should rationally change to account for availability of related evidence. Bayesian inference is fundamental to Bayesian statistics.)"; R"(In probability theory and statistics, Bayes' theorem (alternatively Bayes' law or Bayes' rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes' theorem, a person's age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person's age. One of the many applications of Bayes' theorem is Bayesian inference, a particular approach to statistical inference. When applied, the probabilities involved in Bayes' theorem may have different probability interpretations. With the Bayesian probability interpretation the theorem expresses how a subjective degree of belief should rationally change to account for availability of related evidence. Bayesian inference is fundamental to Bayesian statistics.)";
std::string reset_position; std::string reset_position;
for (int i = 0;; ++i) { while (true) {
auto document = vbox({ auto document = vbox({
hflow(paragraph(p)), hflow(paragraph(p)),
separator(), separator(),

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = hbox({ auto document = hbox({
text("left-column"), text("left-column"),

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/box.hpp" // for ftxui #include "ftxui/screen/box.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = vbox({ auto document = vbox({

View File

@@ -7,7 +7,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto make_box = [](const std::string& title) { auto make_box = [](const std::string& title) {
return window(text(title) | hcenter | bold, return window(text(title) | hcenter | bold,

View File

@@ -10,7 +10,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
using namespace std::chrono_literals; using namespace std::chrono_literals;

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, operator""_rgb, Color::Black, Color::Blue, Color::BlueLight, Color::Cyan, Color::CyanLight, Color::DeepSkyBlue4, Color::Default, Color::GrayDark, Color::GrayLight, Color::Green, Color::GreenLight, Color::Magenta, Color::MagentaLight, Color::Red, Color::RedLight, Color::SkyBlue1, Color::White, Color::Yellow, Color::YellowLight, ftxui #include "ftxui/screen/color.hpp" // for Color, operator""_rgb, Color::Black, Color::Blue, Color::BlueLight, Color::Cyan, Color::CyanLight, Color::DeepSkyBlue4, Color::Default, Color::GrayDark, Color::GrayLight, Color::Green, Color::GreenLight, Color::Magenta, Color::MagentaLight, Color::Red, Color::RedLight, Color::SkyBlue1, Color::White, Color::Yellow, Color::YellowLight, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = hbox({ auto document = hbox({
vbox({ vbox({

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, Color::Blue, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::Blue, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
// clang-format off // clang-format off
auto document = auto document =
@@ -19,7 +19,8 @@ int main(int argc, const char* argv[]) {
text("blink") | blink , text(" ") , text("blink") | blink , text(" ") ,
text("strikethrough") | strikethrough , text(" ") , text("strikethrough") | strikethrough , text(" ") ,
text("color") | color(Color::Blue) , text(" ") , text("color") | color(Color::Blue) , text(" ") ,
text("bgcolor") | bgcolor(Color::Blue) , text("bgcolor") | bgcolor(Color::Blue) , text(" ") ,
text("hyperlink") | hyperlink("https://github.com/ArthurSonzogni/FTXUI"),
}); });
// clang-format on // clang-format on
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document)); auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));

View File

@@ -0,0 +1,25 @@
#include <ftxui/dom/elements.hpp> // for text, operator|, bold, Fit, hbox, Element
#include <ftxui/screen/screen.hpp> // for Full, Screen
#include <memory> // for allocator
#include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui
int main() {
using namespace ftxui;
auto document = //
hbox({
text("This text is an "),
text("hyperlink") | hyperlink("https://www.google.com"),
text(". Do you like it?"),
});
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
Render(screen, document);
screen.Print();
return 0;
}
// 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.

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = hbox({ auto document = hbox({
text("This text is "), text("This text is "),

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -5,7 +5,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
hbox({ hbox({

View File

@@ -8,7 +8,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for Color, Color::Blue, Color::Cyan, Color::White, ftxui #include "ftxui/screen/color.hpp" // for Color, Color::Blue, Color::Cyan, Color::White, ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto table = Table({ auto table = Table({

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto document = // auto document = //
vbox({ vbox({

View File

@@ -6,7 +6,7 @@
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/color.hpp" // for ftxui #include "ftxui/screen/color.hpp" // for ftxui
int main(int argc, const char* argv[]) { int main() {
using namespace ftxui; using namespace ftxui;
auto make_box = [](int dimx, int dimy) { auto make_box = [](int dimx, int dimy) {
std::string title = std::to_string(dimx) + "x" + std::to_string(dimy); std::string title = std::to_string(dimx) + "x" + std::to_string(dimy);

View File

@@ -18,7 +18,7 @@ void RequestAnimationFrame();
using Clock = std::chrono::steady_clock; using Clock = std::chrono::steady_clock;
using TimePoint = std::chrono::time_point<Clock>; using TimePoint = std::chrono::time_point<Clock>;
using Duration = std::chrono::duration<float>; using Duration = std::chrono::duration<double>;
// Parameter of Component::OnAnimation(param). // Parameter of Component::OnAnimation(param).
class Params { class Params {

View File

@@ -92,7 +92,6 @@ Component ResizableSplitLeft(Component main, Component back, int* main_size);
Component ResizableSplitRight(Component main, Component back, int* main_size); Component ResizableSplitRight(Component main, Component back, int* main_size);
Component ResizableSplitTop(Component main, Component back, int* main_size); Component ResizableSplitTop(Component main, Component back, int* main_size);
Component ResizableSplitBottom(Component main, Component back, int* main_size); Component ResizableSplitBottom(Component main, Component back, int* main_size);
Component ResizableSplit(ResizableSplitOption options);
Component Renderer(Component child, std::function<Element()>); Component Renderer(Component child, std::function<Element()>);
Component Renderer(std::function<Element()>); Component Renderer(std::function<Element()>);

View File

@@ -3,14 +3,12 @@
#include <chrono> // for milliseconds #include <chrono> // for milliseconds
#include <ftxui/component/animation.hpp> // for Duration, QuadraticInOut, Function #include <ftxui/component/animation.hpp> // for Duration, QuadraticInOut, Function
#include <ftxui/dom/direction.hpp> // for Direction, Direction::Left, Direction::Right, Direction::Down #include <ftxui/dom/elements.hpp> // for Element, GaugeDirection, GaugeDirection::Right
#include <ftxui/dom/elements.hpp> // for Element, separator
#include <ftxui/util/ref.hpp> // for Ref, ConstRef #include <ftxui/util/ref.hpp> // for Ref, ConstRef
#include <functional> // for function #include <functional> // for function
#include <optional> // for optional #include <optional> // for optional
#include <string> // for string #include <string> // for string
#include "ftxui/component/component_base.hpp" // for Component
#include "ftxui/screen/color.hpp" // for Color, Color::GrayDark, Color::White #include "ftxui/screen/color.hpp" // for Color, Color::GrayDark, Color::White
namespace ftxui { namespace ftxui {
@@ -89,7 +87,8 @@ struct MenuOption {
// Style: // Style:
UnderlineOption underline; UnderlineOption underline;
MenuEntryOption entries; MenuEntryOption entries;
Direction direction = Direction::Down; enum Direction { Up, Down, Left, Right };
Direction direction = Down;
std::function<Element()> elements_prefix; std::function<Element()> elements_prefix;
std::function<Element()> elements_infix; std::function<Element()> elements_infix;
std::function<Element()> elements_postfix; std::function<Element()> elements_postfix;
@@ -165,16 +164,6 @@ struct RadioboxOption {
Ref<int> focused_entry = 0; Ref<int> focused_entry = 0;
}; };
struct ResizableSplitOption {
Component main;
Component back;
Ref<Direction> direction = Direction::Left;
Ref<int> main_size =
(direction() == Direction::Left || direction() == Direction::Right) ? 20
: 10;
std::function<Element()> separator_func = [] { return ::ftxui::separator(); };
};
// @brief Option for the `Slider` component. // @brief Option for the `Slider` component.
// @ingroup component // @ingroup component
template <typename T> template <typename T>
@@ -183,7 +172,7 @@ struct SliderOption {
ConstRef<T> min = T(0); ConstRef<T> min = T(0);
ConstRef<T> max = T(100); ConstRef<T> max = T(100);
ConstRef<T> increment = (max() - min()) / 20; ConstRef<T> increment = (max() - min()) / 20;
Direction direction = Direction::Right; GaugeDirection direction = GaugeDirection::Right;
Color color_active = Color::White; Color color_active = Color::White;
Color color_inactive = Color::GrayDark; Color color_inactive = Color::GrayDark;
}; };

View File

@@ -1,17 +0,0 @@
#ifndef FTXUI_DOM_DIRECTION_HPP
#define FTXUI_DOM_DIRECTION_HPP
namespace ftxui {
enum class Direction {
Up = 0,
Down = 1,
Left = 2,
Right = 3,
};
} // namespace ftxui
#endif // FTXUI_DOM_DIRECTION_HPP
// Copyright 2023 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.

View File

@@ -5,7 +5,6 @@
#include <memory> #include <memory>
#include "ftxui/dom/canvas.hpp" #include "ftxui/dom/canvas.hpp"
#include "ftxui/dom/direction.hpp"
#include "ftxui/dom/flexbox_config.hpp" #include "ftxui/dom/flexbox_config.hpp"
#include "ftxui/dom/linear_gradient.hpp" #include "ftxui/dom/linear_gradient.hpp"
#include "ftxui/dom/node.hpp" #include "ftxui/dom/node.hpp"
@@ -31,6 +30,8 @@ enum BorderStyle {
EMPTY, EMPTY,
}; };
enum class GaugeDirection { Left, Up, Right, Down };
// Pipe elements into decorator togethers. // Pipe elements into decorator togethers.
// For instance the next lines are equivalents: // For instance the next lines are equivalents:
// -> text("ftxui") | bold | underlined // -> text("ftxui") | bold | underlined
@@ -65,7 +66,7 @@ Element gaugeLeft(float progress);
Element gaugeRight(float progress); Element gaugeRight(float progress);
Element gaugeUp(float progress); Element gaugeUp(float progress);
Element gaugeDown(float progress); Element gaugeDown(float progress);
Element gaugeDirection(float progress, Direction direction); Element gaugeDirection(float progress, GaugeDirection);
Element border(Element); Element border(Element);
Element borderLight(Element); Element borderLight(Element);
Element borderDashed(Element); Element borderDashed(Element);
@@ -109,6 +110,8 @@ Element bgcolor(const LinearGradient&, Element);
Decorator focusPosition(int x, int y); Decorator focusPosition(int x, int y);
Decorator focusPositionRelative(float x, float y); Decorator focusPositionRelative(float x, float y);
Element automerge(Element child); Element automerge(Element child);
Decorator hyperlink(std::string link);
Element hyperlink(std::string link, Element child);
// --- Layout is // --- Layout is
// Horizontal, Vertical or stacked set of elements. // Horizontal, Vertical or stacked set of elements.
@@ -140,9 +143,9 @@ Element notflex(Element); // Reset the flex attribute.
Element filler(); // A blank expandable element. Element filler(); // A blank expandable element.
// -- Size override; // -- Size override;
enum WidthOrHeight { WIDTH, HEIGHT }; enum Direction { WIDTH, HEIGHT };
enum Constraint { LESS_THAN, EQUAL, GREATER_THAN }; enum Constraint { LESS_THAN, EQUAL, GREATER_THAN };
Decorator size(WidthOrHeight, Constraint, int value); Decorator size(Direction, Constraint, int value);
// --- Frame --- // --- Frame ---
// A frame is a scrollable area. The internal area is potentially larger than // A frame is a scrollable area. The internal area is potentially larger than

View File

@@ -1,8 +1,9 @@
#ifndef FTXUI_SCREEN_SCREEN_HPP #ifndef FTXUI_SCREEN_SCREEN_HPP
#define FTXUI_SCREEN_SCREEN_HPP #define FTXUI_SCREEN_SCREEN_HPP
#include <cstdint> // for uint8_t
#include <memory> #include <memory>
#include <string> // for string, allocator, basic_string #include <string> // for string, basic_string, allocator
#include <vector> // for vector #include <vector> // for vector
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
@@ -20,6 +21,10 @@ struct Pixel {
// like: a⃦, this can potentially contains multiple codepoitns. // like: a⃦, this can potentially contains multiple codepoitns.
std::string character = " "; std::string character = " ";
// The hyperlink associated with the pixel.
// 0 is the default value, meaning no hyperlink.
uint8_t hyperlink = 0;
// Colors: // Colors:
Color background_color = Color::Default; Color background_color = Color::Default;
Color foreground_color = Color::Default; Color foreground_color = Color::Default;
@@ -99,6 +104,11 @@ class Screen {
Cursor cursor() const { return cursor_; } Cursor cursor() const { return cursor_; }
void SetCursor(Cursor cursor) { cursor_ = cursor; } void SetCursor(Cursor cursor) { cursor_ = cursor; }
// Store an hyperlink in the screen. Return the id of the hyperlink. The id is
// used to identify the hyperlink when the user click on it.
uint8_t RegisterHyperlink(std::string link);
const std::string& Hyperlink(uint8_t id) const;
Box stencil; Box stencil;
protected: protected:
@@ -106,6 +116,7 @@ class Screen {
int dimy_; int dimy_;
std::vector<std::vector<Pixel>> pixels_; std::vector<std::vector<Pixel>> pixels_;
Cursor cursor_; Cursor cursor_;
std::vector<std::string> hyperlinks_ = {""};
}; };
} // namespace ftxui } // namespace ftxui

View File

@@ -2,6 +2,7 @@
#define FTXUI_SCREEN_STRING_HPP #define FTXUI_SCREEN_STRING_HPP
#include <stddef.h> // for size_t #include <stddef.h> // for size_t
#include <cstdint> // for uint8_t
#include <string> // for string, wstring, to_string #include <string> // for string, wstring, to_string
#include <vector> // for vector #include <vector> // for vector

View File

@@ -14,6 +14,32 @@
{ include: ["<gtest/gtest-printers.h>", "private", "<gtest/gtest.h>", "public" ] }, { include: ["<gtest/gtest-printers.h>", "private", "<gtest/gtest.h>", "public" ] },
{ include: ["<gtest/gtest-test-part.h>", "private", "<gtest/gtest.h>", "public" ] }, { include: ["<gtest/gtest-test-part.h>", "private", "<gtest/gtest.h>", "public" ] },
{ include: ["<gtest/gtest-typed-test.h>", "private", "<gtest/gtest.h>", "public" ] }, { include: ["<gtest/gtest-typed-test.h>", "private", "<gtest/gtest.h>", "public" ] },
{ include: ["<assert.h>", "private", "<cassert>", "public" ] },
{ include: ["<complex.h>", "private", "<ccomplex>", "public" ] },
{ include: ["<ctype.h>", "private", "<cctype>", "public" ] },
{ include: ["<errno.h>", "private", "<cerrno>", "public" ] },
{ include: ["<fenv.h>", "private", "<cfenv>", "public" ] },
{ include: ["<float.h>", "private", "<cfloat>", "public" ] },
{ include: ["<inttypes.h>", "private", "<cinttypes>", "public" ] },
{ include: ["<iso646.h>", "private", "<ciso646>", "public" ] },
{ include: ["<limits.h>", "private", "<climits>", "public" ] },
{ include: ["<locale.h>", "private", "<clocale>", "public" ] },
{ include: ["<math.h>", "private", "<cmath>", "public" ] },
{ include: ["<setjmp.h>", "private", "<csetjmp>", "public" ] },
{ include: ["<signal.h>", "private", "<csignal>", "public" ] },
{ include: ["<stdalign.h>", "private", "<cstdalign>", "public" ] },
{ include: ["<stdarg.h>", "private", "<cstdarg>", "public" ] },
{ include: ["<stdbool.h>", "private", "<cstdbool>", "public" ] },
{ include: ["<stddef.h>", "private", "<cstddef>", "public" ] },
{ include: ["<stdint.h>", "private", "<cstdint>", "public" ] },
{ include: ["<stdio.h>", "private", "<cstdio>", "public" ] },
{ include: ["<stdlib.h>", "private", "<cstdlib>", "public" ] },
{ include: ["<string.h>", "private", "<cstring>", "public" ] },
{ include: ["<tgmath.h>", "private", "<ctgmath>", "public" ] },
{ include: ["<time.h>", "private", "<ctime>", "public" ] },
{ include: ["<uchar.h>", "private", "<cuchar>", "public" ] },
{ include: ["<wchar.h>", "private", "<cwchar>", "public" ] },
{ include: ["<wctype.h>", "private", "<cwctype>", "public" ] },
{ symbol: ["ftxui", "private", "", "public" ] }, { symbol: ["ftxui", "private", "", "public" ] },
{ symbol: ["char_traits", "private", "<string>", "public" ] }, { symbol: ["char_traits", "private", "<string>", "public" ] },
{ symbol: ["ECHO", "private", "<termios.h>", "public" ] }, { symbol: ["ECHO", "private", "<termios.h>", "public" ] },

View File

@@ -9,8 +9,8 @@ namespace ftxui::animation {
namespace easing { namespace easing {
namespace { namespace {
constexpr float kPi = 3.14159265358979323846f; constexpr float kPi = 3.14159265358979323846F;
constexpr float kPi2 = kPi / 2.f; constexpr float kPi2 = kPi / 2.F;
} // namespace } // namespace
// Easing function have been taken out of: // Easing function have been taken out of:
@@ -37,16 +37,18 @@ float QuadraticIn(float p) {
// Modeled after the parabola y = -x^2 + 2x // Modeled after the parabola y = -x^2 + 2x
float QuadraticOut(float p) { float QuadraticOut(float p) {
return -(p * (p - 2.f)); return -(p * (p - 2));
} }
// Modeled after the piecewise quadratic // Modeled after the piecewise quadratic
// y = (1/2)((2x)^2) ; [0, 0.5) // y = (1/2)((2x)^2) ; [0, 0.5)
// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] // y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1]
float QuadraticInOut(float p) { float QuadraticInOut(float p) {
return p < 0.5f // NOLINT if (p < 0.5F) { // NOLINT
? 2.f * p * p // NOLINT return 2 * p * p;
: (-2.f * p * p) + (4.f * p) - 1.f; // NOLINT } else {
return (-2 * p * p) + (4 * p) - 1;
}
} }
// Modeled after the cubic y = x^3 // Modeled after the cubic y = x^3
@@ -56,19 +58,20 @@ float CubicIn(float p) {
// Modeled after the cubic y = (x - 1)^3 + 1 // Modeled after the cubic y = (x - 1)^3 + 1
float CubicOut(float p) { float CubicOut(float p) {
const float f = (p - 1.f); const float f = (p - 1);
return f * f * f + 1.f; return f * f * f + 1;
} }
// Modeled after the piecewise cubic // Modeled after the piecewise cubic
// y = (1/2)((2x)^3) ; [0, 0.5) // y = (1/2)((2x)^3) ; [0, 0.5)
// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] // y = (1/2)((2x-2)^3 + 2) ; [0.5, 1]
float CubicInOut(float p) { float CubicInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 4.f * p * p * p; return 4 * p * p * p;
} else {
const float f = ((2 * p) - 2);
return 0.5F * f * f * f + 1; // NOLINT
} }
const float f = ((2.f * p) - 2.f);
return 0.5f * f * f * f + 1.f; // NOLINT
} }
// Modeled after the quartic x^4 // Modeled after the quartic x^4
@@ -78,19 +81,20 @@ float QuarticIn(float p) {
// Modeled after the quartic y = 1 - (x - 1)^4 // Modeled after the quartic y = 1 - (x - 1)^4
float QuarticOut(float p) { float QuarticOut(float p) {
const float f = (p - 1.f); const float f = (p - 1);
return f * f * f * (1.f - p) + 1.f; return f * f * f * (1 - p) + 1;
} }
// Modeled after the piecewise quartic // Modeled after the piecewise quartic
// y = (1/2)((2x)^4) ; [0, 0.5) // y = (1/2)((2x)^4) ; [0, 0.5)
// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] // y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1]
float QuarticInOut(float p) { float QuarticInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 8.f * p * p * p * p; // NOLINT return 8 * p * p * p * p; // NOLINT
} else {
const float f = (p - 1);
return -8 * f * f * f * f + 1; // NOLINT
} }
const float f = (p - 1.f);
return -8.f * f * f * f * f + 1.f; // NOLINT
} }
// Modeled after the quintic y = x^5 // Modeled after the quintic y = x^5
@@ -100,24 +104,25 @@ float QuinticIn(float p) {
// Modeled after the quintic y = (x - 1)^5 + 1 // Modeled after the quintic y = (x - 1)^5 + 1
float QuinticOut(float p) { float QuinticOut(float p) {
const float f = (p - 1.f); const float f = (p - 1);
return f * f * f * f * f + 1.f; return f * f * f * f * f + 1;
} }
// Modeled after the piecewise quintic // Modeled after the piecewise quintic
// y = (1/2)((2x)^5) ; [0, 0.5) // y = (1/2)((2x)^5) ; [0, 0.5)
// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] // y = (1/2)((2x-2)^5 + 2) ; [0.5, 1]
float QuinticInOut(float p) { float QuinticInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 16.f * p * p * p * p * p; // NOLINT return 16 * p * p * p * p * p; // NOLINT
} else { // NOLINT
float f = ((2 * p) - 2); // NOLINT
return 0.5 * f * f * f * f * f + 1; // NOLINT
} }
float f = ((2.f * p) - 2.f); // NOLINT
return 0.5f * f * f * f * f * f + 1.f; // NOLINT
} }
// Modeled after quarter-cycle of sine wave // Modeled after quarter-cycle of sine wave
float SineIn(float p) { float SineIn(float p) {
return std::sin((p - 1.f) * kPi2) + 1.f; return std::sin((p - 1) * kPi2) + 1;
} }
// Modeled after quarter-cycle of sine wave (different phase) // Modeled after quarter-cycle of sine wave (different phase)
@@ -127,77 +132,79 @@ float SineOut(float p) {
// Modeled after half sine wave // Modeled after half sine wave
float SineInOut(float p) { float SineInOut(float p) {
return 0.5f * (1.f - std::cos(p * kPi)); // NOLINT return 0.5F * (1 - std::cos(p * kPi)); // NOLINT
} }
// Modeled after shifted quadrant IV of unit circle // Modeled after shifted quadrant IV of unit circle
float CircularIn(float p) { float CircularIn(float p) {
return 1.f - std::sqrt(1.f - (p * p)); return 1 - std::sqrt(1 - (p * p));
} }
// Modeled after shifted quadrant II of unit circle // Modeled after shifted quadrant II of unit circle
float CircularOut(float p) { float CircularOut(float p) {
return std::sqrt((2.f - p) * p); return std::sqrt((2 - p) * p);
} }
// Modeled after the piecewise circular function // Modeled after the piecewise circular function
// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) // y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5)
// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] // y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1]
float CircularInOut(float p) { float CircularInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 0.5f * (1.f - std::sqrt(1.f - 4.f * (p * p))); // NOLINT return 0.5F * (1 - std::sqrt(1 - 4 * (p * p))); // NOLINT
} else {
return 0.5F * (std::sqrt(-((2 * p) - 3) * ((2 * p) - 1)) + 1); // NOLINT
} }
// NOLINTNEXTLINE
return 0.5f * (std::sqrt(-((2.f * p) - 3.f) * ((2.f * p) - 1.f)) + 1.f);
} }
// Modeled after the exponential function y = 2^(10(x - 1)) // Modeled after the exponential function y = 2^(10(x - 1))
float ExponentialIn(float p) { float ExponentialIn(float p) {
return (p == 0.f) ? p : std::pow(2.f, 10.f * (p - 1.f)); // NOLINT return (p == 0.0) ? p : std::pow(2, 10 * (p - 1)); // NOLINT
} }
// Modeled after the exponential function y = -2^(-10x) + 1 // Modeled after the exponential function y = -2^(-10x) + 1
float ExponentialOut(float p) { float ExponentialOut(float p) {
return (p == 1.f) ? p : 1.f - std::pow(2.f, -10.f * p); // NOLINT return (p == 1.0) ? p : 1 - std::pow(2, -10 * p); // NOLINT
} }
// Modeled after the piecewise exponential // Modeled after the piecewise exponential
// y = (1/2)2^(10(2x - 1)) ; [0,0.5) // y = (1/2)2^(10(2x - 1)) ; [0,0.5)
// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] // y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1]
float ExponentialInOut(float p) { float ExponentialInOut(float p) {
if (p == 0.f || p == 1.f) { if (p == 0.0 || p == 1.F) {
return p; return p;
} }
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 0.5f * std::pow(2.f, (20.f * p) - 10.f); // NOLINT return 0.5 * std::pow(2, (20 * p) - 10); // NOLINT
} else { // NOLINT
return -0.5 * std::pow(2, (-20 * p) + 10) + 1; // NOLINT
} }
return -0.5f * std::pow(2.f, (-20.f * p) + 10.f) + 1.f; // NOLINT
} }
// Modeled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) // Modeled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1))
float ElasticIn(float p) { float ElasticIn(float p) {
return std::sin(13.f * kPi2 * p) * std::pow(2.f, 10.f * (p - 1.f)); // NOLINT return std::sin(13.F * kPi2 * p) * std::pow(2.F, 10.F * (p - 1)); // NOLINT
} }
// Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + // Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) +
// 1 // 1
float ElasticOut(float p) { float ElasticOut(float p) {
// NOLINTNEXTLINE // NOLINTNEXTLINE
return std::sin(-13.f * kPi2 * (p + 1.f)) * std::pow(2.f, -10.f * p) + 1.f; return std::sin(-13.F * kPi2 * (p + 1)) * std::pow(2.F, -10.F * p) + 1;
} }
// Modeled after the piecewise exponentially-damped sine wave: // Modeled after the piecewise exponentially-damped sine wave:
// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) // y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5)
// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] // y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1]
float ElasticInOut(float p) { float ElasticInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 0.5f * std::sin(13.f * kPi2 * (2.f * p)) * // NOLINT return 0.5 * std::sin(13.F * kPi2 * (2 * p)) * // NOLINT
std::pow(2.f, 10.f * ((2.f * p) - 1.f)); // NOLINT std::pow(2, 10 * ((2 * p) - 1)); // NOLINT
} else { // NOLINT
return 0.5 * (std::sin(-13.F * kPi2 * ((2 * p - 1) + 1)) * // NOLINT
std::pow(2, -10 * (2 * p - 1)) + // NOLINT
2); // NOLINT
} }
return 0.5f * (std::sin(-13.f * kPi2 * ((2.f * p - 1.f) + 1.f)) * // NOLINT
std::pow(2.f, -10.f * (2.f * p - 1.f)) + // NOLINT
2.f); // NOLINT
} }
// Modeled after the overshooting cubic y = x^3-x*sin(x*pi) // Modeled after the overshooting cubic y = x^3-x*sin(x*pi)
@@ -207,48 +214,46 @@ float BackIn(float p) {
// Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi)) // Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi))
float BackOut(float p) { float BackOut(float p) {
const float f = (1.f - p); const float f = (1 - p);
return 1.f - (f * f * f - f * std::sin(f * kPi)); return 1 - (f * f * f - f * std::sin(f * kPi));
} }
// Modeled after the piecewise overshooting cubic function: // Modeled after the piecewise overshooting cubic function:
// y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5) // y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5)
// y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1] // y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1]
float BackInOut(float p) { float BackInOut(float p) {
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
const float f = 2.f * p; const float f = 2 * p;
return 0.5f * (f * f * f - f * std::sin(f * kPi)); // NOLINT return 0.5F * (f * f * f - f * std::sin(f * kPi)); // NOLINT
} else {
float f = (1 - (2 * p - 1)); // NOLINT
return 0.5F * (1 - (f * f * f - f * std::sin(f * kPi))) + 0.5; // NOLINT
} }
const float f = (1.f - (2.f * p - 1.f)); // NOLINT
return 0.5f * (1.f - (f * f * f - f * std::sin(f * kPi))) + 0.5f; // NOLINT
} }
float BounceIn(float p) { float BounceIn(float p) {
return 1.f - BounceOut(1.f - p); return 1 - BounceOut(1 - p);
} }
float BounceOut(float p) { float BounceOut(float p) {
if (p < 4.f / 11.f) { // NOLINT if (p < 4 / 11.0) { // NOLINT
return (121.f * p * p) / 16.f; // NOLINT return (121 * p * p) / 16.0; // NOLINT
} else if (p < 8 / 11.0) { // NOLINT
return (363 / 40.0 * p * p) - (99 / 10.0 * p) + 17 / 5.0; // NOLINT
} else if (p < 9 / 10.0) { // NOLINT
return (4356 / 361.0 * p * p) - (35442 / 1805.0 * p) + // NOLINT
16061 / 1805.0; // NOLINT
} else { // NOLINT
return (54 / 5.0 * p * p) - (513 / 25.0 * p) + 268 / 25.0; // NOLINT
} }
if (p < 8.f / 11.f) { // NOLINT
return (363.f / 40.f * p * p) - (99.f / 10.f * p) + 17.f / 5.f; // NOLINT
}
if (p < 9.f / 10.f) { // NOLINT
return (4356.f / 361.f * p * p) - (35442.f / 1805.f * p) + // NOLINT
16061.f / 1805.f; // NOLINT
}
return (54.f / 5.f * p * p) - (513 / 25.f * p) + 268 / 25.f; // NOLINT
} }
float BounceInOut(float p) { // NOLINT float BounceInOut(float p) { // NOLINT
if (p < 0.5f) { // NOLINT if (p < 0.5F) { // NOLINT
return 0.5f * BounceIn(p * 2.f); // NOLINT return 0.5F * BounceIn(p * 2); // NOLINT
} else { // NOLINT
return 0.5F * BounceOut(p * 2 - 1) + 0.5F; // NOLINT
} }
return 0.5f * BounceOut(p * 2.f - 1.f) + 0.5f; // NOLINT
} }
} // namespace easing } // namespace easing

View File

@@ -96,7 +96,7 @@ MenuOption GeneratorMenuOption(const char* data, size_t size) {
MenuOption option; MenuOption option;
option.underline = GeneratorUnderlineOption(data, size); option.underline = GeneratorUnderlineOption(data, size);
option.entries = GeneratorMenuEntryOption(data, size); option.entries = GeneratorMenuEntryOption(data, size);
option.direction = static_cast<Direction>(GeneratorInt(data, size) % 4); option.direction = static_cast<MenuOption::Direction>(GeneratorInt(data, size) % 4);
return option; return option;
} }

View File

@@ -1,5 +1,6 @@
#include <algorithm> // for max, min #include <algorithm> // for max, min
#include <cstddef> // for size_t #include <cstddef> // for size_t
#include <cstdint> // for uint32_t
#include <functional> // for function #include <functional> // for function
#include <memory> // for shared_ptr #include <memory> // for shared_ptr
#include <string> // for string, allocator #include <string> // for string, allocator

View File

@@ -1,6 +1,5 @@
#include <algorithm> // for max, fill_n, reverse #include <algorithm> // for max, fill_n, reverse
#include <chrono> // for milliseconds #include <chrono> // for milliseconds
#include <ftxui/dom/direction.hpp> // for Direction, Direction::Down, Direction::Left, Direction::Right, Direction::Up
#include <functional> // for function #include <functional> // for function
#include <memory> // for allocator_traits<>::value_type, swap #include <memory> // for allocator_traits<>::value_type, swap
#include <string> // for operator+, string #include <string> // for operator+, string
@@ -11,7 +10,7 @@
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse #include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
#include "ftxui/component/component.hpp" // for Make, Menu, MenuEntry, Toggle #include "ftxui/component/component.hpp" // for Make, Menu, MenuEntry, Toggle
#include "ftxui/component/component_base.hpp" // for ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/component_options.hpp" // for MenuOption, MenuEntryOption, UnderlineOption, AnimatedColorOption, AnimatedColorsOption, EntryState #include "ftxui/component/component_options.hpp" // for MenuOption, MenuEntryOption, MenuOption::Direction, UnderlineOption, AnimatedColorOption, AnimatedColorsOption, EntryState, MenuOption::Down, MenuOption::Left, MenuOption::Right, MenuOption::Up
#include "ftxui/component/event.hpp" // for Event, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp, Event::End, Event::Home, Event::PageDown, Event::PageUp, Event::Return, Event::Tab, Event::TabReverse #include "ftxui/component/event.hpp" // for Event, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp, Event::End, Event::Home, Event::PageDown, Event::PageUp, Event::Return, Event::Tab, Event::TabReverse
#include "ftxui/component/mouse.hpp" // for Mouse, Mouse::Left, Mouse::Released, Mouse::WheelDown, Mouse::WheelUp, Mouse::None #include "ftxui/component/mouse.hpp" // for Mouse, Mouse::Left, Mouse::Released, Mouse::WheelDown, Mouse::WheelUp, Mouse::None
#include "ftxui/component/screen_interactive.hpp" // for Component #include "ftxui/component/screen_interactive.hpp" // for Component
@@ -37,25 +36,25 @@ Element DefaultOptionTransform(const EntryState& state) {
return e; return e;
} }
bool IsInverted(Direction direction) { bool IsInverted(MenuOption::Direction direction) {
switch (direction) { switch (direction) {
case Direction::Up: case MenuOption::Direction::Up:
case Direction::Left: case MenuOption::Direction::Left:
return true; return true;
case Direction::Down: case MenuOption::Direction::Down:
case Direction::Right: case MenuOption::Direction::Right:
return false; return false;
} }
return false; // NOT_REACHED() return false; // NOT_REACHED()
} }
bool IsHorizontal(Direction direction) { bool IsHorizontal(MenuOption::Direction direction) {
switch (direction) { switch (direction) {
case Direction::Left: case MenuOption::Direction::Left:
case Direction::Right: case MenuOption::Direction::Right:
return true; return true;
case Direction::Down: case MenuOption::Direction::Down:
case Direction::Up: case MenuOption::Direction::Up:
return false; return false;
} }
return false; // NOT_REACHED() return false; // NOT_REACHED()
@@ -179,56 +178,56 @@ class MenuBase : public ComponentBase {
void OnUp() { void OnUp() {
switch (option_->direction) { switch (option_->direction) {
case Direction::Up: case MenuOption::Direction::Up:
(*selected_)++; (*selected_)++;
break; break;
case Direction::Down: case MenuOption::Direction::Down:
(*selected_)--; (*selected_)--;
break; break;
case Direction::Left: case MenuOption::Direction::Left:
case Direction::Right: case MenuOption::Direction::Right:
break; break;
} }
} }
void OnDown() { void OnDown() {
switch (option_->direction) { switch (option_->direction) {
case Direction::Up: case MenuOption::Direction::Up:
(*selected_)--; (*selected_)--;
break; break;
case Direction::Down: case MenuOption::Direction::Down:
(*selected_)++; (*selected_)++;
break; break;
case Direction::Left: case MenuOption::Direction::Left:
case Direction::Right: case MenuOption::Direction::Right:
break; break;
} }
} }
void OnLeft() { void OnLeft() {
switch (option_->direction) { switch (option_->direction) {
case Direction::Left: case MenuOption::Direction::Left:
(*selected_)++; (*selected_)++;
break; break;
case Direction::Right: case MenuOption::Direction::Right:
(*selected_)--; (*selected_)--;
break; break;
case Direction::Down: case MenuOption::Direction::Down:
case Direction::Up: case MenuOption::Direction::Up:
break; break;
} }
} }
void OnRight() { void OnRight() {
switch (option_->direction) { switch (option_->direction) {
case Direction::Left: case MenuOption::Direction::Left:
(*selected_)--; (*selected_)--;
break; break;
case Direction::Right: case MenuOption::Direction::Right:
(*selected_)++; (*selected_)++;
break; break;
case Direction::Down: case MenuOption::Direction::Down:
case Direction::Up: case MenuOption::Direction::Up:
break; break;
} }
} }

View File

@@ -1,6 +1,5 @@
#include <gtest/gtest.h> // for Test, EXPECT_EQ, Message, TestPartResult, TestInfo (ptr only), TEST #include <gtest/gtest.h> // for Test, EXPECT_EQ, Message, TestPartResult, TestInfo (ptr only), TEST
#include <chrono> // for operator""s, chrono_literals #include <chrono> // for operator""s, chrono_literals
#include <ftxui/dom/direction.hpp> // for Direction, Direction::Down, Direction::Left, Direction::Right, Direction::Up
#include <memory> // for __shared_ptr_access, shared_ptr, allocator #include <memory> // for __shared_ptr_access, shared_ptr, allocator
#include <string> // for string, basic_string #include <string> // for string, basic_string
#include <vector> // for vector #include <vector> // for vector
@@ -8,7 +7,7 @@
#include "ftxui/component/animation.hpp" // for Duration, Params #include "ftxui/component/animation.hpp" // for Duration, Params
#include "ftxui/component/component.hpp" // for Menu #include "ftxui/component/component.hpp" // for Menu
#include "ftxui/component/component_base.hpp" // for ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/component_options.hpp" // for MenuOption #include "ftxui/component/component_options.hpp" // for MenuOption, MenuOption::Down, MenuOption::Left, MenuOption::Right, MenuOption::Up
#include "ftxui/component/event.hpp" // for Event, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp, Event::Return #include "ftxui/component/event.hpp" // for Event, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp, Event::Return
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render
#include "ftxui/screen/screen.hpp" // for Screen #include "ftxui/screen/screen.hpp" // for Screen
@@ -54,7 +53,7 @@ TEST(MenuTest, DirectionDown) {
auto menu = Menu(&entries, &selected, &option); auto menu = Menu(&entries, &selected, &option);
selected = 0; selected = 0;
option.direction = Direction::Down; option.direction = MenuOption::Down;
Screen screen(4, 3); Screen screen(4, 3);
Render(screen, menu->Render()); Render(screen, menu->Render());
EXPECT_EQ(screen.ToString(), EXPECT_EQ(screen.ToString(),
@@ -81,7 +80,7 @@ TEST(MenuTest, DirectionsUp) {
std::vector<std::string> entries = {"1", "2", "3"}; std::vector<std::string> entries = {"1", "2", "3"};
MenuOption option; MenuOption option;
auto menu = Menu(&entries, &selected, &option); auto menu = Menu(&entries, &selected, &option);
option.direction = Direction::Up; option.direction = MenuOption::Up;
Screen screen(4, 3); Screen screen(4, 3);
Render(screen, menu->Render()); Render(screen, menu->Render());
EXPECT_EQ(screen.ToString(), EXPECT_EQ(screen.ToString(),
@@ -107,7 +106,7 @@ TEST(MenuTest, DirectionsRight) {
std::vector<std::string> entries = {"1", "2", "3"}; std::vector<std::string> entries = {"1", "2", "3"};
MenuOption option; MenuOption option;
auto menu = Menu(&entries, &selected, &option); auto menu = Menu(&entries, &selected, &option);
option.direction = Direction::Right; option.direction = MenuOption::Right;
Screen screen(10, 1); Screen screen(10, 1);
Render(screen, menu->Render()); Render(screen, menu->Render());
EXPECT_EQ(screen.ToString(), EXPECT_EQ(screen.ToString(),
@@ -133,7 +132,7 @@ TEST(MenuTest, DirectionsLeft) {
std::vector<std::string> entries = {"1", "2", "3"}; std::vector<std::string> entries = {"1", "2", "3"};
MenuOption option; MenuOption option;
auto menu = Menu(&entries, &selected, &option); auto menu = Menu(&entries, &selected, &option);
option.direction = Direction::Left; option.direction = MenuOption::Left;
Screen screen(10, 1); Screen screen(10, 1);
Render(screen, menu->Render()); Render(screen, menu->Render());
EXPECT_EQ(screen.ToString(), EXPECT_EQ(screen.ToString(),

View File

@@ -1,28 +1,26 @@
#include <ftxui/component/component_options.hpp> // for ResizableSplitOption #include <memory> // for __shared_ptr_access
#include <ftxui/dom/direction.hpp> // for Direction, Direction::Down, Direction::Left, Direction::Right, Direction::Up
#include <ftxui/util/ref.hpp> // for Ref
#include <functional> // for function
#include <memory> // for __shared_ptr_access, shared_ptr, allocator
#include <utility> // for move #include <utility> // for move
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse #include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
#include "ftxui/component/component.hpp" // for Horizontal, Make, ResizableSplit, ResizableSplitBottom, ResizableSplitLeft, ResizableSplitRight, ResizableSplitTop #include "ftxui/component/component.hpp" // for Component, Make, Horizontal, Vertical, ResizableSplitBottom, ResizableSplitLeft, ResizableSplitRight, ResizableSplitTop
#include "ftxui/component/component_base.hpp" // for Component, ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/event.hpp" // for Event #include "ftxui/component/event.hpp" // for Event
#include "ftxui/component/mouse.hpp" // for Mouse, Mouse::Left, Mouse::Pressed, Mouse::Released #include "ftxui/component/mouse.hpp" // for Mouse, Mouse::Left, Mouse::Pressed, Mouse::Released
#include "ftxui/dom/elements.hpp" // for operator|, reflect, Element, size, EQUAL, xflex, yflex, hbox, vbox, HEIGHT, WIDTH, text #include "ftxui/dom/elements.hpp" // for operator|, reflect, Element, separator, size, EQUAL, xflex, yflex, hbox, vbox, HEIGHT, WIDTH
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
namespace ftxui { namespace ftxui {
namespace { namespace {
class ResizableSplitBase : public ComponentBase { class ResizableSplitLeftBase : public ComponentBase {
public: public:
ResizableSplitBase(ResizableSplitOption options) ResizableSplitLeftBase(Component main, Component child, int* main_size)
: options_(std::move(options)) { : main_(std::move(main)),
child_(std::move(child)),
main_size_(main_size) {
Add(Container::Horizontal({ Add(Container::Horizontal({
options_->main, main_,
options_->back, child_,
})); }));
} }
@@ -47,86 +45,204 @@ class ResizableSplitBase : public ComponentBase {
return true; return true;
} }
if (!captured_mouse_) { if (captured_mouse_) {
*main_size_ = event.mouse().x - box_.x_min;
return true;
}
return ComponentBase::OnEvent(event); return ComponentBase::OnEvent(event);
} }
switch (options_->direction()) {
case Direction::Left:
options_->main_size() = event.mouse().x - box_.x_min;
return true;
case Direction::Right:
options_->main_size() = box_.x_max - event.mouse().x;
return true;
case Direction::Up:
options_->main_size() = event.mouse().y - box_.y_min;
return true;
case Direction::Down:
options_->main_size() = box_.y_max - event.mouse().y;
return true;
}
// NOTREACHED()
return false;
}
Element Render() final { Element Render() final {
switch (options_->direction()) {
case Direction::Left:
return RenderLeft();
case Direction::Right:
return RenderRight();
case Direction::Up:
return RenderTop();
case Direction::Down:
return RenderBottom();
}
// NOTREACHED()
return text("unreacheable");
}
Element RenderLeft() {
return hbox({ return hbox({
options_->main->Render() | main_->Render() | size(WIDTH, EQUAL, *main_size_),
size(WIDTH, EQUAL, options_->main_size()), separator() | reflect(separator_box_),
options_->separator_func() | reflect(separator_box_), child_->Render() | xflex,
options_->back->Render() | xflex,
}) |
reflect(box_);
};
Element RenderRight() {
return hbox({
options_->back->Render() | xflex,
options_->separator_func() | reflect(separator_box_),
options_->main->Render() |
size(WIDTH, EQUAL, options_->main_size()),
}) |
reflect(box_);
};
Element RenderTop() {
return vbox({
options_->main->Render() |
size(HEIGHT, EQUAL, options_->main_size()),
options_->separator_func() | reflect(separator_box_),
options_->back->Render() | yflex,
}) |
reflect(box_);
};
Element RenderBottom() {
return vbox({
options_->back->Render() | yflex,
options_->separator_func() | reflect(separator_box_),
options_->main->Render() |
size(HEIGHT, EQUAL, options_->main_size()),
}) | }) |
reflect(box_); reflect(box_);
}; };
private: private:
Ref<ResizableSplitOption> options_; Component main_;
Component child_;
int* const main_size_;
CapturedMouse captured_mouse_;
Box separator_box_;
Box box_;
};
class ResizableSplitRightBase : public ComponentBase {
public:
ResizableSplitRightBase(Component main, Component child, int* main_size)
: main_(std::move(main)),
child_(std::move(child)),
main_size_(main_size) {
Add(Container::Horizontal({
child_,
main_,
}));
}
bool OnEvent(Event event) final {
if (event.is_mouse()) {
return OnMouseEvent(std::move(event));
}
return ComponentBase::OnEvent(std::move(event));
}
bool OnMouseEvent(Event event) {
if (captured_mouse_ && event.mouse().motion == Mouse::Released) {
captured_mouse_.reset();
return true;
}
if (event.mouse().button == Mouse::Left &&
event.mouse().motion == Mouse::Pressed &&
separator_box_.Contain(event.mouse().x, event.mouse().y) &&
!captured_mouse_) {
captured_mouse_ = CaptureMouse(event);
return true;
}
if (captured_mouse_) {
*main_size_ = box_.x_max - event.mouse().x;
return true;
}
return ComponentBase::OnEvent(event);
}
Element Render() final {
return hbox({
child_->Render() | xflex,
separator() | reflect(separator_box_),
main_->Render() | size(WIDTH, EQUAL, *main_size_),
}) |
reflect(box_);
};
private:
Component main_;
Component child_;
int* const main_size_;
CapturedMouse captured_mouse_;
Box separator_box_;
Box box_;
};
class ResizableSplitTopBase : public ComponentBase {
public:
ResizableSplitTopBase(Component main, Component child, int* main_size)
: main_(std::move(main)),
child_(std::move(child)),
main_size_(main_size) {
Add(Container::Vertical({
main_,
child_,
}));
}
bool OnEvent(Event event) final {
if (event.is_mouse()) {
return OnMouseEvent(std::move(event));
}
return ComponentBase::OnEvent(std::move(event));
}
bool OnMouseEvent(Event event) {
if (captured_mouse_ && event.mouse().motion == Mouse::Released) {
captured_mouse_.reset();
return true;
}
if (event.mouse().button == Mouse::Left &&
event.mouse().motion == Mouse::Pressed &&
separator_box_.Contain(event.mouse().x, event.mouse().y) &&
!captured_mouse_) {
captured_mouse_ = CaptureMouse(event);
return true;
}
if (captured_mouse_) {
*main_size_ = event.mouse().y - box_.y_min;
return true;
}
return ComponentBase::OnEvent(event);
}
Element Render() final {
return vbox({
main_->Render() | size(HEIGHT, EQUAL, *main_size_),
separator() | reflect(separator_box_),
child_->Render() | yflex,
}) |
reflect(box_);
};
private:
Component main_;
Component child_;
int* const main_size_;
CapturedMouse captured_mouse_;
Box separator_box_;
Box box_;
};
class ResizableSplitBottomBase : public ComponentBase {
public:
ResizableSplitBottomBase(Component main, Component child, int* main_size)
: main_(std::move(main)),
child_(std::move(child)),
main_size_(main_size) {
Add(Container::Vertical({
child_,
main_,
}));
}
bool OnEvent(Event event) final {
if (event.is_mouse()) {
return OnMouseEvent(std::move(event));
}
return ComponentBase::OnEvent(std::move(event));
}
bool OnMouseEvent(Event event) {
if (captured_mouse_ && event.mouse().motion == Mouse::Released) {
captured_mouse_.reset();
return true;
}
if (event.mouse().button == Mouse::Left &&
event.mouse().motion == Mouse::Pressed &&
separator_box_.Contain(event.mouse().x, event.mouse().y) &&
!captured_mouse_) {
captured_mouse_ = CaptureMouse(event);
return true;
}
if (captured_mouse_) {
*main_size_ = box_.y_max - event.mouse().y;
return true;
}
return ComponentBase::OnEvent(event);
}
Element Render() final {
return vbox({
child_->Render() | yflex,
separator() | reflect(separator_box_),
main_->Render() | size(HEIGHT, EQUAL, *main_size_),
}) |
reflect(box_);
};
private:
Component main_;
Component child_;
int* const main_size_;
CapturedMouse captured_mouse_; CapturedMouse captured_mouse_;
Box separator_box_; Box separator_box_;
Box box_; Box box_;
@@ -134,35 +250,6 @@ class ResizableSplitBase : public ComponentBase {
} // namespace } // namespace
/// @brief A split in between two components.
/// @param options: all the parameters.
///
/// ### Example
///
/// ```cpp
/// auto left = Renderer([] { return text("Left") | center;});
/// auto right = Renderer([] { return text("right") | center;});
/// int left_size = 10;
/// auto component = ResizableSplit({
/// .main = left,
/// .back = right,
/// .direction = Direction::Left,
/// .main_size = &left_size,
/// .separator_func = [] { return separatorDouble(); },
/// });
/// ```
///
/// ### Output
///
/// ```bash
/// ║
/// left ║ right
/// ║
/// ```
Component ResizableSplit(ResizableSplitOption options) {
return Make<ResizableSplitBase>(std::move(options));
}
/// @brief An horizontal split in between two components, configurable using the /// @brief An horizontal split in between two components, configurable using the
/// mouse. /// mouse.
/// @param main The main component of size |main_size|, on the left. /// @param main The main component of size |main_size|, on the left.
@@ -189,12 +276,8 @@ Component ResizableSplit(ResizableSplitOption options) {
/// │ /// │
/// ``` /// ```
Component ResizableSplitLeft(Component main, Component back, int* main_size) { Component ResizableSplitLeft(Component main, Component back, int* main_size) {
return ResizableSplit({ return Make<ResizableSplitLeftBase>(std::move(main), std::move(back),
std::move(main), main_size);
std::move(back),
Direction::Left,
main_size,
});
} }
/// @brief An horizontal split in between two components, configurable using the /// @brief An horizontal split in between two components, configurable using the
@@ -211,7 +294,7 @@ Component ResizableSplitLeft(Component main, Component back, int* main_size) {
/// int right_size = 10; /// int right_size = 10;
/// auto left = Renderer([] { return text("Left") | center;}); /// auto left = Renderer([] { return text("Left") | center;});
/// auto right = Renderer([] { return text("right") | center;}); /// auto right = Renderer([] { return text("right") | center;});
/// auto split = ResizableSplitRight(right, left, &right_size) /// auto split = ResizableSplitRight(right, left, &right_size);
/// screen.Loop(split); /// screen.Loop(split);
/// ``` /// ```
/// ///
@@ -223,12 +306,8 @@ Component ResizableSplitLeft(Component main, Component back, int* main_size) {
/// │ /// │
/// ``` /// ```
Component ResizableSplitRight(Component main, Component back, int* main_size) { Component ResizableSplitRight(Component main, Component back, int* main_size) {
return ResizableSplit({ return Make<ResizableSplitRightBase>(std::move(main), std::move(back),
std::move(main), main_size);
std::move(back),
Direction::Right,
main_size,
});
} }
/// @brief An vertical split in between two components, configurable using the /// @brief An vertical split in between two components, configurable using the
@@ -245,7 +324,7 @@ Component ResizableSplitRight(Component main, Component back, int* main_size) {
/// int top_size = 1; /// int top_size = 1;
/// auto top = Renderer([] { return text("Top") | center;}); /// auto top = Renderer([] { return text("Top") | center;});
/// auto bottom = Renderer([] { return text("Bottom") | center;}); /// auto bottom = Renderer([] { return text("Bottom") | center;});
/// auto split = ResizableSplitTop(top, bottom, &top_size) /// auto split = ResizableSplitTop(top, bottom, &top_size);
/// screen.Loop(split); /// screen.Loop(split);
/// ``` /// ```
/// ///
@@ -257,12 +336,8 @@ Component ResizableSplitRight(Component main, Component back, int* main_size) {
/// bottom /// bottom
/// ``` /// ```
Component ResizableSplitTop(Component main, Component back, int* main_size) { Component ResizableSplitTop(Component main, Component back, int* main_size) {
return ResizableSplit({ return Make<ResizableSplitTopBase>(std::move(main), std::move(back),
std::move(main), main_size);
std::move(back),
Direction::Up,
main_size,
});
} }
/// @brief An vertical split in between two components, configurable using the /// @brief An vertical split in between two components, configurable using the
@@ -279,7 +354,7 @@ Component ResizableSplitTop(Component main, Component back, int* main_size) {
/// int bottom_size = 1; /// int bottom_size = 1;
/// auto top = Renderer([] { return text("Top") | center;}); /// auto top = Renderer([] { return text("Top") | center;});
/// auto bottom = Renderer([] { return text("Bottom") | center;}); /// auto bottom = Renderer([] { return text("Bottom") | center;});
/// auto split = ResizableSplit::Bottom(bottom, top, &bottom_size) /// auto split = ResizableSplit::Bottom(bottom, top, &bottom_size);
/// screen.Loop(split); /// screen.Loop(split);
/// ``` /// ```
/// ///
@@ -291,14 +366,9 @@ Component ResizableSplitTop(Component main, Component back, int* main_size) {
/// bottom /// bottom
/// ``` /// ```
Component ResizableSplitBottom(Component main, Component back, int* main_size) { Component ResizableSplitBottom(Component main, Component back, int* main_size) {
return ResizableSplit({ return Make<ResizableSplitBottomBase>(std::move(main), std::move(back),
std::move(main), main_size);
std::move(back),
Direction::Down,
main_size,
});
} }
} // namespace ftxui } // namespace ftxui
// Copyright 2021 Arthur Sonzogni. All rights reserved. // Copyright 2021 Arthur Sonzogni. All rights reserved.

Some files were not shown because too many files have changed in this diff Show More