44 class Impl :
public ComponentBase,
public DropdownOption {
46 explicit Impl(DropdownOption option) : DropdownOption(std::move(option)) {
48 checkbox_ = Checkbox(checkbox);
49 radiobox_ = Radiobox(radiobox);
51 container_ = Container::Vertical({
53 Maybe(radiobox_, checkbox.checked),
60 util::clamp(radiobox.selected(), 0,
int(radiobox.entries.size()) - 1);
61 selected_ = util::clamp(selected_(), 0,
int(radiobox.entries.size()) - 1);
63 if (selected_() >= 0 && selected_() <
int(radiobox.entries.size())) {
64 title_ = radiobox.entries[selected_()];
71 if (open() && !Focused()) {
72 container_->SetActiveChild(checkbox_);
76 return transform(*open, checkbox_->Render(), radiobox_->Render());
80 bool OnEvent(ftxui::Event event)
override {
81 const bool open_old = open();
82 const int selected_old = selected_();
83 bool handled = ComponentBase::OnEvent(event);
86 if (!open_old && open()) {
87 radiobox_->TakeFocus();
92 if (open_old && open()) {
93 const bool should_close =
94 (selected_() != selected_old) ||
95 (event == Event::Return) ||
96 (
event == Event::Character(
' ')) ||
97 (event == Event::Escape) ||
98 (
event.is_mouse() && event.mouse().button == Mouse::Left &&
99 event.mouse().motion == Mouse::Pressed);
102 checkbox_->TakeFocus();
114 if (!IsExternal(open) &&
115 (IsExternal(checkbox.checked) || checkbox.checked())) {
116 open = checkbox.checked;
118 selected_ = radiobox.selected;
119 checkbox.checked = &*open;
120 radiobox.selected = &*selected_;
121 checkbox.label = &title_;
123 if (!checkbox.transform) {
124 checkbox.transform = [](
const EntryState& s) {
125 auto prefix = text(s.state ?
"↓ " :
"→ ");
126 auto t = text(s.label);
133 return hbox({prefix, t});
138 transform = [](
bool is_open,
Element checkbox_element,
141 const int max_height = 12;
143 std::move(checkbox_element),
145 std::move(radiobox_element) | vscroll_indicator | frame |
150 return vbox({std::move(checkbox_element), filler()}) | border;