26 class 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_;
97 *selected_ = hovered_;
105 bool OnMouseEvent(Event event) {
106 if (!CaptureMouse(event))
111 return OnMouseWheel(event);
114 for (
int i = 0; i < int(boxes_.size()); ++i) {
115 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y))
122 if (*selected_ != i) {
124 option_->on_change();
133 bool OnMouseWheel(Event event) {
134 if (!box_.Contain(event.mouse().x, event.mouse().y))
137 int old_hovered = hovered_;
144 hovered_ = std::max(0, std::min(
int(entries_.size()) - 1, hovered_));
146 if (hovered_ != old_hovered)
147 option_->on_change();
152 bool Focusable() const final {
return entries_.size(); }
153 int& focused_entry() {
return option_->focused_entry(); }
155 ConstStringListRef entries_;
158 std::vector<Box> boxes_;
160 Ref<RadioboxOption> option_;
196 return Make<RadioboxBase>(entries, selected, std::move(option));