diff --git a/examples/component/gallery.cpp b/examples/component/gallery.cpp index ef57115..31efa44 100644 --- a/examples/component/gallery.cpp +++ b/examples/component/gallery.cpp @@ -50,10 +50,14 @@ int main(int argc, const char* argv[]) { // -- Checkbox --------------------------------------------------------------- bool checkbox_1_selected = false; bool checkbox_2_selected = false; + bool checkbox_3_selected = false; + bool checkbox_4_selected = false; auto checkboxes = Container::Vertical({ Checkbox("checkbox1", &checkbox_1_selected), Checkbox("checkbox2", &checkbox_2_selected), + Checkbox("checkbox3", &checkbox_3_selected), + Checkbox("checkbox4", &checkbox_4_selected), }); checkboxes = Wrap("Checkbox", checkboxes); diff --git a/src/ftxui/component/checkbox.cpp b/src/ftxui/component/checkbox.cpp index e8f0910..1c3f9a4 100644 --- a/src/ftxui/component/checkbox.cpp +++ b/src/ftxui/component/checkbox.cpp @@ -34,18 +34,22 @@ class CheckboxBase : public ComponentBase { Element Render() override { bool is_focused = Focused(); bool is_active = Active(); - auto style = is_focused ? (hovered_ ? option_->style_selected_focused - : option_->style_selected) - : (hovered_ ? option_->style_focused - : option_->style_normal); + auto style = (is_focused || hovered_) ? option_->style_selected_focused + : is_active ? option_->style_selected + : option_->style_normal; auto focus_management = is_focused ? focus : is_active ? select : nothing; - return hbox(text(*state_ ? option_->style_checked - : option_->style_unchecked), - text(*label_) | style | focus_management) | + return hbox({ + text(*state_ ? option_->style_checked + : option_->style_unchecked), + text(*label_) | style | focus_management, + }) | reflect(box_); } bool OnEvent(Event event) override { + if (!CaptureMouse(event)) + return false; + if (event.is_mouse()) return OnMouseEvent(event); @@ -53,6 +57,7 @@ class CheckboxBase : public ComponentBase { if (event == Event::Character(' ') || event == Event::Return) { *state_ = !*state_; option_->on_change(); + TakeFocus(); return true; } return false; diff --git a/src/ftxui/component/container.cpp b/src/ftxui/component/container.cpp index 27156d5..7a087e4 100644 --- a/src/ftxui/component/container.cpp +++ b/src/ftxui/component/container.cpp @@ -89,8 +89,8 @@ class VerticalContainer : public ContainerBase { for (auto& it : children_) elements.push_back(it->Render()); if (elements.size() == 0) - return text("Empty container"); - return vbox(std::move(elements)); + return text("Empty container") | reflect(box_); + return vbox(std::move(elements)) | reflect(box_); } bool EventHandler(Event event) override { @@ -117,7 +117,7 @@ class VerticalContainer : public ContainerBase { return false; } - if (!Focusable()) + if (!box_.Contain(event.mouse().x, event.mouse().y)) return false; if (event.mouse().button == Mouse::WheelUp) @@ -128,6 +128,8 @@ class VerticalContainer : public ContainerBase { return true; } + + Box box_; }; class HorizontalContainer : public ContainerBase { diff --git a/src/ftxui/component/radiobox.cpp b/src/ftxui/component/radiobox.cpp index 0c5cff1..3b89707 100644 --- a/src/ftxui/component/radiobox.cpp +++ b/src/ftxui/component/radiobox.cpp @@ -103,9 +103,6 @@ class RadioboxBase : public ComponentBase { } bool OnMouseEvent(Event event) { - if (!CaptureMouse(event)) - return false; - if (event.mouse().button == Mouse::WheelDown || event.mouse().button == Mouse::WheelUp) { return OnMouseWheel(event);