24 class MenuBase :
public ComponentBase {
26 MenuBase(ConstStringListRef entries,
int* selected, Ref<MenuOption> option)
27 : entries_(entries), selected_(selected), option_(option) {}
31 bool is_menu_focused =
Focused();
32 boxes_.resize(entries_.size());
33 for (
size_t i = 0; i < entries_.size(); ++i) {
34 bool is_focused = (focused_entry() == int(i)) && is_menu_focused;
35 bool is_selected = (*selected_ == int(i));
37 auto style = is_selected ? (is_focused ? option_->style_selected_focused
38 : option_->style_selected)
39 : (is_focused ? option_->style_focused
40 : option_->style_normal);
41 auto focus_management = !is_selected ?
nothing
42 : is_menu_focused ?
focus
44 auto icon = is_selected ?
"> " :
" ";
45 elements.push_back(
text(icon + entries_[i]) | style | focus_management |
51 bool OnEvent(Event event)
override {
56 return OnMouseEvent(event);
59 int old_selected = *selected_;
65 *selected_ = (*selected_ + 1) % entries_.size();
67 *selected_ = (*selected_ + entries_.size() - 1) % entries_.size();
69 *selected_ = std::max(0, std::min(
int(entries_.size()) - 1, *selected_));
71 if (*selected_ != old_selected) {
72 focused_entry() = *selected_;
86 bool OnMouseEvent(Event event) {
89 return OnMouseWheel(event);
98 for (
int i = 0; i < int(boxes_.size()); ++i) {
99 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y))
106 if (*selected_ != i) {
108 option_->on_change();
116 bool OnMouseWheel(Event event) {
117 if (!box_.Contain(event.mouse().x, event.mouse().y))
119 int old_selected = *selected_;
126 *selected_ = std::max(0, std::min(
int(entries_.size()) - 1, *selected_));
128 if (*selected_ != old_selected)
129 option_->on_change();
133 bool Focusable() const final {
return entries_.size(); }
134 int& focused_entry() {
return option_->focused_entry(); }
137 ConstStringListRef entries_;
139 Ref<MenuOption> option_;
141 std::vector<Box> boxes_;
176 return Make<MenuBase>(entries, selected, std::move(option));
183 : label_(std::move(label)), option_(std::move(option)) {}
187 bool focused = Focused();
188 auto style = hovered_ ? (focused ? option_->style_selected_focused
189 : option_->style_selected)
190 : (focused ? option_->style_focused
191 : option_->style_normal);
193 auto label = focused ?
"> " + (*label_)
195 return text(label) | style | focus_management |
reflect(box_);
197 bool Focusable()
const override {
return true; }
198 bool OnEvent(
Event event)
override {
202 hovered_ = box_.Contain(event.
mouse().
x, event.
mouse().
y);
218 bool hovered_ =
false;
221 return Make<Impl>(std::move(label), std::move(option));