Add option for Toggle.

This commit is contained in:
ArthurSonzogni
2021-07-10 11:03:01 +02:00
committed by Arthur Sonzogni
parent ae6473363d
commit fac373494d
7 changed files with 43 additions and 29 deletions

View File

@@ -10,8 +10,10 @@
namespace ftxui {
Component Toggle(const std::vector<std::wstring>* entries, int* selected) {
return Make<ToggleBase>(entries, selected);
Component Toggle(const std::vector<std::wstring>* entries,
int* selected,
ConstRef<ToggleOption> option) {
return Make<ToggleBase>(entries, selected, std::move(option));
}
// static
@@ -19,8 +21,10 @@ ToggleBase* ToggleBase::From(Component component) {
return static_cast<ToggleBase*>(component.get());
}
ToggleBase::ToggleBase(const std::vector<std::wstring>* entries, int* selected)
: entries_(entries), selected_(selected) {}
ToggleBase::ToggleBase(const std::vector<std::wstring>* entries,
int* selected,
ConstRef<ToggleOption> option)
: entries_(entries), selected_(selected), option_(std::move(option)) {}
Element ToggleBase::Render() {
Elements children;
@@ -34,9 +38,10 @@ Element ToggleBase::Render() {
bool is_focused = (focused == int(i)) && is_toggle_focused;
bool is_selected = (*selected_ == int(i));
auto style = is_selected
? (is_focused ? selected_focused_style : selected_style)
: (is_focused ? focused_style : normal_style);
auto style = is_selected ? (is_focused ? option_->selected_focused_style
: option_->selected_style)
: (is_focused ? option_->focused_style
: option_->normal_style);
auto focus_management = !is_selected ? nothing
: is_toggle_focused ? focus
: select;
@@ -64,12 +69,12 @@ bool ToggleBase::OnEvent(Event event) {
if (old_selected != *selected_) {
focused = *selected_;
on_change();
option_->on_change();
return true;
}
if (event == Event::Return) {
on_enter();
option_->on_enter();
return true;
}
@@ -90,7 +95,7 @@ bool ToggleBase::OnMouseEvent(Event event) {
TakeFocus();
if (*selected_ != i) {
*selected_ = i;
on_change();
option_->on_change();
}
return true;
}

View File

@@ -83,10 +83,11 @@ TEST(ToggleTest, Tab) {
TEST(ToggleTest, OnChange) {
std::vector<std::wstring> entries = {L"1", L"2", L"3"};
int selected = 0;
auto toggle = Toggle(&entries, &selected);
int counter = 0;
ToggleBase::From(toggle)->on_change = [&] { counter++; };
auto option = ToggleOption();
option.on_change = [&] { counter++; };
auto toggle = Toggle(&entries, &selected, &option);
EXPECT_FALSE(toggle->OnEvent(Event::ArrowLeft)); // Reached far left.
EXPECT_EQ(counter, 0);
@@ -111,10 +112,11 @@ TEST(ToggleTest, OnChange) {
TEST(ToggleTest, OnEnter) {
std::vector<std::wstring> entries = {L"1", L"2", L"3"};
int selected = 0;
auto toggle = Toggle(&entries, &selected);
int counter = 0;
ToggleBase::From(toggle)->on_enter = [&] { counter++; };
auto option = ToggleOption();
option.on_enter = [&] { counter++; };
auto toggle = Toggle(&entries, &selected, &option);
EXPECT_FALSE(toggle->OnEvent(Event::ArrowLeft)); // Reached far left.
EXPECT_TRUE(toggle->OnEvent(Event::Return));