14bool GeneratorBool(
const char*& data,
size_t& size) {
19 auto out = bool(data[0] % 2);
25std::string GeneratorString(
const char*& data,
size_t& size) {
27 while (index < size && data[index]) {
31 auto out = std::string(data, data + index);
41 return std::move(out);
44int GeneratorInt(
const char* data,
size_t size) {
48 auto out = int(data[0]);
54Color GeneratorColor(
const char* data,
size_t size) {
55 return Color::RGB(GeneratorInt(data, size), GeneratorInt(data, size),
56 GeneratorInt(data, size));
59AnimatedColorOption GeneratorAnimatedColorOption(
const char* data,
61 AnimatedColorOption option;
62 option.enabled = GeneratorBool(data, size);
63 option.inactive = GeneratorColor(data, size);
64 option.active = GeneratorColor(data, size);
65 option.duration = std::chrono::milliseconds(GeneratorInt(data, size));
69AnimatedColorsOption GeneratorAnimatedColorsOptions(
const char* data,
71 AnimatedColorsOption option;
72 option.background = GeneratorAnimatedColorOption(data, size);
73 option.foreground = GeneratorAnimatedColorOption(data, size);
77ButtonOption GeneratorButtonOption(
const char* data,
size_t size) {
79 option.animated_colors = GeneratorAnimatedColorsOptions(data, size);
83UnderlineOption GeneratorUnderlineOption(
const char* data,
size_t size) {
84 UnderlineOption option;
85 option.enabled = GeneratorBool(data, size);
86 option.color_active = GeneratorColor(data, size);
87 option.color_inactive = GeneratorColor(data, size);
88 option.leader_duration = std::chrono::milliseconds(GeneratorInt(data, size));
89 option.follower_duration =
90 std::chrono::milliseconds(GeneratorInt(data, size));
91 option.leader_delay = std::chrono::milliseconds(GeneratorInt(data, size));
92 option.follower_delay = std::chrono::milliseconds(GeneratorInt(data, size));
96MenuEntryOption GeneratorMenuEntryOption(
const char* data,
size_t size) {
97 MenuEntryOption option;
98 option.animated_colors = GeneratorAnimatedColorsOptions(data, size);
102MenuOption GeneratorMenuOption(
const char* data,
size_t size) {
104 option.underline = GeneratorUnderlineOption(data, size);
105 option.entries_option = GeneratorMenuEntryOption(data, size);
106 option.direction =
static_cast<Direction>(GeneratorInt(data, size) % 4);
112std::vector<std::string> g_list;
114Components GeneratorComponents(
const char*& data,
size_t& size,
int depth);
116Component GeneratorComponent(
const char*& data,
size_t& size,
int depth) {
118 int value = GeneratorInt(data, size);
120 return Button(GeneratorString(data, size), [] {});
123 constexpr int value_max = 26;
124 value = (
value % value_max + value_max) % value_max;
128 GeneratorString(data, size), [] {},
129 GeneratorButtonOption(data, size));
131 return Checkbox(GeneratorString(data, size), &g_bool);
133 return Input(GeneratorString(data, size), GeneratorString(data, size));
135 return Menu(&g_list, &g_int, GeneratorMenuOption(data, size));
139 return Toggle(&g_list, &g_int);
141 return Slider(GeneratorString(data, size), &g_int,
142 GeneratorInt(data, size), GeneratorInt(data, size),
143 GeneratorInt(data, size));
146 GeneratorComponent(data, size, depth - 1),
150 GeneratorComponent(data, size, depth - 1),
154 GeneratorComponent(data, size, depth - 1),
158 GeneratorComponent(data, size, depth - 1),
161 return Container::Vertical(GeneratorComponents(data, size, depth - 1));
164 return Container::Vertical(GeneratorComponents(data, size, depth - 1),
168 return Container::Horizontal(GeneratorComponents(data, size, depth - 1));
170 return Container::Horizontal(GeneratorComponents(data, size, depth - 1),
173 return Container::Tab(GeneratorComponents(data, size, depth - 1), &g_int);
175 return Maybe(GeneratorComponent(data, size, depth - 1), &g_bool);
180 GeneratorComponent(data, size, depth - 1),
181 GeneratorBool(data, size));
183 return Container::Stacked(GeneratorComponents(data, size, depth - 1));
185 return MenuEntry(GeneratorString(data, size));
187 return Renderer(GeneratorComponent(data, size, depth - 1),
188 [] {
return text(
"hello"); });
190 return CatchEvent(GeneratorComponent(data, size, depth - 1),
191 [](Event) {
return true; });
193 return Modal(GeneratorComponent(data, size, depth - 1),
194 GeneratorComponent(data, size, depth - 1), &g_bool);
196 return Hoverable(GeneratorComponent(data, size, depth - 1), &g_bool);
198 WindowOptions options;
199 options.inner = GeneratorComponent(data, size, depth - 1);
200 options.title = GeneratorString(data, size);
208Components GeneratorComponents(
const char*& data,
size_t& size,
int depth) {
211 while (size && GeneratorInt(data, size) % 2) {
212 out.push_back(GeneratorComponent(data, size, depth - 1));
215 return std::move(out);
220 g_bool = GeneratorBool(data, size);
221 g_int = GeneratorInt(data, size);
223 "test_1",
"test_2",
"test_3",
"test_4",
"test_5",
227 auto component = GeneratorComponent(data, size, depth);
229 int width = GeneratorInt(data, size);
230 int height = GeneratorInt(data, size);
239 Screen::Create(Dimension::Fixed(width), Dimension::Fixed(height));
242 std::vector<Event> events;
246 for (
size_t i = 0; i <
size; ++i) {
250 for (
const auto& event : events) {
251 component->OnEvent(event);
252 auto document = component->Render();
int LLVMFuzzerTestOneInput(const char *data, size_t size)
Component Button(ConstStringRef label, std::function< void()> on_click, ButtonOption options=ButtonOption::Simple())
クリックすると関数を実行するボタンを描画します。
Component ResizableSplitTop(Component main, Component back, int *main_size)
マウスで設定可能な、2つのコンポーネント間の垂直分割。
Component Toggle(ConstStringListRef entries, int *selected)
要素の水平リスト。ユーザーはこれらを操作できます。
FTXUI_EXPORT(COMPONENT) ComponentDecorator Maybe(std Component Modal(Component main, Component modal, const bool *show_modal)
Component Renderer(Component child, std::function< Element()>)
|child| に似た、|render| をComponent::Render()イベントとして 使用する新しいComponentを返します。
Component Hoverable(Component component, bool *hover)
コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
Component Checkbox(ConstStringRef label, bool *checked, CheckboxOption options=CheckboxOption::Simple())
チェック可能な要素を描画します。
Component Window(WindowOptions option)
ドラッグ可能/サイズ変更可能なウィンドウ。複数のウィンドウを使用するには、それらを Container::Stacked({...})コンポーネントを使用してスタックする必要があります。
Component Maybe(Component child, std::function< bool()> show)
コンポーネント|child|を装飾します。|show|がtrueを返す場合にのみ表示されます。
Component ResizableSplitRight(Component main, Component back, int *main_size)
マウスで設定可能な、2つのコンポーネント間の水平分割。
Component Input(StringRef content, InputOption options={})
テキストを編集するための入力ボックス。
Component Dropdown(ConstStringListRef entries, int *selected)
ドロップダウンメニュー。
Component Radiobox(ConstStringListRef entries, int *selected_, RadioboxOption options={})
一つだけ選択できる要素のリスト。
Component ResizableSplitBottom(Component main, Component back, int *main_size)
マウスで設定可能な、2つのコンポーネント間の垂直分割。
Component Menu(ConstStringListRef entries, int *selected_, MenuOption options=MenuOption::Vertical())
テキストのリスト。フォーカスされた要素が選択されます。
Component ResizableSplitLeft(Component main, Component back, int *main_size)
マウスで設定可能な、2つのコンポーネント間の水平分割。
Component MenuEntry(ConstStringRef label, MenuEntryOption options={})
特定のメニューエントリ。Container::Verticalに入れることで メニューを形成できます。
Element text(std::string_view text)
UTF8エンコードされたユニコードテキストを表示します。
Decorator size(WidthOrHeight direction, Constraint constraint, int value)
要素のサイズに制約を適用する。
Direction
Directionは、東西南北の4つの基本方向を表す列挙型です。
std::vector< Component > Components
Component Collapsible(ConstStringRef label, Component child, Ref< bool > show=false)
折りたたみ可能なコンポーネント。矢印付きのチェックボックスを表示します。アクティブ化されると、子が 表示されます。
Component Slider(SliderOption< T > options)
任意の方向のスライダー。
FTXUI_EXPORT(SCREEN) std FTXUI_EXPORT(SCREEN) std std::wstring to_wstring(T s)
void Render(Screen &screen, Node *node, Selection &selection)
std::shared_ptr< ComponentBase > Component
Component CatchEvent(Component child, std::function< bool(Event)>)