25class RadioboxBase :
public ComponentBase {
27 RadioboxBase(ConstStringListRef entries,
29 Ref<RadioboxOption> option)
30 : entries_(entries), selected_(selected), option_(std::move(option)) {
31 hovered_ = *selected_;
38 bool is_menu_focused = Focused();
39 for (
int i = 0; i <
size(); ++i) {
40 bool is_focused = (focused_entry() == i) && is_menu_focused;
41 bool is_selected = (hovered_ == i);
42 auto focus_management = !is_selected ?
nothing
43 : is_menu_focused ?
focus
45 auto state = EntryState{
52 (option_->transform ? option_->transform
55 elements.push_back(element | focus_management |
reflect(boxes_[i]));
61 bool OnEvent(Event event)
override {
63 if (!CaptureMouse(event)) {
67 if (event.is_mouse()) {
68 return OnMouseEvent(event);
72 int old_hovered = hovered_;
80 (hovered_) -= box_.y_max - box_.y_min;
83 (hovered_) += box_.y_max - box_.y_min;
89 (hovered_) =
size() - 1;
92 hovered_ = (hovered_ + 1) %
size();
95 hovered_ = (hovered_ +
size() - 1) %
size();
100 if (hovered_ != old_hovered) {
101 focused_entry() = hovered_;
102 option_->on_change();
107 if (event == Event::Character(
' ') || event ==
Event::Return) {
108 *selected_ = hovered_;
110 option_->on_change();
116 bool OnMouseEvent(Event event) {
119 return OnMouseWheel(event);
122 for (
int i = 0; i <
size(); ++i) {
123 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y)) {
131 if (*selected_ != i) {
133 option_->on_change();
142 bool OnMouseWheel(Event event) {
143 if (!box_.Contain(event.mouse().x, event.mouse().y)) {
147 int old_hovered = hovered_;
158 if (hovered_ != old_hovered) {
159 option_->on_change();
166 boxes_.resize(
size());
172 bool Focusable() const final {
return entries_.size(); }
173 int& focused_entry() {
return option_->focused_entry(); }
174 int size()
const {
return int(entries_.size()); }
176 ConstStringListRef entries_;
179 std::vector<Box> boxes_;
181 Ref<RadioboxOption> option_;
An adapter. Reference a list of strings.
An adapter. Own or reference an mutable object.
constexpr const T & clamp(const T &v, const T &lo, const T &hi)
Component Radiobox(ConstStringListRef entries, int *selected_, Ref< RadioboxOption > option={})
A list of element, where only one can be selected.
Element nothing(Element element)
A decoration doing absolutely nothing.
std::shared_ptr< T > Make(Args &&... args)
std::shared_ptr< Node > Element
std::vector< Element > Elements
Decorator reflect(Box &box)
void Render(Screen &screen, const Element &element)
Display an element on a ftxui::Screen.
Decorator size(Direction, Constraint, int value)
Apply a constraint on the size of an element.
std::shared_ptr< ComponentBase > Component
Element vbox(Elements)
A container displaying elements vertically one by one.
static const Event TabReverse
static const Event PageUp
static const Event ArrowUp
static const Event ArrowDown
static const Event PageDown
static const Event Return
static RadioboxOption Simple()
Option for standard Radiobox.
std::function< Element(const EntryState &)> transform