Add documentation for options.

This commit is contained in:
ArthurSonzogni 2021-07-10 11:50:17 +02:00 committed by Arthur Sonzogni
parent fac373494d
commit f53dc139e9
8 changed files with 77 additions and 66 deletions

View File

@ -27,46 +27,46 @@ int main(int argc, const char* argv[]) {
int menu_6_selected_ = 0; int menu_6_selected_ = 0;
MenuOption option_1; MenuOption option_1;
option_1.focused_style = bold | color(Color::Blue); option_1.style_focused = bold | color(Color::Blue);
option_1.selected_style = color(Color::Blue); option_1.style_selected = color(Color::Blue);
option_1.selected_focused_style = bold | color(Color::Blue); option_1.style_selected_focused = bold | color(Color::Blue);
option_1.on_enter = screen.ExitLoopClosure(); option_1.on_enter = screen.ExitLoopClosure();
auto menu_1_ = Menu(&entries, &menu_1_selected_, &option_1); auto menu_1_ = Menu(&entries, &menu_1_selected_, &option_1);
MenuOption option_2; MenuOption option_2;
option_2.focused_style = bold | color(Color::Blue); option_2.style_focused = bold | color(Color::Blue);
option_2.selected_style = color(Color::Blue); option_2.style_selected = color(Color::Blue);
option_2.selected_focused_style = bold | color(Color::Blue); option_2.style_selected_focused = bold | color(Color::Blue);
option_2.on_enter = screen.ExitLoopClosure(); option_2.on_enter = screen.ExitLoopClosure();
auto menu_2_ = Menu(&entries, &menu_2_selected_, &option_2); auto menu_2_ = Menu(&entries, &menu_2_selected_, &option_2);
MenuOption option_3; MenuOption option_3;
option_3.selected_style = color(Color::Blue); option_3.style_selected = color(Color::Blue);
option_3.focused_style = bgcolor(Color::Blue); option_3.style_focused = bgcolor(Color::Blue);
option_3.selected_focused_style = bgcolor(Color::Blue); option_3.style_selected_focused = bgcolor(Color::Blue);
option_3.on_enter = screen.ExitLoopClosure(); option_3.on_enter = screen.ExitLoopClosure();
auto menu_3_ = Menu(&entries, &menu_3_selected_, &option_3); auto menu_3_ = Menu(&entries, &menu_3_selected_, &option_3);
MenuOption option_4; MenuOption option_4;
option_4.selected_style = bgcolor(Color::Blue); option_4.style_selected = bgcolor(Color::Blue);
option_4.focused_style = bgcolor(Color::BlueLight); option_4.style_focused = bgcolor(Color::BlueLight);
option_4.selected_focused_style = bgcolor(Color::BlueLight); option_4.style_selected_focused = bgcolor(Color::BlueLight);
option_4.on_enter = screen.ExitLoopClosure(); option_4.on_enter = screen.ExitLoopClosure();
auto menu_4_ = Menu(&entries, &menu_4_selected_, &option_4); auto menu_4_ = Menu(&entries, &menu_4_selected_, &option_4);
MenuOption option_5; MenuOption option_5;
option_5.normal_style = bgcolor(Color::Blue); option_5.style_normal = bgcolor(Color::Blue);
option_5.selected_style = bgcolor(Color::Yellow); option_5.style_selected = bgcolor(Color::Yellow);
option_5.focused_style = bgcolor(Color::Red); option_5.style_focused = bgcolor(Color::Red);
option_5.selected_focused_style = bgcolor(Color::Red); option_5.style_selected_focused = bgcolor(Color::Red);
option_5.on_enter = screen.ExitLoopClosure(); option_5.on_enter = screen.ExitLoopClosure();
auto menu_5_ = Menu(&entries, &menu_5_selected_, &option_5); auto menu_5_ = Menu(&entries, &menu_5_selected_, &option_5);
MenuOption option_6; MenuOption option_6;
option_6.normal_style = dim | color(Color::Blue); option_6.style_normal = dim | color(Color::Blue);
option_6.selected_style = color(Color::Blue); option_6.style_selected = color(Color::Blue);
option_6.focused_style = bold | color(Color::Blue); option_6.style_focused = bold | color(Color::Blue);
option_6.selected_focused_style = bold | color(Color::Blue); option_6.style_selected_focused = bold | color(Color::Blue);
option_6.on_enter = screen.ExitLoopClosure(); option_6.on_enter = screen.ExitLoopClosure();
auto menu_6_ = Menu(&entries, &menu_6_selected_, &option_6); auto menu_6_ = Menu(&entries, &menu_6_selected_, &option_6);

View File

@ -5,56 +5,68 @@
namespace ftxui { namespace ftxui {
/// @brief Option for the Menu component.
struct MenuOption { struct MenuOption {
Decorator normal_style = nothing; Decorator style_normal = nothing; /// style.
Decorator focused_style = inverted; Decorator style_focused = inverted; /// Style when focused.
Decorator selected_style = bold; Decorator style_selected = bold; /// Style when selected.
Decorator selected_focused_style = focused_style | selected_style; Decorator style_selected_focused =
Decorator(inverted) | bold; /// Style when selected and focused.
// State update callback. /// Called when the selected entry changes.
std::function<void()> on_change = []() {}; std::function<void()> on_change = [] {};
std::function<void()> on_enter = []() {}; /// Called when the user presses enter.
std::function<void()> on_enter = [] {};
}; };
/// @brief Option for the Button component.
struct ButtonOption { struct ButtonOption {
/// Whether to show a border around the button.
bool border = true; bool border = true;
}; };
/// @brief Option for the Checkbox component.
struct CheckboxOption { struct CheckboxOption {
std::wstring checked = L""; /// Prefix for a "checked" state. std::wstring style_checked = L""; /// Prefix for a "checked" state.
std::wstring unchecked = L""; /// Prefix for a "unchecked" state. std::wstring style_unchecked = L""; /// Prefix for a "unchecked" state.
Decorator style_focused = inverted; /// Decorator used when focused.
Decorator focused_style = inverted; /// Decorator used when focused. Decorator style_unfocused = nothing; /// Decorator used when unfocused.
Decorator unfocused_style = nothing; /// Decorator used when unfocused.
/// Called when the user change the state. /// Called when the user change the state.
std::function<void()> on_change = []() {}; std::function<void()> on_change = []() {};
}; };
/// @brief Option for the Input component.
struct InputOption { struct InputOption {
/// Called when the content changes.
std::function<void()> on_change = [] {}; std::function<void()> on_change = [] {};
/// Called when the user presses enter.
std::function<void()> on_enter = [] {}; std::function<void()> on_enter = [] {};
}; };
/// @brief Option for the Radiobox component.
struct RadioboxOption { struct RadioboxOption {
std::wstring checked = L""; std::wstring style_checked = L""; /// Prefix for a "checked" state.
std::wstring unchecked = L""; std::wstring style_unchecked = L""; /// Prefix for a "unchecked" state.
Decorator style_focused = inverted; /// Decorator used when focused.
Decorator focused_style = inverted; Decorator style_unfocused = nothing; /// Decorator used when unfocused.
Decorator unfocused_style = nothing;
/// Called when the selected entry changes.
std::function<void()> on_change = []() {}; std::function<void()> on_change = []() {};
}; };
/// @brief Option for the Toggle component.
struct ToggleOption { struct ToggleOption {
Decorator normal_style = dim; Decorator style_normal = nothing; /// style.
Decorator focused_style = inverted; Decorator style_focused = inverted; /// Style when focused.
Decorator selected_style = bold; Decorator style_selected = bold; /// Style when selected.
Decorator selected_focused_style = focused_style | selected_style; Decorator style_selected_focused =
Decorator(inverted) | bold; /// Style when selected and focused.
// Callback. /// Called when the selected entry changes.
std::function<void()> on_change = []() {}; std::function<void()> on_change = [] {};
std::function<void()> on_enter = []() {}; /// Called when the user presses enter.
std::function<void()> on_enter = [] {};
}; };
}; // namespace ftxui }; // namespace ftxui

View File

@ -6,12 +6,12 @@
namespace ftxui { namespace ftxui {
// An adapter for a const object referenced or owned. /// @brief An adapter. Own or reference a constant object.
template <typename T> template <typename T>
class ConstRef { class ConstRef {
public: public:
ConstRef() {} ConstRef() {}
ConstRef(T t): owned_(t) {} ConstRef(T t) : owned_(t) {}
ConstRef(const T* t) : address_(t) {} ConstRef(const T* t) : address_(t) {}
const T& operator*() { return address_ ? *address_ : owned_; } const T& operator*() { return address_ ? *address_ : owned_; }
const T* operator->() { return address_ ? address_ : &owned_; } const T* operator->() { return address_ ? address_ : &owned_; }
@ -21,8 +21,8 @@ class ConstRef {
const T* address_ = nullptr; const T* address_ = nullptr;
}; };
/// @brief For convenience, this class convert multiple mutable string /// @brief An adapter. Own or reference a constant string. For convenience, this
/// references toward a shared representation. /// class convert multiple mutable string toward a shared representation.
class StringRef { class StringRef {
public: public:
StringRef(std::wstring* ref) : address_(ref) {} StringRef(std::wstring* ref) : address_(ref) {}
@ -37,8 +37,8 @@ class StringRef {
std::wstring* address_ = nullptr; std::wstring* address_ = nullptr;
}; };
/// @brief For convenience, this class convert multiple immutable string /// @brief An adapter. Own or reference a constant string. For convenience, this
/// references toward shared representation. /// class convert multiple immutable string toward a shared representation.
class ConstStringRef { class ConstStringRef {
public: public:
ConstStringRef(const std::wstring* ref) : address_(ref) {} ConstStringRef(const std::wstring* ref) : address_(ref) {}

View File

@ -57,9 +57,9 @@ CheckboxBase::CheckboxBase(ConstStringRef label,
Element CheckboxBase::Render() { Element CheckboxBase::Render() {
bool is_focused = Focused(); bool is_focused = Focused();
auto style = is_focused ? option_->focused_style : option_->unfocused_style; auto style = is_focused ? option_->style_focused : option_->style_unfocused;
auto focus_management = is_focused ? focus : *state_ ? select : nothing; auto focus_management = is_focused ? focus : *state_ ? select : nothing;
return hbox(text(*state_ ? option_->checked : option_->unchecked), return hbox(text(*state_ ? option_->style_checked : option_->style_unchecked),
text(*label_) | style | focus_management) | text(*label_) | style | focus_management) |
reflect(box_); reflect(box_);
} }

View File

@ -62,10 +62,10 @@ Element MenuBase::Render() {
bool is_focused = (focused == int(i)) && is_menu_focused; bool is_focused = (focused == int(i)) && is_menu_focused;
bool is_selected = (*selected_ == int(i)); bool is_selected = (*selected_ == int(i));
auto style = is_selected ? (is_focused ? option_->selected_focused_style auto style = is_selected ? (is_focused ? option_->style_selected_focused
: option_->selected_style) : option_->style_selected)
: (is_focused ? option_->focused_style : (is_focused ? option_->style_focused
: option_->normal_style); : option_->style_normal);
auto focus_management = !is_selected ? nothing auto focus_management = !is_selected ? nothing
: is_menu_focused ? focus : is_menu_focused ? focus
: select; : select;

View File

@ -69,14 +69,15 @@ Element RadioboxBase::Render() {
bool is_focused = Focused(); bool is_focused = Focused();
boxes_.resize(entries_->size()); boxes_.resize(entries_->size());
for (size_t i = 0; i < entries_->size(); ++i) { for (size_t i = 0; i < entries_->size(); ++i) {
auto style = (focused == int(i) && is_focused) ? option_->focused_style auto style = (focused == int(i) && is_focused) ? option_->style_focused
: option_->unfocused_style; : option_->style_unfocused;
auto focus_management = (focused != int(i)) ? nothing auto focus_management = (focused != int(i)) ? nothing
: is_focused ? focus : is_focused ? focus
: select; : select;
const std::wstring& symbol = const std::wstring& symbol = *selected_ == int(i)
*selected_ == int(i) ? option_->checked : option_->unchecked; ? option_->style_checked
: option_->style_unchecked;
elements.push_back(hbox(text(symbol), text(entries_->at(i)) | style) | elements.push_back(hbox(text(symbol), text(entries_->at(i)) | style) |
focus_management | reflect(boxes_[i])); focus_management | reflect(boxes_[i]));
} }

View File

@ -38,10 +38,10 @@ Element ToggleBase::Render() {
bool is_focused = (focused == int(i)) && is_toggle_focused; bool is_focused = (focused == int(i)) && is_toggle_focused;
bool is_selected = (*selected_ == int(i)); bool is_selected = (*selected_ == int(i));
auto style = is_selected ? (is_focused ? option_->selected_focused_style auto style = is_selected ? (is_focused ? option_->style_selected_focused
: option_->selected_style) : option_->style_selected)
: (is_focused ? option_->focused_style : (is_focused ? option_->style_focused
: option_->normal_style); : option_->style_normal);
auto focus_management = !is_selected ? nothing auto focus_management = !is_selected ? nothing
: is_toggle_focused ? focus : is_toggle_focused ? focus
: select; : select;

View File

@ -6,13 +6,11 @@
namespace ftxui { namespace ftxui {
namespace {
Decorator compose(Decorator a, Decorator b) { Decorator compose(Decorator a, Decorator b) {
return [a = std::move(a), b = std::move(b)](Element element) { return [a = std::move(a), b = std::move(b)](Element element) {
return b(a(std::move(element))); return b(a(std::move(element)));
}; };
} }
} // namespace
/// @brief A decoration doing absolutely nothing. /// @brief A decoration doing absolutely nothing.
/// @ingroup dom /// @ingroup dom