15bool GeneratorBool(
const char*& data,
size_t& size) {
20 auto out = bool(data[0] % 2);
26std::string GeneratorString(
const char*& data,
size_t& size) {
28 while (index < size && data[index]) {
32 auto out = std::string(data, data + index);
43 return std::move(out);
46int GeneratorInt(
const char* data,
size_t size) {
50 auto out = int(data[0]);
56Color GeneratorColor(
const char* data,
size_t size) {
57 return Color::RGB(GeneratorInt(data, size), GeneratorInt(data, size),
58 GeneratorInt(data, size));
64 option.
enabled = GeneratorBool(data, size);
65 option.
inactive = GeneratorColor(data, size);
66 option.
active = GeneratorColor(data, size);
67 option.
duration = std::chrono::milliseconds(GeneratorInt(data, size));
74 option.
background = GeneratorAnimatedColorOption(data, size);
75 option.
foreground = GeneratorAnimatedColorOption(data, size);
79ButtonOption GeneratorButtonOption(
const char* data,
size_t size) {
85UnderlineOption GeneratorUnderlineOption(
const char* data,
size_t size) {
87 option.
enabled = GeneratorBool(data, size);
90 option.
leader_duration = std::chrono::milliseconds(GeneratorInt(data, size));
92 std::chrono::milliseconds(GeneratorInt(data, size));
93 option.
leader_delay = std::chrono::milliseconds(GeneratorInt(data, size));
94 option.
follower_delay = std::chrono::milliseconds(GeneratorInt(data, size));
98MenuEntryOption GeneratorMenuEntryOption(
const char* data,
size_t size) {
104MenuOption GeneratorMenuOption(
const char* data,
size_t size) {
106 option.
underline = GeneratorUnderlineOption(data, size);
114std::vector<std::string> g_list;
116Components GeneratorComponents(
const char*& data,
size_t& size,
int depth);
118Component GeneratorComponent(
const char*& data,
size_t& size,
int depth) {
120 int value = GeneratorInt(data, size);
122 return Button(GeneratorString(data, size), [] {});
125 constexpr int value_max = 19;
126 value = (value % value_max + value_max) % value_max;
130 GeneratorString(data, size), [] {},
131 GeneratorButtonOption(data, size));
133 return Checkbox(GeneratorString(data, size), &g_bool);
135 return Input(GeneratorString(data, size), GeneratorString(data, size));
137 return Menu(&g_list, &g_int, GeneratorMenuOption(data, size));
141 return Toggle(&g_list, &g_int);
143 return Slider(GeneratorString(data, size), &g_int,
144 GeneratorInt(data, size), GeneratorInt(data, size),
145 GeneratorInt(data, size));
148 GeneratorComponent(data, size, depth - 1),
152 GeneratorComponent(data, size, depth - 1),
156 GeneratorComponent(data, size, depth - 1),
160 GeneratorComponent(data, size, depth - 1),
163 return Container::Vertical(GeneratorComponents(data, size, depth - 1));
166 return Container::Vertical(GeneratorComponents(data, size, depth - 1),
170 return Container::Horizontal(GeneratorComponents(data, size, depth - 1));
172 return Container::Horizontal(GeneratorComponents(data, size, depth - 1),
175 return Container::Tab(GeneratorComponents(data, size, depth - 1), &g_int);
177 return Maybe(GeneratorComponent(data, size, depth - 1), &g_bool);
182 GeneratorComponent(data, size, depth - 1),
183 GeneratorBool(data, size));
189Components GeneratorComponents(
const char*& data,
size_t& size,
int depth) {
192 while (size && GeneratorInt(data, size) % 2) {
193 out.push_back(GeneratorComponent(data, size, depth - 1));
196 return std::move(out);
201 g_bool = GeneratorBool(data, size);
202 g_int = GeneratorInt(data, size);
204 "test_1",
"test_2",
"test_3",
"test_4",
"test_5",
208 auto component = GeneratorComponent(data, size, depth);
210 int width = GeneratorInt(data, size);
211 int height = GeneratorInt(data, size);
220 Screen::Create(Dimension::Fixed(width), Dimension::Fixed(height));
224 std::vector<Event> events;
228 for (
size_t i = 0; i <
size; ++i) {
232 for (
const auto& event : events) {
int LLVMFuzzerTestOneInput(const char *data, size_t size)
animation::Duration follower_duration
MenuEntryOption entries_option
animation::Duration follower_delay
UnderlineOption underline
animation::Duration leader_duration
animation::Duration duration
AnimatedColorsOption animated_colors
animation::Duration leader_delay
Component Maybe(Component, const bool *show)
裝飾一個組件 |child|。它只在 |show| 為 true 時顯示。
Component ResizableSplitTop(Component main, Component back, int *main_size)
兩個元件之間的垂直分割,可透過滑鼠設定。
Component Checkbox(CheckboxOption options)
Component Menu(MenuOption options)
文字列表。選定的元素會被聚焦。
Component Toggle(ConstStringListRef entries, int *selected)
元素的水平列表。使用者可以在其中導航。
Component Radiobox(RadioboxOption options)
元素清單,只能選擇一個。
Component Button(ButtonOption options)
繪製一個按鈕。點擊時執行一個函數。
Component Input(InputOption options={})
用於編輯文字的輸入框。
Component ResizableSplitRight(Component main, Component back, int *main_size)
兩個元件之間的水平分割,可透過滑鼠設定。
Component Dropdown(ConstStringListRef entries, int *selected)
下拉式選單。
Component ResizableSplitBottom(Component main, Component back, int *main_size)
兩個元件之間的垂直分割,可透過滑鼠設定。
Component ResizableSplitLeft(Component main, Component back, int *main_size)
兩個元件之間的水平分割,可透過滑鼠設定。
代表一個事件。它可以是按鍵事件、終端機大小調整,或更多...
Decorator size(WidthOrHeight, Constraint, int value)
限制元素的大小。
Direction
Direction 是一個列舉,表示四個主要方向。
static Screen Create(Dimensions dimension)
創建具有給定尺寸的螢幕。
static Color RGB(uint8_t red, uint8_t green, uint8_t blue)
從 RGB 表示建立一個顏色。 https://en.wikipedia.org/wiki/RGB_color_model
Color 是一個在終端使用者介面中表示顏色的類別。
std::vector< Component > Components
std::wstring to_wstring(const std::string &s)
將 UTF8 std::string 轉換為 std::wstring。
Component Collapsible(ConstStringRef label, Component child, Ref< bool > show=false)
可折疊元件。它顯示一個帶有箭頭的核取方塊。一旦啟用,子元件就會顯示。
Component Slider(SliderOption< T > options)
void Render(Screen &screen, const Element &element)
std::shared_ptr< ComponentBase > Component
AnimatedColorOption foreground
AnimatedColorOption background