10bool GeneratorBool(
const char*& data,
size_t&
size) {
14 auto out = bool(data[0] % 2);
20std::string GeneratorString(
const char*& data,
size_t&
size) {
22 while (index <
size && data[index])
25 auto out = std::string(data, data + index);
35 return std::move(out);
38int GeneratorInt(
const char* data,
size_t size) {
41 auto out = int(data[0]);
49std::vector<std::string> g_list;
51Components GeneratorComponents(
const char*& data,
size_t&
size,
int depth);
53Component GeneratorComponent(
const char*& data,
size_t&
size,
int depth) {
55 int value = GeneratorInt(data,
size);
57 return Button(GeneratorString(data,
size), [] {});
59 constexpr int value_max = 19;
60 value = (value % value_max + value_max) % value_max;
63 return Button(GeneratorString(data,
size), [] {});
67 return Input(GeneratorString(data,
size), GeneratorString(data,
size));
69 return Menu(&g_list, &g_int);
73 return Toggle(&g_list, &g_int);
75 return Slider(GeneratorString(data,
size), &g_int,
76 GeneratorInt(data,
size), GeneratorInt(data,
size),
77 GeneratorInt(data,
size));
80 GeneratorComponent(data,
size, depth - 1),
84 GeneratorComponent(data,
size, depth - 1),
88 GeneratorComponent(data,
size, depth - 1),
92 GeneratorComponent(data,
size, depth - 1),
109 return Maybe(GeneratorComponent(data,
size, depth - 1), &g_bool);
114 GeneratorComponent(data,
size, depth - 1),
115 GeneratorBool(data,
size));
121Components GeneratorComponents(
const char*& data,
size_t&
size,
int depth) {
124 while (
size && GeneratorInt(data,
size) % 2) {
125 out.push_back(GeneratorComponent(data,
size, depth - 1));
128 return std::move(out);
133 g_bool = GeneratorBool(data,
size);
134 g_int = GeneratorInt(data,
size);
136 "test_1",
"test_2",
"test_3",
"test_4",
"test_5",
140 auto component = GeneratorComponent(data,
size, depth);
142 int width = GeneratorInt(data,
size);
143 int height = GeneratorInt(data,
size);
157 for (
size_t i = 0; i <
size; ++i)
162 while (event_receiver->Receive(&event)) {
163 component->OnEvent(event);
164 auto document = component->Render();
static Screen Create(Dimensions dimension)
Create a screen with the given dimension.
int LLVMFuzzerTestOneInput(const char *data, size_t size)
Component Horizontal(Components children)
A list of components, drawn one by one horizontally and navigated horizontally using left/right arrow...
Component Vertical(Components children)
A list of components, drawn one by one vertically and navigated vertically using up/down arrow key or...
Component Tab(Components children, int *selector)
A list of components, where only one is drawn and interacted with at a time. The |selector| gives the...
Component Checkbox(ConstStringRef label, bool *checked, Ref< CheckboxOption > option={})
Draw checkable element.
Component Radiobox(ConstStringListRef entries, int *selected_, Ref< RadioboxOption > option={})
A list of element, where only one can be selected.
Component Toggle(ConstStringListRef entries, int *selected, Ref< ToggleOption > option={})
An horizontal list of elements. The user can navigate through them.
Component ResizableSplitTop(Component main, Component back, int *main_size)
An vertical split in between two components, configurable using the mouse.
Component Input(StringRef content, ConstStringRef placeholder, Ref< InputOption > option={})
An input box for editing text.
std::vector< Component > Components
std::wstring to_wstring(const std::string &s)
Convert a std::wstring into a UTF8 std::string.
Receiver< T > MakeReceiver()
Component Button(ConstStringRef label, std::function< void()> on_click, Ref< ButtonOption >={})
Draw a button. Execute a function when clicked.
Component Menu(ConstStringListRef entries, int *selected_, Ref< MenuOption >={})
A list of text. The focused element is selected.
Component Maybe(Component, const bool *show)
Component ResizableSplitRight(Component main, Component back, int *main_size)
An horizontal split in between two components, configurable using the mouse.
Component Dropdown(ConstStringListRef entries, int *selected)
Component ResizableSplitBottom(Component main, Component back, int *main_size)
An vertical split in between two components, configurable using the mouse.
Component Slider(ConstStringRef label, T *value, T min, T max, T increment)
An horizontal slider.
void Render(Screen &screen, const Element &node)
Display an element on a ftxui::Screen.
Decorator size(Direction, Constraint, int value)
Apply a constraint on the size of an element.
Component ResizableSplitLeft(Component main, Component back, int *main_size)
An horizontal split in between two components, configurable using the mouse.
std::shared_ptr< ComponentBase > Component
Component Collapsible(ConstStringRef label, Component child, Ref< bool > show=false)
Represent an event. It can be key press event, a terminal resize, or more ...