26class RadioboxBase :
public ComponentBase {
28 RadioboxBase(ConstStringListRef entries,
30 Ref<RadioboxOption> option)
31 : entries_(entries), selected_(selected), option_(std::move(option)) {
32#if defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)
35 if (option_->style_checked ==
"◉ ")
36 option_->style_checked =
"(*)";
37 if (option_->style_unchecked ==
"○ ")
38 option_->style_unchecked =
"( )";
40 hovered_ = *selected_;
46 bool is_menu_focused = Focused();
47 boxes_.resize(entries_.size());
48 for (
size_t i = 0; i < entries_.size(); ++i) {
49 bool is_focused = (focused_entry() == int(i)) && is_menu_focused;
50 bool is_selected = (hovered_ == int(i));
52 auto style = is_selected ? (is_focused ? option_->style_selected_focused
53 : option_->style_selected)
54 : (is_focused ? option_->style_focused
55 : option_->style_normal);
56 auto focus_management = !is_selected ?
nothing
57 : is_menu_focused ?
focus
60 const std::string& symbol = *selected_ == int(i)
61 ? option_->style_checked
62 : option_->style_unchecked;
63 elements.push_back(
hbox(
text(symbol),
text(entries_[i]) | style) |
64 focus_management |
reflect(boxes_[i]));
69 bool OnEvent(Event event)
override {
70 if (!CaptureMouse(event))
74 return OnMouseEvent(event);
77 int old_hovered = hovered_;
83 hovered_ = (hovered_ + 1) % entries_.size();
85 hovered_ = (hovered_ + entries_.size() - 1) % entries_.size();
87 hovered_ = std::max(0, std::min(
int(entries_.size()) - 1, hovered_));
89 if (hovered_ != old_hovered) {
90 focused_entry() = hovered_;
96 if (event == Event::Character(
' ') || event ==
Event::Return) {
97 *selected_ = hovered_;
105 bool OnMouseEvent(Event event) {
108 return OnMouseWheel(event);
111 for (
int i = 0; i < int(boxes_.size()); ++i) {
112 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y))
119 if (*selected_ != i) {
121 option_->on_change();
130 bool OnMouseWheel(Event event) {
131 if (!box_.Contain(event.mouse().x, event.mouse().y))
134 int old_hovered = hovered_;
141 hovered_ = std::max(0, std::min(
int(entries_.size()) - 1, hovered_));
143 if (hovered_ != old_hovered)
144 option_->on_change();
149 bool Focusable() const final {
return entries_.size(); }
150 int& focused_entry() {
return option_->focused_entry(); }
152 ConstStringListRef entries_;
155 std::vector<Box> boxes_;
157 Ref<RadioboxOption> option_;
An adapter. Reference a list of strings.
An adapter. Own or reference an mutable object.
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
Element hbox(Elements)
A container displaying elements horizontally one by one.
std::vector< Element > Elements
Element text(std::wstring text)
Display a piece of unicode text.
Decorator reflect(Box &box)
void Render(Screen &screen, const Element &node)
Display an element on a ftxui::Screen.
std::shared_ptr< ComponentBase > Component
Element vbox(Elements)
A container displaying elements vertically one by one.
static const Event TabReverse
static const Event ArrowUp
static const Event ArrowDown
static const Event Return