FTXUI README

The project's README from github.com/ArthurSonzogni/FTXUI. As one markdown file: README.md.

Demo image

latest packaged version(s)
Documentation · Report a Bug · Examples . Request Feature · Send a Pull Request
Doc: English | Français | Español | 繁體中文 | 简体中文 | 日本語 |

FTXUI

Functional Terminal (X) User interface

A simple cross-platform C++ library for terminal based user interfaces!

Feature

Documentation

Example

#include <ftxui/ftxui.hpp>
using namespace ftxui;

int main() {
  auto document =
    vbox({
      hbox({
        text("one") | border,
        text("two") | border | flex,
        text("three") | border | flex,
      }),

      gauge(0.25) | color(Color::Red),
      gauge(0.50) | color(Color::White),
      gauge(0.75) | color(Color::Blue),
    });

  auto screen = Screen::Create(Dimension::Full());
  Render(screen, document);
  screen.Print();

  return 0;
}

image

FTXUI is organized into three modules:

  1. screen: Low-level rendering (colors, pixels, terminal)
  2. dom: Layout and composition (hierarchical elements)
  3. component: User interaction (widgets, events, main loop)

For most users, including everything at once is the simplest way to start:

DOM

This module defines a hierarchical set of Element. An Element manages layout and can be responsive to the terminal dimensions.

They are declared in <ftxui/dom/elements.hpp>

Layout

Element can be arranged together:

  • horizontally with hbox
  • vertically with vbox
  • inside a grid with gridbox
  • wrap along one direction using the flexbox.

Element can become flexible using the flex decorator.

Example using hbox, vbox and filler.

image

Example using gridbox:

image

Example using flexbox:

image

See also this demo.

Style

An element can be decorated using the functions:

  • bold
  • italic
  • dim
  • inverted
  • underlined
  • underlinedDouble
  • blink
  • strikethrough
  • color
  • bgcolor
  • hyperlink

Example

image

FTXUI supports the pipe operator. It means: decorator1(decorator2(element)) and element | decorator1 | decorator2 can be used.

Colors

FTXUI supports every color palette:

Color gallery: image

Border and separator

Use decorator border and element separator() to subdivide your UI:

Element document = vbox({
    text("top"),
    separator(),
    text("bottom"),
}) | border;

Demo:

image

Text and paragraph

A simple piece of text is represented using text("content").

To support text wrapping following spaces the following functions are provided:

Element paragraph(string text);
Element paragraphAlignLeft(string text);
Element paragraphAlignRight(string text);
Element paragraphAlignCenter(string text);
Element paragraphAlignJustify(string text);

Paragraph example

ezgif com-gif-maker (4)

Table

A class to easily style a table of data.

Example:

image

Canvas

Drawing can be made on a Canvas, using braille, block, or simple characters:

Simple example:

image

Complex examples:

ezgif com-gif-maker (3)

Component

ftxui/component produces dynamic UI, reactive to the user's input. It defines a set of ftxui::Component. A component reacts to Events (keyboard, mouse, resize, ...) and Renders as an Element (see previous section).

Prebuilt components are declared in <ftxui/component/component.hpp>

Gallery

Gallery of multiple components. (demo)

image

Radiobox

Example:

image

Checkbox

Example:

image

Input

Example:

image

Toggle

Example:

image

Slider

Example:

image

Menu

Example:

image

ResizableSplit

Example:

ezgif com-gif-maker

Dropdown

Example:

youtube-video-gif (3)

Tab

Vertical:

ezgif com-gif-maker (1)

Horizontal:

ezgif com-gif-maker (2)

Libraries for FTXUI

Project using FTXUI

Feel free to add your projects here:


cpp-best-practices/game_jam

Several games using the FTXUI have been made during the Game Jam:

Build using CMake

It is highly recommended to use CMake FetchContent to depend on FTXUI so you may specify which commit you would like to depend on.

include(FetchContent)
FetchContent_Declare(ftxui
  GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
  GIT_TAG v7.0.3
)
FetchContent_MakeAvailable(ftxui)

target_link_libraries(your_target PRIVATE
    # Use the umbrella target (recommended)
    ftxui::ftxui

    # Or chose a submodule
    # ftxui::component
    # ftxui::dom
    # ftxui::screen
)

Build using Bazel

MODULE.bazel

bazel_dep(
    name = "ftxui",
    version = "7.0.3",
)

BUILD.bazel

cc_binary(
    name = "your_target",
    srcs = ["your_source.cc"],
    deps = [
        # Choose submodules
        "@ftxui//:component",
        "@ftxui//:dom",
        "@ftxui//:screen",
        
        # Or use the single ftxui target (includes all modules)
        # "@ftxui//:ftxui",
    ],
)

Build using Meson

FTXUI can also be built using Meson. See doc/installation_meson.md for detailed instructions.

meson setup builddir
ninja -C builddir

To use FTXUI as a subproject in your Meson project, create a subprojects/ftxui.wrap file or use it as a dependency:

ftxui_dep = dependency('ftxui-component')

Build with something else:

If you don't, FTXUI may be used from the following packages:

Packaging status

If you choose to build and link FTXUI yourself, ftxui-component must be first in the linking order relative to the other FTXUI libraries, i.e.

g++ . . . -lftxui-component -lftxui-dom -lftxui-screen . . .

To build FTXUI with modules, check documentation

Contributors

FTXUI (ArthurSonzogni/FTXUI)

Searching Database…

10.8K ·GitHub
这是什么?FTXUI 是一个简单易用的跨平台 C++ 库,用来构建终端用户界面——也就是带颜色、布局、各种控件以及键盘和鼠标输入的全屏文字应用。
它是链接进我自己程序里的库,还是现成的应用?是一个链接进你自己 C++ 程序的库,不是独立应用。它由三个模块组成:screen(渲染)、dom(布局)和 component(交互控件和主循环)。
怎么把它加到我的项目里?推荐用 CMake FetchContent。其他方式包括 Bazel、vcpkg、Conan、Meson、系统发行版软件包(Debian、Ubuntu、Arch、OpenSUSE)、Nix、conda-forge,以及从 7.0.0 起提供的单头文件合并版。
我需要先装别的东西吗,比如 ncurses?不需要——FTXUI 没有任何外部依赖,你只需要一个支持 C++20 的编译工具链。
它在 Windows 上能用吗,还是只支持 Linux 和 macOS?Linux 和 macOS 是主要目标平台,但 Windows 也支持,而且还能编译成 WebAssembly,所以演示程序可以在浏览器里运行。
在 FTXUI 里怎么描述一个界面?你用函数式的方式组合元素:hbox 和 vbox 负责横向或纵向排列,gridbox 和 flexbox 处理网格和自动换行,decorator 用来加粗体、颜色、边框和超链接,还可以用管道运算符把多个 decorator 串起来。
它自带哪些控件?复选框、单选框、文本输入框、toggle、滑块、菜单、下拉框、可拖动分隔条和标签页。这些组件能响应键盘、鼠标和窗口大小变化事件,并作为布局元素渲染。
它能画图形,而不只是文字吗?可以。你可以在 Canvas 上用盲文字符、方块字符或普通字符作画,支持所有色板,元素还可以做动画。
大家都用它做过什么?游戏 jams 作品如 TermBreaker 和 Minesweeper Marathon,工具类软件如 json-tui、git-tui 和 rgb-tui,还有资源监视器、终端文件浏览器,以及社区开发的图片查看器、markdown 编辑器等组件。
Size
100.9 MB
Stars
10.8K
Age
7y
Commits · 90 Days